2016-05-28 10 views
-1

Ich habe Datenstruktur wie diese befreien:C - können nicht doppelt verknüpften Liste Knoten

typedef struct telephoneBookNode 
{ 
    int id; 
    char name[NAME_LENGTH]; 
    char telephone[TELEPHONE_LENGTH]; 
    struct telephoneBookNode * previousNode; 
    struct telephoneBookNode * nextNode; 
} TelephoneBookNode; 

typedef struct telephoneBookList 
{ 
    TelephoneBookNode * head; 
    TelephoneBookNode * tail; 
    TelephoneBookNode * current; 
    unsigned size; 
} TelephoneBookList; 

Ich kann Knoten erstellen, und die Liste macht Daten enthalten, weil ich in der Anzeige die Liste keine Probleme bekam, Einfügen oder Verschieben Aber Knoten ....

wenn ich Funktion schreiben, um die Liste zu löschen, ich habe Fehler:

PhoneBook(6187,0x7fff77045000) malloc: *** error for object 0x7f87c1f00004: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

das ist mein Radiergummi Funktionen:

void freeTelephoneBookList(TelephoneBookList* aList) { 
    TelephoneBookNode* node; 
    TelephoneBookNode* temp = aList->head; 

    while (temp) { 
     node = temp; 
     temp = node->nextNode; 
     freeTelephoneBookNode(node); 
    } 
    free(aList); 
} 

void freeTelephoneBookNode(TelephoneBookNode * node) { 
    free(node->name); 
    free(node->telephone); 
    free(node); 
} 

Bitte jemand sagt mir, was ich hier falsch gemacht habe. Vielen Dank!

+0

Um einen einzelnen Knoten freizugeben, müssen Sie die Adresse des Knotens übergeben für eine Streichung des ersten Knotens zu berücksichtigen. z.B. 'void freeTelephoneBookNode (Knoten TelephoneBookNode **)'. Sie müssen alle nächsten/vorherigen Zeiger neu verdrahten, und wenn der erste Knoten gelöscht wird, aktualisieren Sie die Listenadresse auf den neuen ersten Knoten. –

+1

Der Zeiger, den Sie an "freeTelephoneBookList" übergeben - woher kam es? Sie haben * einige * von dem, was hier für ein [minimales, vollständiges und verifizierbares Beispiel] (https://stackoverflow.com/help/mcve) benötigt wird, beenden Sie es einfach mit einem 'main()' und was auch immer es ist erforderlich, üben Sie Ihren Code bis zu dem Punkt des Scheiterns Sie behaupten. Wir haben keine Gedankenleser, und ich vermute, Ihr Anspruch von "Ich habe keine Probleme ..." ist nicht ganz korrekt. * "... das ich kenne" * wäre wahrscheinlich mehr. Edit: Nun, diese Funktion hat sich * komplett * geändert, also habe ich jetzt nichts mehr. – WhozCraig

+0

@ DavidC.Rankin Das stimmt nicht. Es spielt keine Rolle, ob der nächste/vorherige Zeiger in einem Knoten oder der erste/letzte Zeiger in einer Liste in dem Moment, in dem der Knoten oder das Listenobjekt gelöscht wird, auf Null gesetzt wird. Wichtig ist, ob sie lange genug in einer zusätzlichen Variablen gehalten werden um den nächsten/vorherigen Knoten löschen zu lassen. Und sie sind. – CiaPan

Antwort

2

HINWEIS Diese Antwort bezieht sich auf die initial version der Frage.

Variablen node->name und node->telephone sind nicht Zeiger zugewiesen Speicherblöcke zu trennen, sind sie nur Teile *node. Reduzieren Sie die freeTelephoneBookNode Funktion

void freeTelephoneBookNode(TelephoneBookNode * node) { 
    free(node); 
} 
+0

Wenn ich diese Funktion so ändere, wurde das Programm abgestürzt, ohne dass ein Fehler angezeigt wurde. Dann habe ich versucht, den Code zu reparieren und meinen Post zu aktualisieren. Ich habe printf ("1") in "if" -Block geschrieben, und printf ("2") in "else" -Block. Ich habe diese Sequenz beim Ausführen: 222222222222222222211. Wenn sie also die Liste bis zum letzten Knoten löscht, dann wurde abgestürzt. –

+0

@LKPhucNguyen 1. Ihr Code enthält keine 'if' oder' else' Blöcke. Wenn Sie einen anderen Code besprechen möchten, senden Sie bitte eine weitere Frage. 2. Deine 'freeTelephoneBookList' ist IMHO korrekt, der Fehler mit' free' -ing ein 'nicht zugewiesener Block' kann * sicherlich * in 'freeTelephoneBookNode' entstehen, und ich habe oben eine Lösung gegeben. 3.Wenn Sie einen anderen Fehler erhalten, liegt das wahrscheinlich an der Inkonsistenz Ihrer Daten. Sie müssen es entweder besser diagnostizieren oder eine neue Frage mit einem vollständigen Code posten. Siehe [** So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel **] (http://stackoverflow.com/help/mcve) – CiaPan