2014-09-11 220 views
0

我無法使該程序將節點附加到鏈接列表的末尾。我知道它必須對「addBack」函數做些什麼,因爲「addFront」函數完美地工作。我認爲這應該是足夠的,但是如果需要更多的代碼,只要問,你就會收到。將節點添加到鏈接列表的末尾 - C++

template <typename E> 
void SLinkedList<E>::addBack(const E& e) 
{ 
    E *temp = head; 
    while (temp -> next != NULL) 
     temp = temp -> next; 
    SNode<E> * v = new SNode<E>; 
    temp -> next = v; 
    v -> elem = e; 
    v -> next = NULL; 
} 
+1

你必須改變'E * TEMP = head'到'SNode * TEMP = head',因爲'temp'是一個節點的指針,你走到最後。編譯器一定是警告過你的。有沒有消息? – Notinlist 2014-09-11 07:23:04

+1

這看起來不正確。 'E'是元素類型,而不是管理節點類型。你如何期望'E * temp = head;'甚至可以編譯,少得多的工作(假設'head'是一個'SNode *'即使修復了,這仍然不起作用,因爲它不會更新頭指針放在* initial *插入位置(第一個插入位) – WhozCraig 2014-09-11 07:24:05

+0

另外,我建議你在'head'旁邊保留'last'指針,所以訪問結束可以更快。 – Notinlist 2014-09-11 07:24:12

回答

1

這個代碼有兩個問題。首先,頭部不是E類型的指針,而是它是SNode類型的指針。 第二個列表可能是空的當第一個項目被添加(頭將NULL)。所以你需要分開處理這種情況。 下面的代碼應該工作:

template <typename E> 
void SLinkedList<E>::addBack(const E& e) 
{ 
    SNode<E> * v = new SNode<E>; 
    v -> elem = e; 
    v -> next = NULL; 

    if(head == NULL) //list is empty 
     head = v; 
    else 
    { 
     SNode<E> *temp = head; 
     while (temp -> next != NULL) 
      temp = temp -> next; 
     temp -> next = v; 
    } 
} 

但是更快的插入,你必須有兩個指針,無論是對列表的頭和尾。你不需要迭代整個列表來找到尾部。然而,當添加和從列表中刪除節點時,您將不得不迎合頭部和尾部。 這將是功能,如果你有兩個指針:

template <typename E> 
void SLinkedList<E>::addBack(const E& e) 
{ 
    SNode<E> * v = new SNode<E>; 
    v -> elem = e; 
    v -> next = NULL; 

    if(head == NULL) //list is empty 
     head = tail = v; 
    else 
     tail -> next = v; 
} 
+0

非常感謝!我會對我的成功進行必要的更正和評論(希望)。 – 2014-09-11 07:52:09

+0

沒有這樣的運氣......我得到'return(ptd);'tidtable.c「的錯誤信息 – 2014-09-11 08:17:44

+0

我不知道這意味着什麼,但是你可能會爲我帶來這個錯誤。 – 2014-09-11 08:19:55