2014-03-27 56 views
1

有兩段代碼,我似乎無法找到該錯誤。我知道這些內容有問題。每個一個。C++在與鏈接列表相關的代碼中查找錯誤

int pop() 
{ 
    Node* temp = new Node(); 
    temp = tail; 
    tail->prev()->setNext(NULL); 
    int tempV = temp->key(); 
    delete temp; 
    return tempV; 
} 

另一段代碼是這樣的:

int main() 
{ 
    Node* t = new Node(0,NULL); 
    t = Node(1,t); 
    t = Node(2,t); 
    delete t; 
} 

我想到了2塊的代碼一段時間。對於第一段代碼,我認爲錯誤是你不應該在關鍵字new的堆上創建Node * temp。它應該是Node* temp = tail;我相信。任何人都可以證實嗎?

對於第二一段代碼,我認爲錯誤是,你並不需要同時

t = Node(1,t); 
t = Node(2,t); 

編輯::我很抱歉,我犯了一個錯誤。它應該是節點而不是節點。我的朋友告訴我,它必須用記憶做些事情。它有一個內存泄漏,因爲多個節點被聲明爲新的?或者我們是否需要最後2個關鍵字?

感謝

+0

'node(int,Node *)'做什麼? – Beta

+0

你能展示'node()'函數的實現嗎? – Dinesh

回答

0

當你取出的元素,你不需要創建一個「新」的節點。您必須刪除鏈接列表的最後一個元素 - 不要創建新節點。

關於第二個問題,你不需要

t = node(1,t) 
t = node(2,t) 

如果函數返回當前添加的節點。 但是,如果函數返回鏈表的標題,它是必需的。這取決於你如何編寫node函數。

0

你正在失去你的新價值

Node* temp = new Node(); 
temp = tail;    <-- you just lost the value you new'ed 

後來要刪除一個不同的節點

tail->prev()->setNext(NULL); <-- this line doesn't check that the value for prev() isn't

,什麼是主要的事情我需要看到更多的的代碼爲「節點」

0

Dinesh在第一個示例中是正確的。這裏有一點更多的解釋。

Node* temp = new Node() 
temp = tail; 

導致內存泄漏。當您將溫度重寫爲尾部時,已創建的新節點會泄漏。正確的方法是

Node * temp = tail; 

在第二個示例中,它不清楚節點函數的作用。如果你打算寫:

int main() 
{ 
    Node* t = new Node(0,NULL); 
    t = new Node(1,t); 
    t = new Node(2,t); 
    delete t; 
} 

的代碼會更有意義,它創建了從頭部到上市時,尾部含2,1,0三個節點的鏈接列表。很難從這個不完整的例子中看出來。

+0

對不起。它實際上是Node(1,t),但沒有t。那麼它需要新的關鍵字嗎? – user3421510

+0

在第二個例子中,它又是一次內存泄漏。您正在使用new關鍵字爲3個節點分配內存,但僅爲其中一個釋放內存。另外,請不要忘記通過點擊您認爲最好的答案旁邊複選標記的大綱來選擇答案。 – mjn12

0

pop您有內存泄漏。您構建的堆Node,然後立即失去了它的軌道,就像充氣氣球,讓它去:

Node* temp = new Node(); 
temp = tail; 

但你也有一個更嚴重的問題:你不調整tail函數完成後,tail指向最後一個節點曾經存在的內存區域,並且任何嘗試對其進行解引用都將導致「未定義行爲」。

至於你的第二個問題,代碼可能是正確的,它可能不是。除非您向我們展示node(...)的功能,否則無法分辨。