• Martes 19 de Noviembre de 2024, 00:35

Autor Tema:  Lista doblemente enlazada circular[SOL]  (Leído 2466 veces)

Leber

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Lista doblemente enlazada circular[SOL]
« en: Martes 16 de Diciembre de 2008, 17:52 »
0
Buenas a todos, tengo una duda al liberar una lista doblemente enlazada circular:

Aqui os adjunto el codigo que tengo:

Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct __double_list
  5. {
  6.         int num;
  7.         struct __double_list *next,
  8.                              *prev;
  9. };
  10.  
  11. int __creat_head(struct __double_list **list);
  12. int __insert(struct __double_list **list, int __number);
  13. void show(struct __double_list *head);
  14. void destroy(struct __double_list **list);
  15.  
  16. int
  17. main()
  18. {
  19.  
  20.         struct __double_list *__list = NULL;
  21.         int __number_to_put;
  22.  
  23.         if( (__creat_head(&__list)) != 0)
  24.                 return -1;
  25.  
  26.         for( __number_to_put = 0 ; __number_to_put < 5 ; __number_to_put++)
  27.         {
  28.                 if( (__insert(&__list, __number_to_put)) != 0)
  29.                 {
  30.                         printf("Error de memn");
  31.                         return -1;
  32.                 }
  33.  
  34.         }
  35.  
  36.         show(__list);
  37.         destroy(&__list);
  38.         //show(__list); Es para probar si esta bien liberada
  39.         return 0;
  40.  
  41. }
  42.  
  43. int __creat_head(struct __double_list **list)
  44. {
  45.         *list = (struct __double_list *)malloc(sizeof(struct __double_list));
  46.  
  47.         if(*list == NULL)
  48.         {
  49.                 perror("Error de mem");
  50.                 return -1;
  51.         }
  52.  
  53.         (*list)->next = (*list)->prev = *list;
  54.  
  55.         return 0;
  56. }
  57.  
  58. int __insert(struct __double_list **list, int __number)
  59. {
  60.         struct __double_list *new;
  61.  
  62.         new = (struct __double_list *)malloc(sizeof(struct __double_list));
  63.  
  64.         if(new == NULL)
  65.         {
  66.                 perror("Error new");
  67.                 return -1;
  68.         }
  69.  
  70.         printf("Number-> %dn",__number);
  71.  
  72.  
  73.         new->num = __number;
  74.         new->next = *list;
  75.         new->prev = (*list)->prev;
  76.         (*list)->prev->next = new;
  77.         (*list)->prev = new;
  78.  
  79.         return 0;
  80. }
  81.  
  82. void show(struct __double_list *head)
  83. {
  84.         struct __double_list *node;
  85.  
  86.         node = head->next;
  87.  
  88.         while(node != head)
  89.         {
  90.                 printf("Node num->%dn",node->num);
  91.                 node = node->next;      
  92.         }
  93. }
  94.  
  95. void destroy(struct __double_list **list)
  96. {
  97.         struct __double_list *node, *aux;
  98.  
  99.         node = (*list)->next;
  100.  
  101.         while(node != *list)    
  102.         {
  103.                 aux = node;
  104.                 node = node->next;
  105.                 free(aux);
  106.         }      
  107.         *list = NULL;
  108. }
  109.  

No me convence, porque si vuelvo a mostrar la lista, me muestro 20 veces numeros muy extraños, cuando no deberia de mostrar nada, deberia salir del bucle y ya esta, es por eso que creo que esta mal la funcion de borrar la lista.

A ver si me podeis echar un cable;

Gracias de antemano & saludos


----------------

Ya lo solucione, fue un fallo bastante grave, jeje, al final la funcion quedo asi:

Código: Text
  1. void destroy(struct __double_list **list)
  2. {
  3.         struct __double_list *node, *aux;
  4.  
  5.         node = (*list)->next;
  6.  
  7.         while(node != *list)    
  8.         {
  9.                 aux = node;
  10.                 aux->next->prev = aux->prev;
  11.                 aux->prev->next = aux->next;
  12.                 node = node->next;
  13.                 free(aux);
  14.         }      
  15.         *list = NULL;
  16. }
  17.  

Gracias