0

C でリンクされたリストを学習していますが、削除機能に問題があり、セグメンテーション エラーが発生し続けます。コードの何が問題なのかわかりません。

void delete(int d)
{
    struct list * current1 = head; 
    struct list * current2;

    if (len() == 0)
    { //prtError("empty");
        exit(0);
    }
    if (head -> data == d)
    { 
        head = head -> next;
    }

    //Check if last node contains element
    while (current1->next->next != NULL)
        current1 = current1->next;
    if(current1->next->data == d)
            current1->next == NULL; 


    current1 = head; //move current1 back to front */

    while(current1 != NULL && (current1->next->data != d))
        current1 = current1 -> next; 


    current2 = current1 -> next;
    current1 -> next = current2 -> next; 
}
4

2 に答える 2

0

これは多くの点で間違っています:

1)

while (current1->next->next != NULL)

リストに要素が 1 つしかない場合:

current1 = head;
current1->next = NULL; 
current1->next->next = Seg Fault

2)
最後の要素に提供されたデータがあるかどうかを確認する場合は、それを見つけたら関数から戻り、メモリを解放してください。

while(current1->next->next != NULL)
    current1 = current1->next;
if(current1->next->data == d){
        free(current->next);
        current1->next == NULL;
        return; 
}


3)
最後の要素にデータがある場合に上記のように検索すると (無意味な検索ですが、個別に検索する必要はありません)、以下のコードからエラー ケースを排除します。ただし、データがリストに見つからずcurrent1、最後の要素に配置されている場合 (so != NULL)の状況が引き続き発生しますがcurrent1->next->data != d、プログラムがクラッシュします。これは、2) の関数から戻らない場合に発生します。

current1 = head; //move current1 back to front */
while(current1 != NULL && (current1->next->data != d))
    current1 = current1 -> next; 


4)
削除されたノードの空きメモリ:

current2 = current1 -> next;
current1 -> next = current2 -> next; 
free(current2);
于 2013-07-09T22:59:39.080 に答える
0

ざっと見てから:

1 から 99 までの 100 個の構造体があるとします。
100 番目は (おそらく) NULL になります。


while(current1 != NULL && (current1->next->data != d))

上記のコードが 99 番目の構造体に達したとき。2 つのチェックを実行します。

1) 99 番目が NULL でないかどうかを確認します.. true を返します
2) 100 番目のデータが d と異なるかどうかを確認します

しかし、100番目の構造体はありません。
これにより、未定義の動作が発生し、セグメンテーション違反につながる可能性があり、おそらくそうなるでしょう。

于 2013-07-09T22:54:45.593 に答える