2014-02-27 40 views
-1

我寫含有以下結構的節點單鏈表上執行功能的程序:C++鏈表 - 插入節點功能不更新值出來的功能範圍

typedef int ITEM; 
typedef struct NODE* NODEptr; 

struct NODE 
{ 
    ITEM data; 
    NODEptr next; 
}; 

而這是功能我打電話給一個節點添加到列表的頭部(hdlist文件指向列表頭):

void addToHead(NODEptr &hdList, ITEM input) 
{ 
    NODEptr newNode = new NODE; 
    newNode->data = input; 
    newNode->next = nullptr; 
    hdList = newNode; 
} 

但是我發現,同時使用調試器未更新的hdlist的值當程序葉該函數即使通過引用傳遞,我也是不知道爲什麼。

非常感謝您的幫助和建議。

編輯:按照要求,完整的代碼在這裏:http://pastebin.com/bLv0S2QG 還有我與Visual Studio編譯2013

+2

看起來你應該將'newNode-> next'設置爲'hdList'只要確保'hdList'被初始化爲'nullptr'。 – ooga

+0

@ooga回答此問題! –

+0

爲宏保留ALL UPPERCASE有助於避免名稱衝突和無意的文本替換,並且在眼睛和耳朵上也更容易。作爲與代碼維護人員良好溝通的一個問題,說T *比說'typedef T * T_ptr'然後'T_ptr'更短更清晰。 –

回答

2

正確的功能將如下

void addToHead(NODEptr &hdList, ITEM input) 
{ 
    NODEptr newNode = new NODE; 
    newNode->data = input; 
    newNode->next = hdList; 
    hdList = newNode; 
} 

或者,如果你的編譯器支持C++ 2011,然後

void addToHead(NODEptr &hdList, ITEM input) 
{ 
    NODEptr newNode = new NODE { input, hdList }; 
    hdList = newNode; 
} 

最初hdList必須初始化爲nullptrNULL。例如

NODEptr hdList = nullptr; 
+0

「正確」取決於**函數的調用方式**:此答案中給出的代碼對於OP的調用模式可能是錯誤的。這就是爲什麼我要求OP完整的代碼示例。例如,該函數可以通過'hdlist'來引用列表的最後一個節點中的'next'指針,並且在OP的實現中調用它的方式是合理的和正確的。 –

+0

另請注意,OP的聲明「hdList未更新」不會以任何方式通過更改/修復鏈接列表來影響。所以OP保證錯誤的問題描述或選擇這個答案作爲解決方案。因此,它將有助於在答案中明確陳述假設,即關於調用函數的假定(以及OP的要求是不正確的)。 –

+0

@乾杯和hth。 - Alf「」correct「取決於函數的調用方式:在這個答案中給出的代碼對於OP的調用模式可能是錯誤的。」該函數正確地解決了OP調用它的方式。只能使用該功能的無效使用,僅此而已。 –