2010-11-20 17 views
1

Cで単一リンクリストを実装していますが、ノード削除機能がありません。 要素を削除し、隣接する2つをリンクしますが、次のノードはNULLに設定された次のノードアドレスを取得します。どうして? 誰でも助けることができますか?Cノード削除問題の単一リンクリスト

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

コードは修正されました – matcheek

+0

注意してください。あなたが削除しようとしている番号がリストにまったく入っていない場合は、 'if((current-> next) - > next)'でNULLポインタを逆参照しようとします。 – Santa

+0

ちょうどそこに着いた、 – matcheek

答えて

3

このコード:あなたはすでにそれをリストから削除した後

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

は、次のノードを解放します。つまり、間違ったノードを解放しています。

+0

は魅力のように動作します、ありがとう、 – matcheek

1

修正されたコードも空のリストでクラッシュすることに注意してください。

+0

その微妙な – matcheek

関連する問題