Pregunta: | 68314 - LISTA BIDIRECCIONAL "VIOLACIÓN DE SEGMENTO" |
Autor: | Ares |
Hola, Mi problema es el siguiente: He realizado el código de una lista bidireccional en C y a la hora de insertar un elemento en la lista me da el siguiente error: (Para ver el error he utilizado gdb) Program received signal SIGSEGV, Segmentation fault. 0x000000000040074d in insertar_detras (l=0x7fffffffe230, element=3) at Listadin.c:55 55 temporal->next->prev=temporal; No sé que es lo que puede estar mal. Os dejo el código entero de mi lista. #include <stdio.h> #include <stdlib.h> typedef struct _nodo{ int element; struct _nodo *next; struct _nodo *prev; }nodo; typedef struct{ nodo *first; nodo *last; nodo *pdi; }lista; void crear_lista(lista *l){ l->first=(nodo *)malloc(sizeof(nodo)); if (l->first == NULL){ printf("Error! "); }else{ l->last=(nodo *)malloc(sizeof(nodo)); if (l->last == NULL){ printf("Error! "); }else{ l->first->next=l->last; l->last->prev=l->first; l->first->prev=NULL; l->last->next=NULL; l->pdi=l->last; } } } void insertar_detras(lista *l, int element){ nodo *temporal; temporal=(nodo *)malloc(sizeof(nodo)); if (temporal == NULL){ printf("Error! "); }else{ temporal->element=element; //1. Asigna el elemento nuevo al temporal (nodo nuevo que hemos creado) temporal->next=l->pdi->next; //2. La casilla "next" del nodo temporal apunta al siguiente de la lista l->pdi->next=temporal; temporal->next->prev=temporal; } } int main(void) { int salir=0, opcion; int element; int pos; lista l; while(salir==0){ printf("-------Lista dinámica --------- "); printf("1. Crear Lista "); printf("2. Insertar datos Detras "); printf("3. Insertar datos delante "); printf("4. Consulta un elemento "); printf("5. Exit "); printf("Escoja una opcion: "); scanf("%d",&opcion); printf("La opcion que ha escogido es: ",opcion); switch(opcion) { case 1: crear_lista(&l); printf("Lista creada "); break; case 2: printf("Numero a introducir: "); scanf("%d",&element); insertar_detras(&l,element); break; case 3: break; case 4: break; case 5: salir=1; printf("EXIT "); break; default: printf("La opcion introducida no existe "); printf("Vuelva a intentarlo "); } } return EXIT_SUCCESS; Gracias y espero que me podáis echar una mano! Un Saludo! |