Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Areees777

#1
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!