2011-06-18 69 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 1 5
後刪除2 3 4 0 5

它應該刪除1,但它被插入0在它的地方。

+0

您的代碼不完整;請顯示'list'的定義。 – zwol

+0

我們確實需要更多代碼。 – dcousens

+1

不應該是currentNode = nodToDelete-> next是currentNode-> next = nodToDelete-> next; – Ben

回答

1

一旦你找到了你想從列表中刪除的節點,你需要真正把它取出來。 =)

...

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

...

+0

感謝解決方案 所以最終它竟然是0級錯誤,我不知道 – user804195

2

下面是一些可能的工作 - 更換

currentNode = nodToDelete->next; 

currentNode->next = nodToDelete->next; 

你基本上需要t他在nodetodelete之前節點的第二個點指向節點nodetodelete用於指向的節點

1

除了currentNode->next = nodToDelete->next;和負面位置的問題,您正在混合您的UI和您的邏輯。儘可能將兩者分開。

向ui發送內容是一種報告進度的方式; ui是否是命令行,瀏覽器還是揚聲器。在deleteNode中,空列表或超出邊界的位置不會進行。順序都是成功的相同 - 你完成了。如果您想要報告失敗,應該在可能導致單獨序列的地方進行,即調用者。另外,通過在UI中混合,你會引入一個不必要的依賴和失敗(如果printf中存在一個錯誤,那麼當你不需要時,你的函數會崩潰)。如果你的函數返回一個定義的結果,調用者可以決定是否/如何報告結果,包括成功(你的函數目前不這樣做,而調用者沒有辦法區分成功或失敗)。