2016-10-14 12 views
-1

単独リンクリストからノードを削除する際に問題があります。最初のノードを削除しようとしていないとき。それは残りのリストのための緩い参照のようです。 誰かを助けることができますか? これは問題の関数です。リストの先頭と削除するノードのプレートをとります。リストからノードを削除する問題

Car * removeCarFromList(Car * list,char plate[]){ 
    Car * current = list; 
    Car * previous = NULL; 
    while (current != NULL){ 
     if (strcmp(current->plate,plate)==0&& previous == NULL){ 
      list = current -> next; 
      current -> next = NULL; 
      return current; 
      break; 
     } else if (strcmp(current->plate,plate)==0&& previous != NULL){ 
      previous -> next = current -> next; 
      current -> next = NULL; 
      return current; 
      break; 
     } 
     previous = current; 
     current = current -> next; 
    } 
    return NULL; 
} 
+0

リストの最初のノード***は***の*リストアドレス*です。最初のノードを変更する場合は、リストアドレスとして保存されているアドレスも変更する必要があります。したがって、1)関数の新しい最初のノードアドレスを割り当てることができるように、リストの最初のノードの*アドレスを渡すか、または2)関数から新しいアドレスを返すように2つのオプションがあります。呼び出し元の新しいリストアドレス –

答えて

1

リストから最初の要素を削除する場合、リストする必要があるポインタよりも無効になります。 list = current -> next;にlistの値があなたの関数にローカルであると設定すると、それはあなたの関数から戻って決してあなたのリストの開始の関数に渡すポインタを更新することはありません。

あなたがしたいことをするには、ポインタへのポインタが必要です。その後、

Car * removeCarFromList(Car ** list,char plate[]) への電流を変化さ:Car * current = *list; その後、removeCarFromlist(myPointer,....removeCarFromlist(&myPointer, ....

あなたの機能変更を呼び出すときに、最初の項目があるときに、これは、リスト内の次の項目を指すようにmyPointerを変更しますlist = current->next

*list = current->next;にを変更除去された。

+0

ありがとう!また、私はリストが最低から最高までの自動車の人件費に基づいて並べ替えをバブルしようとしています。手伝ってくれますか? –

0

は、あなたの関数からreturnたら、バック同じ関数に次の命令へのリターンが存在しないので、returnbreakの使用は無意味です。まずbreakの文をreturnの後に取り除く。

機能ハンドリングリンクリストのノードの除去は新しいheadは、次のノードに更新されていることを確認して、headノード別途の削除を処理する必要があります。

Node *tmp = *head; 
*head = tmp->next; 
free(tmp); 
+0

私の悪い..fixed.thanks –

関連する問題