2017-10-18 34 views
-2

私はコード内でセグメンテーションフォルトを継続していますが、理由はわかりません。 int nは私が削除するノードです。したがって、listDeleteNth(new, 2)はシーケンス内の3を削除します。リンクリスト内の特定のノードを削除するCプログラミング

1-> 2-> 3-> 4

1-> 2-> 4

typedef struct _node *Node;  
typedef struct _list *List;  

typedef struct _list { 
    Node head; 
} list; 

typedef struct _node { 
    int value; 
    Node next; 
} node; 

void listDeleteNth (List l, int n) { 
    Node current = l->head; 

    int i = 0; 
    while (i < n-1) { 
     current = current->next; //node before deleted node. 
    } 
    Node temp = current->next;  //make temp the one to be deleted. 

    if (current->next->next == NULL) { 
     printf("you deleted the last node!\n"); //check if dlting lastnode 
    } else { 
     current->next = current->next->next; //connect prev to after 
    } 
} 
+0

https://ericlippert.com/2014/03/05/how-to-debugを読みます-small-programs/ –

+2

リストにノードが1つしかないとします。次に、これは失敗することが保証されています(ヒント: 'current-> next'が' NULL'の場合、 'current-> next-> next'が働く可能性がありますか?) –

+0

' i'パラメータにはいくつかの問題があります次の4つのシナリオについて考える必要があります:空リスト、1ノードリスト、削除するノードが最後のもの、削除するノードが最初ではなく最後のものではない –

答えて

0

まず、inも、それが移動し続けるであろうように、ループ内で更新されます次のノードに転送され、セグメント化エラーが発生します。次へ

while (i < n-1) { 
    current = current->next; //node before deleted node. 
} 

あなたは、元のループを変更しようとするかもしれ

while (i < n-1) { 
    current = current->next; //node before deleted node. 
    i++; 
} 
+1

これは唯一の問題ではありませんそのコード –

+0

はい、私はちょうど主要な問題を指摘している間いくつかのエッジケースも考慮する必要があります – Jerry

関連する問題