// Módulo pricipal: mainLista.cpp // Programa que crea una lista ordenada de datos con punteros void. // La lista almacena los registros de alumnos. Los campos están formados por: // Codigo (Valor entero) // Nombre (ApPat/ApMat/Nombre) // Especialidad (Valor entero) // Escala de pagos (Valor entero) // Número de créditos aprobados #include #include "Ficha.h" #include "Lista.h" int main(void) { void **lista=NULL, **nodo; while (1){ nodo = leeFicha(); if (nodo==NULL) break; insertar(lista, nodo); //Lista ordenada por el nombre } mostrar(lista); eliminar(lista); return 0; } // Archivo de cabecera: Ficha.h #ifndef _FICHA_H #define _FICHA_H void **leeFicha(void); void imprimeFicha(void **); void eliminaFicha(void**); void flushIn(void); #endif /* _FICHA_H */ // Módulo para manejar una ficha de datos #include #include #include "Ficha.h" void **leeFicha(void){ int *ptrInt; double *ptrDoub; char auxCad[500], *cad; void **ficha; ptrInt= new int; printf("Ingrese el codigo (Cero(0)=FIN): "); scanf("%d",ptrInt); if (*ptrInt==0){ delete ptrInt; return NULL; } ficha=new void*[6]; ficha[0] = ptrInt; flushIn(); // Limpiamos el buffer de entrada printf("Ingrese el nombre: (APat/AMat/Nomb)"); gets(auxCad); cad = new char[strlen(auxCad)+1]; strcpy(cad, auxCad); ficha[1] = cad; printf("Ingrese la especialidad: "); gets(auxCad); cad = new char[strlen(auxCad)+1]; strcpy(cad,auxCad); ficha[2] = cad; ptrInt = new int; printf("Ingrese la escala de pago: "); scanf("%d",ptrInt); ficha[3] = ptrInt; ptrDoub = new double; printf("Ingrese los creditos aprobados: "); scanf("%lf",ptrDoub); ficha[4] = ptrDoub; ficha[5]=NULL; return ficha; } void imprimeFicha(void **ficha){ int *codigo, *escala; char *nombre, *especialid; double *creditos; codigo = (int*)(ficha[0]); nombre = (char*)(ficha[1]); especialid = (char*)(ficha[2]); escala = (int*)(ficha[3]); creditos = (double*)(ficha[4]); printf("\nCodigo: %d\n", *codigo); printf("Nombre: %-30s\n", nombre); printf("Especialidad: %-30s\n", especialid); printf("Escala de pago: %d\n", *escala); printf("Creditos aprobados: %3.1lf\n", *creditos); } void eliminaFicha(void**ficha){ int *codigo, *escala; char *nombre, *especialid; double *creditos; codigo = (int*)(ficha[0]); nombre = (char*)(ficha[1]); especialid = (char*)(ficha[2]); escala = (int*)(ficha[3]); creditos = (double*)(ficha[4]); delete codigo; delete nombre; delete especialid; delete escala; delete creditos; } void flushIn(void){ while(getchar()!='\n'); } // Archivo de cabecera: Lista.h #ifndef _LISTA_H #define _LISTA_H void insertar(void **&, void **); void mostrar(void **); void eliminar(void **&); #endif /* _LISTA_H */ // Módulo de trabajo con la lista: Lista.cpp #include #include "Ficha.h" void insertar(void **&lista, void **ficha){ void **p=lista, **ant=NULL; while(p){ // la lista se ordenada por nombre if(strcmp((char*)p[1],(char*)ficha[1])>0)break; ant = p; p = (void**)p[5]; // La operación "cast" se debe hacer // por que p no es un puntero genérico(es void **). } ficha[5] = p; // Aquí no se requiere la operción "cast" por // que ficha[5] es un puntero genérico (es void *). if (ant!=NULL) ant[5]=ficha; else lista=ficha; } void mostrar(void **lista){ while (lista){ imprimeFicha(lista); lista = (void **)lista[5]; } } void eliminar(void **&lista){ void **sale; while (lista){ sale = lista; lista = (void **)lista[5]; eliminaFicha(sale); delete sale; } }