Listas enlazadas en C: matrícula e anulación de alumnos
Función frealizar_matriculas
//frealizar_matriculas: Función que inserta un alumno en la lista simple
struct nodo * frealizar_matriculas(struct nodo *pprimer)
{//Declaración de variables
char res; long int nro_ma; struct nodo *pnuevo, *paux, *panterior; int i;
//Operaciones
do{nro_ma = fpedir_nro_ma(); //Pedir alumno
if (pprimer != NULL)//Si lista no vacía, buscar alumno
{panterior = fbuscar_alum(nro_ma,pprimer,&paux);
if(paux != NULL && paux->alum.nro_ma == nro_ma)
{printf("\nEl alumno con nº de matrícula %ld ya existe",nro_ma); goto otro;} }
pnuevo=(struct nodo*)malloc(sizeof(struct nodo));//Pedir memoria para el nuevo alumno
if(pnuevo==NULL){puts("\nNo se puede guardar el alumno");break;}
pnuevo->alum.nro_ma = nro_ma;
fpedir_nom(pnuevo->alum.nom);
pnuevo->alum.nro_asig = fpedir_nro_asig();
for(i=0;i < pnuevo->alum.nro_asig;i++)
{pnuevo->alum.vasig[i].cod_asig = fpedir_cod_asig();
pnuevo->alum.vasig[i].nota = 0;}
if (pprimer==NULL)//Si lista vacía
{pprimer = pnuevo;
pnuevo->psig = NULL; }else
if (paux == NULL)//Inserción por el final de la lista
{panterior->psig = pnuevo;
pnuevo->psig = NULL;}
else if ( paux == pprimer)//Inserción por el principio de la lista
{ pprimer = pnuevo;
pnuevo->psig = paux;}
else //Inserción por el medio de la lista
{panterior->psig = pnuevo;
pnuevo->psig = paux;}
//Preguntar si quiere continuar
otro: puts("\n¿Quieres realizar otra matrícula?");fflush(stdin); res = getchar();
}while(res=='s' || res=='S');
puts("\n\nFinal del proceso de matriculación\n"); return(pprimer); }
Función fanular_matriculas
//fanular_matriculas: Función que anula matrículas
struct nodo * fanular_matriculas(struct nodo *pprimer)
{//Declaración de variables
char res; long int nro_ma; struct nodo *panterior, *paux;
//Procesos
do{//Comprueba si la lista está vacía
if (pprimer == NULL) { puts("\nLa lista está vacía"); break;}
//Pide la matrícula a dar de baja y lo busca en la lista
nro_ma = fpedir_nro_ma();
panterior = fbuscar_alum(nro_ma,pprimer,&paux);
//Si existe el alumno en la lista
if (paux != NULL && paux->alum.nro_ma == nro_ma)
{ printf("\n¿Quiere borrar el alumno %s con número de matrícula %ld?\n",
paux->alum.nom,paux->alum.nro_ma);
fflush(stdin); res = getchar();
if (res != 'S' && res != 's'){ puts("\nEl alumno no ha sido borrado");goto otro;}
//Borrar por el principio de la lista
if ( paux == pprimer) pprimer = paux->psig;
else //Borrar por el medio y por el final de la lista
panterior->psig = paux->psig;
free(paux);
puts("\nEl alumno ya ha sido borrado"); }
else //Si el alumno no existe en la lista
printf("\nLa matrícula nº %ld no está en memoria",nro_ma);
//Preguntar si quiere continuar
otro: puts("\n¿Quieres anular otra matrícula?");
fflush(stdin); res = getchar();
}while(res=='s' || res=='S');
puts("\n\nFinal del proceso de anulación de matrículas\n");
return(pprimer);}