RESPONDER UNA PREGUNTA

Si para responder la pregunta, crees necesario enviar un archivo adjunto, puedes hacerlo a traves del correo [email protected]

    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!


Nombre
Apellidos
Correo
Comentarios