Que tal metal_boy.
En la función insertarDLC falta dar espacio en memoria para nombre y apellido del nodo "aux", también hay un error al copiar las cadenas, hay que usar strcpy.
Ahora, para que quede circular doblemente enlazada, cambié la forma en que se apuntan entre sí:
- el siguiente a aux es cab
- el anterior a aux es el anterior de cab.
Lo que falta es romper la cadena entre cab y su anterior, asi:
- El siguiente del anterior a cab ya no va a ser cab sino aux.
- El anterior a cab va a ser aux.
Aquí va el código:
Código:
void insertarDLC(NODODLC **cab,item *elem)
{ NODODLC *aux=(NODODLC*)malloc(sizeof(NODODLC));
aux->dato.nombre = (char*)malloc(30*sizeof(char));
aux->dato.apellido=(char*)malloc(30*sizeof(char));
strcpy(aux->dato.nombre,elem->nombre);
strcpy(aux->dato.apellido,elem->apellido);
aux->dato.boleta=elem->boleta;
aux->dato.calif=elem->calif;
aux->sig=*cab;
aux->ant=(*cab)->ant;
(*cab)->ant->sig=aux;
(*cab)->ant=aux;
}
Luego para imprimir, como es una lista circular no se llega a ningún NULL, lo que hay que hacer en el for es imprimir "ptr" hasta dar una vuelta, es decir, hasta que vuelta a ser "cab".
Código:
void imprimirDLC(NODODLC *cab)
{
NODODLC *ptr=cab;
int contador=1;
if(cab==NULL)
{
printf("La lista esta vacia");
return;
}
ptr=ptr->sig;
for(; ptr!=cab;ptr=ptr->sig,contador++)
{
printf("%d.-",contador);
printf("\tNombre: %s \n",ptr->dato.nombre);
printf("\tApellido: %s \n",ptr->dato.apellido);
printf("\tBoleta: %d \n",ptr->dato.boleta);
printf("\tCalificacion: %d \n",ptr->dato.calif);
}
}
Espero que esto ayude.
Saludos.