2016-04-24 12 views
0

Ich versuche, eine Löschfunktion zu schreiben, die Knoten aus einer verknüpften Liste löscht. Die Struktur und Funktionsdefinition sind unten:C- Doppelfreier Fehler beim Versuch, den ersten Knoten in der verknüpften Liste zu löschen

struct dog{ 
    int number; 
    char dog_name[NAME_LEN+1]; 
    char owner_last_name[NAME_LEN+1]; 
    char breed[NAME_LEN+1]; 
    struct dog *next; 
}; 

struct dog *delete_from_list(struct dog *dogs) 
{ 
    struct dog *cur, *prev; 
    int delete_number; 

    printf("\nEnter the patient number of the dog you want to delete: "); 
    scanf("%d", &delete_number); 

    for(cur = dogs, prev = NULL; cur != NULL && (cur->number != delete_number); 
     prev = cur, cur = cur->next) 
    ; 

    if(cur == NULL) 
    { 
    printf("Dog not found.\n"); /*dog not found in list*/ 
    return dogs;   
    }else if(prev==NULL) 
    { 
    dogs = dogs->next; /*dog now points to the second node*/ 
    }else 
    prev->next = cur->next; /*dog is in another node*/ 

    printf("Deleted: Dog name: %s, Breed: %s, Owner's last name: %s\n", 
      cur->dog_name, cur->breed, cur->owner_last_name); 
    free(cur); 
    return dogs; 
} 

Wenn ich das Programm ausführen, funktioniert die Löschfunktion, bis ich versuche, den ersten Knoten zu löschen. Ich habe meinen Debugger verwendet und festgestellt, dass dogs = dogs->next; ist, wo der Fehler auftritt, aber ich verstehe nicht, warum das ein Problem verursacht, wenn ich den neuen Kopf von dogs auf den zweiten Knoten verschiebe. Kann mir bitte jemand helfen?

+0

Das Problem könnte in dem Aufruf dieser Funktion sein. Sind Sie sicher, dass Sie im Listener den Listenkopf mit dem Wert aktualisieren, den diese Funktion zurückgibt? I.e. 'dogs = delete_from_list (dogs);' –

+0

Wenn ich die Funktion anrufe, habe ich einen Zeiger, '* dog_list', der auf Hunde zeigt. Das habe ich 'delete_from_list (dog_list);'. – salmon1407

+0

Debugger ............... –

Antwort

0

Per Ihrem Kommentar, du rufst du dies als:

delete_from_list(dog_list); 

Dies funktioniert nicht in dem Fall, in dem das erste Element gelöscht wird, da in diesem Fall delete_from_list wird die neue Liste Kopf zurückkehren (die war früher das zweite Element der Liste), aber dog_list im Aufrufer wird immer noch auf das jetzt gelöschte ehemalige erste Element zeigen. Alles, was Sie tun müssen, um dies zu beheben ist, dies zu ändern: in dem Anrufer aktualisiert wird dog_list

dog_list = delete_from_list(dog_list); 

auf diese Weise und wird nicht mehr auf ein Listenelement gelöscht.

Verwandte Themen