elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lista doblemente ligada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lista doblemente ligada  (Leído 2,164 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Lista doblemente ligada
« en: 14 Noviembre 2013, 23:54 pm »

Saludos tengo una lista doblemente ligada que me inserta por la cabeza, por el final, despues y antes de un elemento que se le pide al usuario, todavia no esta terminado pero el problema que tengo es con el caso de insertar antes de un elemento dado, que me truena el programa y no entiendo por que, creo que el problema es que una vez que le pido al usuario el numero antes del que quiero ingresar mando llamar a la funcion anterior

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define INSERTAR_CABEZA 1
  4. #define INSERTAR_ANTES 2
  5. #define INSERTAR_DESPUES 3
  6. #define INSERTAR_FINAL 4
  7. #define SALIR 5
  8.  
  9. typedef struct nodo
  10. {
  11.    int elemento;
  12.    struct nodo *sig;
  13.    struct nodo *ant;
  14. }Nodo;
  15.  
  16. Nodo *crearNodo(int insertable);
  17. void insertarCabeza(int insertable,Nodo **cabeza);
  18. void insertar_antes(Nodo *anterior,int insertable);
  19. void insertar_despues(Nodo *posterior,int insertable);
  20. void insertarFinal(Nodo *ultimo,int insertable);
  21. Nodo *buscarElemento(int elementoBuscado,Nodo *cabeza);
  22. void imprimirLista(Nodo *cabeza);
  23. Nodo *ultimoElemento(Nodo *cabeza);
  24. Nodo *Anterior(Nodo *p);
  25.  
  26. int main()
  27. {
  28.    Nodo *cabeza,*anterior,*posterior,*p,*ultimo;
  29.    cabeza = NULL;
  30.    int continuar = 1,opcion,numElementos,insertable,elementoBuscado,i;
  31.    printf("Lista Doblemente Enlazada!\n\n");
  32.    do
  33.    {
  34.        printf("\nMenu\n");
  35.        printf("1) Insertar cabeza de Lista\n");
  36.        printf("2) Insertar antes de elementento\n");
  37.        printf("3) Insertar despues de elemento\n");
  38.        printf("4) Insertar final de Lista\n");
  39.        printf("5) Salir\n");
  40.        scanf("%d",&opcion);
  41.        switch(opcion)
  42.        {
  43.            case INSERTAR_CABEZA:
  44.               printf("Dame el numero de elementos de la lista: ");
  45.               scanf("%d",&numElementos);
  46.               for(i=0;i < numElementos;i++)
  47.               {
  48.                   printf("Dame el elemento a insertar: ");
  49.                   scanf("%d",&insertable);
  50.                   insertarCabeza(insertable,&cabeza);
  51.                   system("cls");
  52.               }
  53.               imprimirLista(cabeza);
  54.               break;
  55.            case INSERTAR_ANTES:
  56.               printf("Antes de que elemento se quiere insertar: ");
  57.               scanf("%d",&elementoBuscado);
  58.               if((p = buscarElemento(elementoBuscado,cabeza))!=NULL)
  59.               {
  60.                   printf("Dame el elemento a insertar: ");
  61.                   scanf("%d",&insertable);
  62.                   anterior = Anterior(p);
  63.                   insertar_antes(anterior,insertable);
  64.               }
  65.               else
  66.                  printf("No se encontro elemento!\n");
  67.               imprimirLista(cabeza);
  68.               break;
  69.            case INSERTAR_DESPUES:
  70.               printf("Despues de que elemento deseas insertar: ");
  71.               scanf("%d",&elementoBuscado);
  72.               if((posterior = buscarElemento(elementoBuscado,cabeza))!=NULL)
  73.               {
  74.                   printf("Dame el elemento a insertar: ");
  75.                   scanf("%d",&insertable);
  76.                   insertar_despues(posterior,insertable);
  77.               }
  78.               else
  79.                  printf("No se encontro elemento!\n");
  80.               imprimirLista(cabeza);
  81.               break;
  82.            case INSERTAR_FINAL:
  83.               printf("Dame el numero de elementos de la lista: ");
  84.               scanf("%d",&numElementos);
  85.               if(estaVacia(cabeza))
  86.               {
  87.                   printf("Dame el elemento a insertar: ");
  88.                   scanf("%d",&insertable);
  89.                   cabeza = crearNodo(insertable);
  90.                   numElementos--;
  91.               }
  92.               for(i = 0;i < numElementos;i++)
  93.               {
  94.                   ultimo = ultimoElemento(cabeza);
  95.                   printf("Dame el elemento a insertar: ");
  96.                   scanf("%d",&insertable);
  97.                   insertarFinal(ultimo,insertable);
  98.               }
  99.               imprimirLista(cabeza);
  100.               break;
  101.            case SALIR:
  102.               continuar = 0;
  103.               break;
  104.        }
  105.        if(continuar)
  106.            system("pause");
  107.    }while(continuar);
  108.    return 0;
  109. }
  110.  
  111. Nodo *crearNodo(int insertable)
  112. {
  113.    Nodo *p;
  114.    p = (Nodo*)malloc(sizeof(Nodo));
  115.    p->elemento = insertable;
  116.    p->sig = NULL;
  117.    p->ant = NULL;
  118.    return p;
  119. }
  120.  
  121. void insertarCabeza(int insertable,Nodo **cabeza)
  122. {
  123.    Nodo *nuevo;
  124.    nuevo = crearNodo(insertable);
  125.    nuevo->sig = *cabeza;
  126.    nuevo->ant = NULL;
  127.    *cabeza = nuevo;
  128. }
  129.  
  130. void insertar_antes(Nodo *anterior,int insertable)
  131. {
  132.    Nodo *nuevo;
  133.    nuevo = crearNodo(insertable);
  134.    anterior->sig->ant = nuevo;
  135.    nuevo->ant = anterior;
  136.    nuevo->sig = anterior->sig;
  137.    anterior->sig = nuevo;
  138. }
  139.  
  140. void insertar_despues(Nodo *posterior,int insertable)
  141. {
  142.    Nodo *nuevo;
  143.    nuevo = crearNodo(insertable);
  144.    posterior->sig->ant = nuevo;
  145.    nuevo->ant = posterior;
  146.    nuevo->sig = posterior->sig;
  147.    posterior->sig = nuevo;
  148. }
  149.  
  150. void insertarFinal(Nodo *ultimo,int insertable)
  151. {
  152.    ultimo->sig = crearNodo(insertable);
  153.    ultimo->sig->sig = NULL;
  154.    ultimo->sig->ant = ultimo;
  155. }
  156.  
  157. void imprimirLista(Nodo *cabeza)
  158. {
  159.    Nodo *ptr;
  160.    for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig)
  161.       printf("%d\t",ptr->elemento);
  162. }
  163.  
  164. Nodo *buscarElemento(int elementoBuscado,Nodo *cabeza)
  165. {
  166.    Nodo *ptr;
  167.    for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig)
  168.    {
  169.        if(ptr->elemento == elementoBuscado)
  170.           return ptr;
  171.    }
  172.    return NULL;
  173. }
  174.  
  175. Nodo *ultimoElemento(Nodo *cabeza)
  176. {
  177.    Nodo *ptr;
  178.    ptr = cabeza;
  179.    while(ptr->sig!=NULL)
  180.       ptr = ptr->sig;
  181.    return ptr;
  182. }
  183.  
  184. int estaVacia(Nodo *cabeza)
  185. {
  186.    if(cabeza == NULL)
  187.       return 1;
  188.    else
  189.       return 0;
  190. }
  191.  
  192. Nodo *Anterior(Nodo *p)
  193. {
  194.    return p->ant;
  195. }
  196.  

gracias


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Lista doblemente ligada
« Respuesta #1 en: 18 Noviembre 2013, 17:13 pm »

El programa revienta en el caso que mencionas porque cuando agregas un elemento como primero debes actualizar (si la lista no esta vacía) el campo "ant" del nodo "cabeza", de esta forma:
Código
  1. void insertarCabeza(int valor,Nodo **cabeza)
  2. {
  3.   Nodo *nuevo;
  4.  
  5.   nuevo = crearNodo(valor);
  6.   nuevo->sig = *cabeza;
  7.   nuevo->ant = NULL;
  8.  
  9.   if (*cabeza != NULL)
  10.      (*cabeza)->ant = nuevo;
  11.   *cabeza = nuevo;
  12. }

Otros dos escenarios donde el programa revienta son:
* Insertar antes del primer elemento.
* Insertar después del ultimo elemento.
La razón es similar: debes verificar si el elemento anterior/posterior existe antes de tratar de realizar los cambios y en el caso de la inserción antes de un nodo debes verificar si ello requiere la actualización del puntero al primer nodo (la variable "cabeza").

Por ultimo deberías eliminar la función "anterior" y rescribir las funciones "insertar_antes" e "insertar_despues" desde cero ya que son un dolor de cabeza y su código es idéntico.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines