2010-11-20 14 views
1

Ich bin eine einfach verkettete Liste in C implementieren und blieb mit der remove-Knoten-Funktion stecken. Es entfernt das Element, verbindet zwei seiner Nachbarn, aber der folgende Knoten ruft die nächste Knotenadresse auf NULL. Warum? Kann jemand helfen?einfach verknüpfte Liste in C - Knoten Entfernungsproblem

struct node{ 
     struct node* next; 
     int value; 
    }; 

    struct list{ 
     struct node* head; 
     struct node* tail; 
    }; 

void remove_node(struct list* plist, int value){ 

    struct node* current; 
    struct node* temp; 
    current = plist->head; 
    if (!(current)) return; 
    if (current->value == value){ 
     if (!(current->next)){ 
      plist->head = NULL; plist->tail = NULL; 
     } 
     else { 
      plist->head = current->next; 
      free(current); 
     } 
    } 
    else { 
     while(current->next){ 
      if(current->next->value==value){ 
       if ((current->next)->next){ 
        temp = current->next; 
        current->next = (current->next)->next; 
        free(temp); 
       } 
       else{ 
        temp = current->next; 
        plist->tail = current;  
        current->next = NULL; 
        free(temp); 
        break; 
       } 
      } 
     current = current->next;  
     } 
    } 
} 


Node current current->next 
0 0x9f39018 0x9f39028 
1 0x9f39028 0x9f39038 
2 0x9f39038 0x9f39048 
3 0x9f39048 0x9f39058 
4 0x9f39058 0x9f39068 
5 0x9f39068 0x9f39078 
6 0x9f39078 0x9f39088 
7 0x9f39088 0x9f39098 
8 0x9f39098 0x9f390a8 
9 0x9f390a8 (nil) 

after remove(5) 

0 0x9f39018 0x9f39028 
1 0x9f39028 0x9f39038 
2 0x9f39038 0x9f39048 
3 0x9f39048 0x9f39058 
4 0x9f39058 0x9f39078 
6 0x9f39078 (nil) 
+0

der Code wurde – matcheek

+0

Watch out korrigiert. Wenn die Nummer, die Sie löschen möchten, nicht in der Liste enthalten ist, versuchen Sie einen Nullzeiger mit 'if ((current-> next) -> next) zu dereferenzieren. – Santa

+0

gerade dort, danke für das Erkennen, dass – matcheek

Antwort

3

Dieser Code:

if ((current->next)->next){ 
    current->next = (current->next)->next; 
    free(current->next); 

befreit den nächsten Knoten, nachdem Sie bereits aus der Liste entfernt haben. Mit anderen Worten, Sie befreien den falschen Knoten.

+0

funktioniert wie ein Charme, danke – matcheek

1

Beachten Sie, dass Ihre korrigierten Code wird auch auf eine leere Liste abstürzen ..

+0

danke für das Erkennen dieser Subtilität – matcheek

Verwandte Themen