/* -------------------------------------------------------- */ /* Creación y recorrido de un fichero SECUENCIAL ENCADENADO */ /* -------------------------------------------------------- */ #include // Estructura con los datos typedef struct { char nombre[30]; int edad; int curso; int nota; } TIPOALUMNO; // Estructura completa Datos + campo enlace typedef struct { TIPOALUMNO reg; int enlace; // Campo de encademiento } TIPOREGISTRO_ENCADENADO; // El campo enlace puede tener los siguientes valores especiales // 0 - Siguiente registro en orden físico // -1 - Ultimo registro del encadenamiento // Tabla con datos de prueba TIPOREGISTRO_ENCADENADO talumnos[12] = { { {"ANA", 26, 1, 6}, 8}, { {"SONIA", 28, 2, 3}, 11}, { {"LUIS", 23, 1, 6}, 5}, { {"ELENA", 20, 2, 8}, 12}, { {"MARCOS", 26, 2, 9}, 10}, { {"OLGA", 23, 3, 6}, 0}, // Siguiente en orden físico { {"SILVI", 30, 2, 4}, 2}, { {"BEA", 24, 1, 7}, 0}, // Siguiente en orden físico { {"EDUARDO", 21, 3, 8}, 4}, { {"MIGUEL", 20, 3, 9}, 6}, { {"VICTOR", 26, 3, 10}, -1},// Ultimo en orden lógico { {"JUAN", 20, 1, 5}, 3} }; main () { FILE *fenc; TIPOREGISTRO_ENCADENADO ficha; fenc = fopen("ALUMNOS.DAT","wb+"); if ( fenc == NULL ) { perror("ALUMNOS.DAT"); return 1; } fwrite(talumnos,sizeof(TIPOREGISTRO_ENCADENADO),12,fenc); puts("...Fichero Grabado\n"); // Me situo al principio del fichero rewind(fenc); puts(" Recorrido ordenado:"); // RECORRIDO DE UN FICHERO SECUENCIAL ENCADENADO // Suponemos que debe existir por lo menos un registro y que este // debe ser el primero en secuencia lógica. fread(&ficha,sizeof(ficha),1,fenc); while ( ficha.enlace != -1 ) { printf(" %s\n",ficha.reg.nombre); // Si no es el siguiente, voy a la posicion indicada if ( ficha.enlace != 0 ) { // Voy a la posicion indicada por el enlace // Resto -1 porque la primera posición en la 0 fseek(fenc,(ficha.enlace -1)* sizeof(ficha), SEEK_SET); } fread(&ficha,sizeof(ficha),1,fenc); } // Muestro el último. printf(" %s\n",ficha.reg.nombre); getchar(); return 0; }