2016-03-10 92 views
1

我試圖刪除第N個位置中的節點。出於某種原因,當試圖刪除頭部時,功能錯誤在previous->next = current->next。我試過添加一個條件來檢查是否previous->next != NULL,但這沒有奏效。任何人都可以暗示我做錯了什麼,我該如何解決這個問題?謝謝。嘗試刪除頭時刪除第N個節點中斷

void removeNth(List** myList, int n) { 
    Node* previous; 
    Node* current; 
    int count; 

    if (getLength(*myList) >= n) { 
     if (getLength(*myList) == n) { 
      removeLast(myList); 
     } 
     else { 
      previous = NULL; 
      current = *myList; 
      count = 1; 

      while (count < n) { 
       previous = current; 
       current = current->next; 
       count++; 
      } 

      previous->next = current->next; 
      freeNode(current); 
     } 
    } 
} 
+0

您需要爲'n == 1'添加一個特例。關於你的問題的提示:當'n == 1'時,你認爲'previous'指向什麼? –

+0

出於好奇,'List'只是'Node'的typedef別名?因爲它從這裏看起來確實如此。如果不是,那'current = * myList'根本就沒有意義。如果是這樣,爲什麼要有'List'? – WhozCraig

+0

哦,你*在調試器中運行你的程序?因爲那樣你就可以看到所有涉及的變量的值,並立即看到問題。 –

回答

0

從我看到的一切,你的List僅僅是Node的別名。鑑於此,您看起來似乎是一個單向前向鏈表,並給出一個頭指針和一個計數n,想要刪除基於1的位置節點(如果存在)。

任務

該指針的頭指針和實現它擁有什麼(的指針地址)比你讓出這是什麼使這個算法簡單。最初它保存指向列表中第一個節點的指針的地址(如果列表爲空,則爲NULL)。從那裏你需要將它放在列表中,將指針的地址存儲在指向當前節點的針對每跳的指針中。當你到達你的計數器限制時,如果它仍然指向列表中的某個next的指針,該指針指向你的受害者節點(可能是頭節點,但這並不重要)。您只需將該指針連接到以下節點,然後刪除現在孤立的項目。

我已經刪除了List別名,因爲老實說,我看到它沒有任何意義的代碼。如果你正在使用包含List結構的headtail指針來獲得更快的結束插入,它會更有意義,但是在任何代碼中我都沒有看到這種提示。實際上,current = *myList;根本不起作用,除非ListNode是同義詞。

void removeNth(Node** pp, unsigned int n) 
{ 
    // we're 1-based positioned, so leave early on a value of zero. 
    // for 0-based positioning delete these two lines. 
    if (n-- == 0) 
     return; 

    // walk the list until (a) we run out of nodes, or (b) meet our count. 
    while (*pp && n--) 
     pp = &(*pp)->next; // save address of current node's next ptr 

    // if this is still non-null, it means we have a prospect to free 
    if (*pp) 
    { 
     Node *node = *pp; // remember node we're about to orphan 
     *pp = node->next; // wire up next node to where that came from 
     freeNode(node);  // now free the orphaned node 
    } 
} 

強烈建議您仔細閱讀本和調試器下運行它,通過它加強和檢查變量(和它們的地址),以更好地理解它是如何工作的。

0

這可能有幫助。

無效removeNth(名單** myList中,INT N) {

Node* previous; 

Node* current; 
int count; 

if(n==1 && getLength(*myList)>=1) // This small change for deletion at beginning 
{ 
    *myList=(*myList)->next; 
    return; 
} 
else if (getLength(*myList) >= n) 
{ 
    if (getLength(*myList) == n) { 
     removeLast(myList); 
    } 
    else { 
     previous = NULL; 
     current = *myList; 
     count = 1; 

     while (count < n) { 
      previous = current; 
      current = current->next; 
      count++; 
     } 

     previous->next = current->next; 
     freeNode(current); 
    } 
} 

}