Hola,
Mi problema es el siguiente:
He realizado una lista bidireccional y a la hora de insertar un dato dentro de ella, me da un error de segmentación. He utilizado gdb para ver donde se encuentra este error, y me dice lo siguiente:
Program received signal SIGSEGV, Segmentation fault.
0x000000000040074d in insertar_detras (l=0x7fffffffe230, element=3)
at Listadin.c:55
55 temporal->next->prev=temporal;
_____________________________________________________________________
Os dejo aquí el código de la lista, a ver si me podéis decir donde está el error, que no encuentro..
#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!\n");
}else{
l->last=(nodo *)malloc(sizeof(nodo));
if (l->last == NULL){
printf("Error!\n");
}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!\n");
}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 ---------\n");
printf("1. Crear Lista\n");
printf("2. Insertar datos Detras\n");
printf("3. Insertar datos delante\n");
printf("4. Consulta un elemento\n");
printf("5. Exit\n");
printf("Escoja una opcion:\n");
scanf("%d",&opcion);
printf("La opcion que ha escogido es:\n",opcion);
switch(opcion)
{
case 1:
crear_lista(&l);
printf("Lista creada\n");
break;
case 2:
printf("Numero a introducir:\n");
scanf("%d",&element);
insertar_detras(&l,element);
break;
case 3:
break;
case 4:
break;
case 5:
salir=1;
printf("EXIT\n");
break;
default:
printf("La opcion introducida no existe\n");
printf("Vuelva a intentarlo\n");
}
}
Muchas Gracias, y espero que me podáis echar una mano.
Un Saludo!
Mi problema es el siguiente:
He realizado una lista bidireccional y a la hora de insertar un dato dentro de ella, me da un error de segmentación. He utilizado gdb para ver donde se encuentra este error, y me dice lo siguiente:
Program received signal SIGSEGV, Segmentation fault.
0x000000000040074d in insertar_detras (l=0x7fffffffe230, element=3)
at Listadin.c:55
55 temporal->next->prev=temporal;
_____________________________________________________________________
Os dejo aquí el código de la lista, a ver si me podéis decir donde está el error, que no encuentro..
#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!\n");
}else{
l->last=(nodo *)malloc(sizeof(nodo));
if (l->last == NULL){
printf("Error!\n");
}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!\n");
}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 ---------\n");
printf("1. Crear Lista\n");
printf("2. Insertar datos Detras\n");
printf("3. Insertar datos delante\n");
printf("4. Consulta un elemento\n");
printf("5. Exit\n");
printf("Escoja una opcion:\n");
scanf("%d",&opcion);
printf("La opcion que ha escogido es:\n",opcion);
switch(opcion)
{
case 1:
crear_lista(&l);
printf("Lista creada\n");
break;
case 2:
printf("Numero a introducir:\n");
scanf("%d",&element);
insertar_detras(&l,element);
break;
case 3:
break;
case 4:
break;
case 5:
salir=1;
printf("EXIT\n");
break;
default:
printf("La opcion introducida no existe\n");
printf("Vuelva a intentarlo\n");
}
}
Muchas Gracias, y espero que me podáis echar una mano.
Un Saludo!