2010-04-23 51 views
0

考慮以下列表:鏈接列表彈出()函數

[LinkNode *頭 - LinkNode *節點1 - LinkNode *節點2]

我創建FIFO的堆棧。 我調用彈出()我想彈出node1。

LinkNode::LinkNode(int numIn) { 
    this->numIn = numIn; 
    next = null; 
} 
. 
. 
. 
int LinkNode::pop() { 
    Link * temp = head->next; 
    head = temp->next; 
    int popped = head->nodeNum; 
    delete temp; 
    Return numOut; 

問題:
1)頭應該是一個指針或LinkNode *?
2)鏈接* temp是在調用堆棧上創建的,當pop完成時不會自動刪除temp?
3)我的主要困惑是什麼是temp-> next的價值?這是否指向與node2相等的node1.next?

感謝您的幫助?

我的參考資料是Weiss的C++ for Java程序員。

回答

1
  1. LinkNode *是一個指針。所以我不確定你在問什麼。
  2. 變量超出範圍,但不會自動刪除動態分配的數據。在C++中,如果你動態地分配數據(叫new),你需要釋放它(調用delete
+0

換句話說,頭部被初始化爲例如: LinkNode *頭 這將使另一個節點。因此,head-> next會等於node1,但我想要獲取node1-next的值,即node2。我很難將語法應用到概念上。謝謝。 – JDragon314159 2010-04-23 23:50:59

+0

@ JKid314159 - 您需要區分指針和節點。通常情況下,'head'指向第一個節點(所以'head-> nodeNum'來自第一個節點),而'head-> next'指向第二個節點(所以'head-> next-> nodeNum'來來自第二節點)。 – 2010-04-24 01:25:05

+0

非常好。謝謝。 – JDragon314159 2010-04-25 19:25:15

1

在實現鏈表,樹或其它鏈接的數據結構來實施分成封裝是非常有用對象(LinkedList,Tree等)和節點對象(LinkedListNode,TreeNode等),它允許在實際節點之外實現方法。從節點彈出的問題是彈出的節點變得無效。將節點封裝在一些更大的數據結構中允許數據結構在外部執行彈出,從而移除舊節點。

要考慮的另一件事是,如果沒有物品可以彈出,pop將如何表現。它應該拋出異常嗎?它應該只是導致未定義的行爲?

在一個典型的鏈表中,封裝類通常保持一個指向第一個元素的指針,一個元素個數的整數個數,以及一個指向最後一個元素的指針(用於定時插入到列表末尾)。爲了實現一個堆棧,你只需要一個指向列表前面的指針。

局部變量被自動破壞;然而,它是你的指針,它是一個局部變量,而不是它指向的項目。沒有明確的刪除,指針指向的項目將不會被釋放。

在你的流行代碼中,你實際上是刪除了太多的項目。它應該是:

 
int result = head->nodeNum; // extract the result 
LinkNode* tmp = head; // save this so we can delete it 
head = head->next; // move the head forward to the next item 
delete tmp; // deallocate previous head 
return result; 

此外,不要忘記在嘗試彈出之前檢查該頭是否爲非空。

+0

我被困在 head = head-> next 這不就等於node1,因爲head是LinkNode *頭,其值爲int值,而下一個字段爲LinkNode *。所以,head-> next指向node1。請稍微混淆在這裏。 – JDragon314159 2010-04-23 23:53:12

+0

@JKid,每個節點的下一個指針應指向列表中的下一個節點。頭指針指向列表中的第一個節點。因此,head-> next指向列表的第二個元素。因此,head = head-> next將當前第二個元素作爲第一個元素。其他代碼確保舊的第一個元素(現在不再在列表中)被正確釋放,並返回舊的第一個元素的內容。 – 2010-04-25 01:48:46

+0

將頭移至下一個節點node2後,tmp現在指向node1。換句話說,temp指針指向node1的內存地址。調用「delete tmp」刪除tmp。在此調用之前,可以調用「delete * tmp」來刪除tmp指向的對象?調用「delete tmp」會刪除對node1的引用,但不會刪除node1? Node1指向node2?混在這裏? – JDragon314159 2010-04-25 19:41:49