2011-06-18 19 views
2

次のコードスニペットは正しく動作していません。リンクリスト削除機能

void deleteNode(list **start, int pos) { 
    int currentPosition=0; 
    list *currentNode; 
    list *nodToDelete; 

    currentNode = *start; 
    if (currentNode == NULL) { 
     printf("Empty List\n"); 
    } else if (pos == 0) { 
     nodToDelete = *start; 
     *start = nodToDelete->next; 
     free(nodToDelete); 
    } else { 
     while (currentNode->next != NULL) { 
      if (currentPosition >= pos -1) { 
       break; 
      } 
      currentPosition++; 
      currentNode = currentNode->next; 
     } 
     if (currentPosition < pos -1 || currentNode->next == NULL) { 
      printf("No node at given position exists\n"); 
     } else { 
      nodToDelete = currentNode->next; 
      currentNode = nodToDelete->next; 
      free(nodToDelete); 
      nodToDelete = NULL; 
     } 
    } 
} 

void displayList(list *node) { 
    if (node == NULL) { 
     printf("Empty List"); 
    } 

    while (node != NULL) { 
     printf("%d\t", node->data); 
     node = node->next; 
    } 
    printf("\n"); 
} 

int main() 
{ 
    list *start, *node; 
    start = NULL; 

    insertNode(&start, 2); 
    insertNode(&start, 3); 
    insertNode(&start, 4); 
    insertNode(&start, 1); 
    insertNode(&start, 5); 

    deleteNode(&start, 3); 

    displayList(start); 
} 

出力が削除2 3 4 0 5

後削除1 2 3 4 5

で実行されたときに1を削除することになっているが、それが挿入されています0の代わりに。

+0

コードが不完全です。 'list'の定義を表示してください。 – zwol

+0

もっとコードが必要です。 – dcousens

+1

currentNode = nodToDelete->次にnextNode-> next = nodToDelete-> nextとするべきではありません。 – Ben

答えて

1

リストから取り出したいノードが見つかったら、実際にそれを取り出す必要があります。 あなたは基本的に

currentNode->next = nodToDelete->next; 

currentNode = nodToDelete->next; 

を交換してください - ここで=)

...

nodToDelete = currentNode->next; 
currentNode->next = nodToDelete->next; 
free(nodToDelete); 

...

+0

ソリューションのためにありがとう 最終的にそれは私が理解できなかった0レベルのバグであることが分かった – user804195

2

はうまくいくかもしれない何かであります必要がある彼はノードトデレテの前にノードトデレテのノードを指し示すノードを指し示すようにしました。

1

currentNode->next = nodToDelete->next;の問題と負の位置以外に、あなたとあなたのロジックが混ざり合っています。できるだけ2つを分けてください。

UIに何かを送信することは、進捗状況を報告する方法です。 uiがコマンドライン、ブラウザ、またはスピーカーであるかどうか。 deleteNode内で、空のリストまたは範囲外の位置は、進行中ではありません。順番には両方とも成功と同じです - あなたは完了です。失敗が報告されるようにするには、別のシーケンス、つまり呼び出し元につながる可能性がある場所で実行する必要があります。また、uiで混在させることで、不要な依存関係や失敗を紹介します(printfにバグがある場合、必要でないときは関数がクラッシュします)。関数が定義された結果を返す場合、呼び出し元は成功を含むその結果を報告するかどうかを決定できます(関数は現在そうしておらず、呼び出し元は成功または失敗の違いを知らせていません)。