Buenas a todos, tengo una duda al liberar una lista doblemente enlazada circular:
Aqui os adjunto el codigo que tengo:
#include <stdio.h>
#include <stdlib.h>
struct __double_list
{
int num;
struct __double_list *next,
*prev;
};
int __creat_head(struct __double_list **list);
int __insert(struct __double_list **list, int __number);
void show(struct __double_list *head);
void destroy(struct __double_list **list);
int
main()
{
struct __double_list *__list = NULL;
int __number_to_put;
if( (__creat_head(&__list)) != 0)
return -1;
for( __number_to_put = 0 ; __number_to_put < 5 ; __number_to_put++)
{
if( (__insert(&__list, __number_to_put)) != 0)
{
printf("Error de memn");
return -1;
}
}
show(__list);
destroy(&__list);
//show(__list); Es para probar si esta bien liberada
return 0;
}
int __creat_head(struct __double_list **list)
{
*list = (struct __double_list *)malloc(sizeof(struct __double_list));
if(*list == NULL)
{
perror("Error de mem");
return -1;
}
(*list)->next = (*list)->prev = *list;
return 0;
}
int __insert(struct __double_list **list, int __number)
{
struct __double_list *new;
new = (struct __double_list *)malloc(sizeof(struct __double_list));
if(new == NULL)
{
perror("Error new");
return -1;
}
printf("Number-> %dn",__number);
new->num = __number;
new->next = *list;
new->prev = (*list)->prev;
(*list)->prev->next = new;
(*list)->prev = new;
return 0;
}
void show(struct __double_list *head)
{
struct __double_list *node;
node = head->next;
while(node != head)
{
printf("Node num->%dn",node->num);
node = node->next;
}
}
void destroy(struct __double_list **list)
{
struct __double_list *node, *aux;
node = (*list)->next;
while(node != *list)
{
aux = node;
node = node->next;
free(aux);
}
*list = NULL;
}
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:
void destroy(struct __double_list **list)
{
struct __double_list *node, *aux;
node = (*list)->next;
while(node != *list)
{
aux = node;
aux->next->prev = aux->prev;
aux->prev->next = aux->next;
node = node->next;
free(aux);
}
*list = NULL;
}
Gracias