2017-04-20 6 views
0

Ich habe Probleme mit dem Löschen des ersten Knotens in meiner verknüpften Liste, wenn ich die Ergebnisse nach dem Löschen anderer Knoten ist ein Erfolg, aber den ersten Knoten löschen, seine Drucke eine 0 und die letzten zwei Mitglieder der Struktur.Löschen des ersten Knotens in der verknüpften Liste zeigt immer noch Knoten in den Ergebnissen

Die Funktion soll einen Zeiger auf eine verknüpfte Liste übergeben werden, den Benutzer nach einer ID-Nummer fragen, um einen Knoten zu löschen, und die Liste zurückgeben.

struct dog *delete_from_list(struct dog *dogs){ 

int num; 

    printf("Enter a dogs ID number to be deleted "); 
    scanf("%d", &num); 

struct dog *prev, *cur; 

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

    if (cur == NULL){ 

      printf("Dog not found"); 
      return dogs; 
    } 
    if(prev == NULL){ 


      dogs = dogs->next; 

      printf("Dog deleted"); 

    } 
    else{ 

      prev->next = cur->next; 
    } 


    free(cur); 


    return dogs; 

} 

Dies ist die Funktion, um die Liste zu drucken, danach

void print(struct dog *list){ 

    /* Prints all structs within the 
    * linked list 
    */ 


    printf("\nID Number\t Dog Name\t Breed\t\t Owner\n"); 
    for(; list != NULL; list = list->next){ 

      printf("%d\t\t %-10s\t %-10s\t %-12s\n", list->number, list->dog_name, list->breed, list->owner_last_name); 

    } 

}

+0

Bitte fügen Sie den Code, wie Sie überprüfen (_still zeigt Knoten in results_). – BLUEPIXY

+0

Ich habe die Druckfunktion hinzugefügt, die ich verwende, um die Liste auszudrucken. – moose0306

+0

Rufen Sie wie folgt an? ZB "list = delete_from_list (list);' – BLUEPIXY

Antwort

0

Ihre Funktion offenbar funktioniert gut funktioniert gut (modifizierte es num als Parameter für mich zu übernehmen ...), bezüglich seiner tatsächlichen Absicht.

Was Sie nicht bekommen, ist eine Ausgabe "Hund gelöscht", wenn Sie den Kopf nicht löschen - das ist, weil Sie dies nicht implementiert haben. Versuchen Sie stattdessen:

if (!cur) 
{ 
    puts("Dog not found"); 
    return dogs; 
} 
if(!prev) 
{ 
    dogs = dogs->next; 
    puts("head deleted"); // <- changed "dog" -> "head" 
} 
else 
{ 
    prev->next = cur->next; 
    puts("dog deleted"); // <- added by me! 
} 

Wichtig ist: Sie unbedingt anrufen müssen, um es (wie BLUEPIXIY in seinem Kommentar bezeichnet) wie folgt aus:

dogs = delete_from_list(dogs); 

Wenn Sie dies nicht tun, Ihre äußere Variable ‚Hunde‘ gewonnen 't ändern und zeigt auf Speicher bereits gelöscht. Wenn Sie immer noch den dann baumelnden Zeiger verwenden, erhalten Sie undefiniertes Verhalten, höchstwahrscheinlich eine Zugriffsverletzung (Segmentierungsfehler).

Um ein solches Problem zu vermeiden, möchten Sie möglicherweise einen Zeiger auf Zeiger auf Ihre Funktion übergeben. Der Rückgabewert wird frei dann, und man konnte es, wenn der Hund könnte tatsächlich entfernt worden sind, um anzuzeigen, verwenden:

bool // need to #include <stdbool.h> for 
delete_from_list(struct dog** dogs) 
//      ^

Sie jetzt *dogs statt dogs intern verwenden würde und es so nennen würde:

delete_from_list(&dogs); 

Vorteil: Benutzer nicht über die richtige Neuzuordnung kümmern ...

Verwandte Themen