2016-10-12 7 views
0

J'ai du mal à supprimer tous les membres d'un lien dans une seule fonction. Si je le casse comme vous le voyez ci-dessous, cela fonctionne bien, mais cela semble très inefficace et je veux trouver la bonne façon de le faire. afin de libérer tous les nœuds, j'ai besoin d'avoir une fonction pour libérer d'abord tous les nœuds autres que la tête, puis avoir une fonction libre le lien de tête. Cela semble être facile à faire mais j'ai des problèmes.Utiliser une fonction pour libérer une liste chaînée avec un double pointeur

Merci pour l'aide!

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeListMembers(head); 
    freeListHead(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    //create list 
    return 0; 
} 

void freeListMembers(struct node *head){ 
    while(head->next != NULL){ 
     head->next = NULL; 
     free(head->next); 
    } 
    return; 
} 

void freeListHead(struct node **head) { 
    *head = NULL; 
    free(*head); 
    return; 
} 

Voici le code que je veux travailler mais pas. le problème que je vois est une erreur pour "* head-> next"; où il me dit "l'expression doit avoir le pointeur sur struct ou type union"

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeAllListMembers(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    //create list 
    return 0; 
} 

void freeAllListMembers(struct node **head){ 
    while (head != NULL) { 
     struct node *temp = *head->next; 
     free(*head); 
     *head = temp ; 
    } 
    return; 
} 
+0

Vous * faire * une fonction qui permet de libérer la tête et tous les membres. C'est nommé 'main()'. Votre question serait plus claire et donnerait plus de poids aux réponses, si vous présentez quelque chose que vous avez essayé, et qui a donc la forme que vous voulez, mais cela ne fonctionne pas pour vous. –

+0

@JohnBollinger THanks! J'ai ajouté le code que je veux travailler ci-dessus – skevthedev

Répondre

1

À partir de votre code:

void freeListMembers(struct node *head){ 
    while(head->next != NULL){ 
     head->next = NULL; 
     free(head->next); 
    } 
    return; 
} 

Ce libère NULL, pas votre noeud *.

Libérer la liste est aussi simple que d'utiliser un pointeur temporaire vers le nœud suivant.

while (head) { 
    node* next = head->next; 
    free(head); 
    head = next; 
} 

De votre édition:

void freeAllListMembers(struct node **head){ 
    while (head != NULL) { 
     struct node *temp = *head->next; 
     free(*head); 
     *head = temp ; 
    } 
    return; 
} 

Il y a des erreurs de couple avec cela. Il devrait être while (*head != NULL) et (*head)->next. La première est une erreur logique, car la tête sera toujours non-NULL, et la seconde est une erreur de syntaxe, car vous devez déréférencer le pointeur de la tête avant d'accéder au pointeur suivant.

+0

Merci @ Marc, j'ai d'abord essayé vos suggestions, mais cela ne fonctionne pas, j'ai ajouté mon code à mon fil ci-dessus avec un peu plus d'info – skevthedev

+0

J'ai édité ma réponse pour vous montrer ce qui n'allait pas avec le code que vous avez essayé. – MarcD

+0

cela a fonctionné! merci, le (head! = NULL) était juste une faute de frappe, mais le (* head) -> suivant était la partie qui me manquait, pourquoi avez-vous besoin des parathenses? que fait-il exactement? Je pensais aussi à la définition de * head = NULL; avant libre (* tête) ;. J'ai lu que c'est une bonne pratique de mettre le pointeur sur null avant de le libérer, serait-ce correct pour ma situation aussi bien? – skevthedev

0

Cela fonctionnera. Vous venez de définir la prochaine tête de null et la tête libérée. Maintenant, nous ne pouvons pas passer à l'élément second.So nous ne serons pas en mesure de libérer les nœuds. Vérifiez également la condition de base. J'espère que cela aide

void freeListmembers(node *head){ 
node *temp=head; 
if(head==NULL)//Base condition 
return; 
while(head->next!=NULL){ 
temp=head;//Moved temp to head. we will move head to next and free the previous node 
head=head->next; 
free(temp); 
} 
free(head); 
return; 

}

+0

Ce n'est pas un moyen très clair ou concis pour libérer la liste. Cela fonctionne, mais d'une manière très détournée. – MarcD

+0

Je suis d'accord. Mais j'ai essayé de modifier en pensant à la personne qui a posé la question. Pour qu'il sache ce qu'il faisait. –