2016-05-27 14 views
0

Wie zerstöre ich meine verknüpfte Liste vollständig? Zum Beispiel, direkt, wenn ich meine verknüpfte Liste erstelle und die Drucklistenfunktion aufruft, passiert natürlich nichts, da nichts in der Liste ist. Wenn ich Knoten zur Liste hinzufüge, druckt sie sie gut aus. Aber wenn ich meine Liste zerstöre und versuche, die Liste auszudrucken, erwarte ich, dass nichts mehr ausgedruckt wird, aber ich habe Fehler gemacht. * Der Kopf meiner verknüpften Liste ist ein Dummy-Knoten zuRichtiger Weg, verknüpfte Liste zu zerstören?

void destroyList(listNode *List) 
{ 
    listNode *temp = malloc(sizeof(listNode)); 
    temp = List->next; 
    while (List != NULL) 
    { 
     temp = List; 
     List = List->next; 
     free(temp);    
    } 
} 

void printList(listNode * List) 
{ 
    List = List->next; 

    while (List != NULL) 
    { 
     printf("%d\n",List->val);   
     List = List->next;  
    } 
} 
+1

Warum würden Sie eine listNode reservieren, wenn Sie versuchen, eine zu zerstören? –

Antwort

2

Sie sind Speicherzugriffsfehler, weil Sie immer noch die Kette von free ‚d Zeiger auf hinunterklettern versuchen, die Sie nicht tun können. Stellen Sie einfach die erste ->next auf NULL und Sie sind gut zu gehen.

void destroyList(listNode *List) 
{ 
    listNode *temp; // removed malloc, it's not necessary. 
    listNode *originalHead = List; 
    temp = List->next; 
    while (List != NULL) 
    { 
     temp = List; 
     List = List->next; 
     free(temp);    
    } 

    originalHead->next = NULL; 
} 
+1

Nach Kommentar von ckruczek füge ich dies als Kommentar hinzu. Sie löschen auch Ihren Dummy-Zeiger am Anfang der Liste. Ist es das was du willst? Vielleicht sollte Ihre Druckmethode immer den Dummy zeigen und wenn Sie versuchen, eine Liste ohne Dummy zu drucken, erhalten Sie einen segfault. Sie müssen zunächst Ihre Einschränkungen für die Liste festlegen. – Cristi

0

Nachdem Sie die destroyList aufgerufen haben, soll der List-Zeiger auf NULL gesetzt werden. Da es sich um einen pass be-Wert handelt, müssen Sie die Adresse des List-Zeigers an die destroyList übergeben. Also, ich würde es tun, wie folgt:

void destroyList(listNode **List) { 
    listNode *temp1, *temp2; 
    if (!List) { 
    return; 
    } 
    temp1 = *List; 
    while (temp1) { 
    temp2 = temp1->next; 
    free(temp1); 
    temp1 = temp2 
    } 
    free(*List); 
} 

Dann rufen Sie es wie folgt aus:

listNode *foo; 

// some code 

destroyList(&foo);