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; }