// ESTE PROGRAMA MANEJA DOS LISTA ENCADENADAS // Lista Lista1ASI y Lista2ASI con datos de alumnos // - Rellena ambas lista a partir de datos de prueba de sendas tablas T1ASI y T2ASI // - Borra de Lista2ASI los alumnos aprobados // - Transfiere a lista2ASI los alumnos de lista1ASI aprobados #include #include typedef enum { FALSE, TRUE } boolean; typedef struct { char nombre[30]; int nota; } TIPOALUMNO; struct sele { TIPOALUMNO valor; struct sele *sig; }; typedef struct sele Elemento; // Tablas con datos de prueba TIPOALUMNO T1ASI[7]= { {"Pepe",5}, {"Juan Luis",2 }, {"Ana",8 }, {"Borga Mari",3}, {"Pedro Luis",4}, {"Angel",10}, {"Luis Miguel",3}, }; TIPOALUMNO T2ASI[7]= { {"RAUL",5}, {"PEDRO LUIS",2}, {"SILVIA",8 }, {"ANA MARIA",3}, {"JOSE MARIA",4}, {"ANDRES",7}, {"EVA",8} }; // Función de Auxilir para probar el ejercicios copiada de listaencadenaM.c boolean PonAlPrincipio (Elemento **PBase, TIPOALUMNO Dato) { Elemento *pnuevo; boolean resu; resu = FALSE; pnuevo = malloc( sizeof(Elemento) ); if ( pnuevo != NULL ) { pnuevo->sig = *PBase; pnuevo->valor = Dato; *PBase = pnuevo; resu = TRUE; } return resu; } // Muestro el contenido de la lista void VerLista ( Elemento *plista ) { while ( plista != NULL ) { printf(" %-20s :%d\n",plista->valor.nombre,plista->valor.nota ); plista = plista->sig; } } void main () { Elemento *Lista1ASI; Elemento *Lista2ASI; Elemento *paux1,*paux2; int i; // Relleno la listas con datos de prueba Lista1ASI = NULL; Lista2ASI = NULL; for (i=0;i<7;i++) { PonAlPrincipio(&Lista1ASI, T1ASI[i] ); } for (i=0;i<7;i++) { PonAlPrincipio(&Lista2ASI, T2ASI[i] ); } puts("PRIMERO:"); VerLista(Lista1ASI); puts("SEGUNDO:"); VerLista(Lista2ASI); getchar(); //1.- Borrar de lista2ASI los aprobados // Borro los primeros hasta encontrar alguno no aprobado // Se supone que debe existir un alumno como mínimo while ( (Lista2ASI->valor.nota >= 5) && (Lista2ASI->sig != NULL) ) { paux1 = Lista2ASI; Lista2ASI = Lista2ASI -> sig; free(paux1); } // Si he salido porque Lista2ASI->sig == NULL y hay que borrar el elemento // ALgo rato todos estarian aprobados if ( Lista2ASI->valor.nota >= 5 ) { paux1 = Lista2ASI; Lista2ASI = Lista2ASI -> sig; free(paux1); } else { paux1 = Lista2ASI; paux2 = Lista2ASI->sig; while ( paux2 != NULL ) { if ( paux2->valor.nota >= 5 ) { paux1->sig = paux2->sig; free(paux2); paux2 = paux1->sig; } else { paux1 = paux2; paux2 = paux2->sig; } } } // 2.- Transladar los aprobados de Lista1ASI a Lista2ASI // Es el mismo algorimo pero añadiendo en lugar de borrar while ( (Lista1ASI->valor.nota >= 5) && (Lista1ASI->sig != NULL) ) { paux1 = Lista1ASI; Lista1ASI = Lista1ASI -> sig; // Añado el elemento a Lista2ASI paux1->sig = Lista2ASI; Lista2ASI = paux1; } // Si he salido porque Lista1ASI->sig == NULL y hay que borrar el elemento // Algo raro todos pasarian a la segunda lista if ( Lista1ASI->valor.nota >= 5 ) { paux1 = Lista1ASI; Lista1ASI = Lista1ASI -> sig; // Añado el elemento a Lista2ASI paux1->sig = Lista2ASI; Lista2ASI = paux1; } else { paux1 = Lista1ASI; paux2 = Lista1ASI->sig; while ( paux2 != NULL ) { if ( paux2->valor.nota >= 5 ) { paux1->sig = paux2->sig; // Añado a lista2ASI paux2->sig = Lista2ASI; Lista2ASI = paux2; // paux2 señala al siguiente paux2 = paux1->sig; } else { paux1 = paux2; paux2 = paux2->sig; } } } puts("PRIMERO:"); VerLista(Lista1ASI); puts("SEGUNDO:"); VerLista(Lista2ASI); getchar(); }