Estructura de dato tipo Hash

Anuncio
Estructura de dato tipo Hash
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MaxReg 127
typedef struct
{
char dni[9], nombre[31], dep[21];
int sueldo;
char ocupado;
}TipoR;
void crear(FILE * f)
{
int j;
TipoR r;
for( j = 0; j < MaxReg ; j++)
{
fseek(f, j * sizeof(TipoR), SEEK_SET);
r.ocupado = 'L';
fwrite(&r, sizeof(TipoR),1, f);
}
}
int transforma(const char* clave)
{
int j;
int d = 0;
for (j = 0; j < strlen(clave); j++)
{
d = d + clave[j]-'0';
}
return d;
}
int direccion(FILE * f, const char* clave)
{
int p, cont;
TipoR r;
int d;
d = transforma(clave);
// se aplica aritmética modular para obtener dirección base
p = d % MaxReg;
fseek(f, p * sizeof(TipoR), SEEK_SET);
fread(&r, sizeof(TipoR),1, f);
cont = 0;
while (r.ocupado == 'O' && cont < MaxReg)
{
p = p + 1;
p = p % MaxReg;
// considera el archivo circular
fseek(f, p * sizeof(TipoR), SEEK_SET);
fread(&r, sizeof(TipoR),1, f);
cont++;
}
if (cont == MaxReg)
p = -1;
return p;
}
int buscar(FILE * f, const char* clave)
{
TipoR r;
int p;
int d, cont;
int encontrado;
d = transforma(clave);
// se aplica aritmética modular para obtener dirección base
p = d % MaxReg;
cont = 1;
fseek(f, p * sizeof(TipoR), SEEK_SET);
fread(&r, sizeof(TipoR),1, f);
if (strcmp(r.dni,clave) == 0 && (r.ocupado == 'O'))
encontrado = 1;
else
{
encontrado = 0;
while (r.ocupado != 'L' && !encontrado && cont <= MaxReg)
{
fseek(f, p * sizeof(TipoR), SEEK_SET);
fread(&r, sizeof(TipoR),1, f);
if (strcmp(r.dni, clave) == 0 && (r.ocupado == 'O'))
encontrado = 1;
else
{
p = p + 1;
p = p % MaxReg;
/* considera array como circular */
cont = cont + 1;
}
}
}
if (! encontrado)
p = -1;
return p;
}
void insertar(FILE * f, TipoR r)
{
int p;
int posicion;
p = buscar(f, r.dni);
if (p == -1) //Si no esta busca una posicion de insercion
{
posicion = direccion(f, r.dni);
if (posicion != -1)
{
fseek(f, posicion * sizeof(TipoR), SEEK_SET);
r.ocupado = 'O';
fwrite(&r, sizeof(TipoR),1, f);
}
else
printf ("No hay sitio\n");
}
else
printf ("Ya existe\n");
}
void borrar(FILE * f, const char* clave)
{
int p;
TipoR r;
p = buscar(f, clave);
if (p != -1)
{
r.ocupado = 'B'; // marca el registro con estatus de baja
fseek(f, p * sizeof(TipoR), SEEK_SET);
fwrite(&r, sizeof(TipoR),1, f);
}
}
void salidaDatos(TipoR r)
{
printf("DNI: %s\n", r.dni);
printf("Nombre: %s\n", r.nombre);
printf("Departamento: %s\n", r.dep);
printf("Salario: %d\n", r.sueldo);
}
void consulta (FILE * f, const char* clave)
{
int p;
TipoR r;
p = buscar(f, clave);
if (p != -1)
{
fseek(f, p * sizeof(TipoR), SEEK_SET);
fread(&r, sizeof(TipoR),1, f);
salidaDatos(r);
}
else
printf("No esta\n");
}
void mostrar(FILE * f)
{
int i, n;
TipoR r;
fseek(f,0L, SEEK_END);
n = (int)ftell(f)/sizeof(TipoR);
for(i = 0 ;i <= n-1; i++)
{
fseek(f, i * sizeof(TipoR), SEEK_SET);
fread(&r, sizeof(TipoR),1, f);
if (r.ocupado == 'O')
{
printf("Posicion %d ",i);
printf("DNI: %s\n", r.dni);
}
}
}
int main ()
{
TipoR r;
char cod[9], pausa;
FILE* f;
f = fopen("Personal.dat","rb+");
if (f == NULL)
{
f = fopen("Personal.dat","wb+");
if (f == NULL)
{
puts("\nError en la operación de abrir archivo.");
exit(-1);
}
crear(f);
}
printf("Indique DNI y * para fin ");
gets(r.dni);
while (strcmp(r.dni,"*")!= 0)
{
printf ("Nombre ");
gets(r.nombre);
printf ("Departamento ");
gets(r.dep);
printf ("Salario ");
scanf("%d", &r.sueldo);
fflush(stdin);
insertar (f, r);
printf("\nIndique DNI y * para fin ");
gets(r.dni);
}
mostrar(f);
printf("\nIndique DNI a consultar ");
gets(cod);
consulta(f, cod);
fclose(f);
pausa = getc(stdin);
return 0;
}
Descargar