2013-04-16 91 views
1

在下面的鏈接列表中,我試圖實現一個打印功能。該函數是模板化的,不屬於Node類的一部分。C++:簡單節點/鏈接列表

基本上我希望這個打印功能是動態的,這樣我就不必手動打印出所有的Node->data。我沿着這個例子中的線樣的工作:http://www.cstutoringcenter.com/tutorials/cpp/cpp17.php

然而,當我嘗試實現打印功能我得到的編譯器錯誤如: node was not declared in this scopep' was not declared in this scopevariable or field 'print' declared void

這裏是我的程序:

#include<iostream> 
using namespace std; 

template<typename T> 
class Node 
{ 
public: 
     Node(T = 0); 
     ~Node() { delete [] nextPtr; }; 

     T getData() const; 
     Node<T>*& getNextPtr() { return nextPtr; }; 

private: 
     T data; 
     Node<T> *nextPtr;  
}; 

//CONSTRUCTOR 
template<typename T> 
Node<T>::Node(T newVal) 
    : data(newVal), nextPtr(NULL) 
{ 
    //EMPTY  
}; 

//GETDATA() -- RETURN DATA VALUE 
template<typename T> 
T Node<T>::getData() const 
{ 
     return data; 

}; 

//PRINT FUNCTION 
template<typename T> 
void print(node<T>* p) 
{ 
    while(p) 
    { 
      cout << p->data(); 
      p = p->link();   
    } 
}; 

int main() 
{ 
    Node<int> intNode1(5), intNode2(6), intNode3(7); 

    intNode1.getNextPtr() = &intNode2; 
    intNode2.getNextPtr() = &intNode3; 

    print(&intNode1); 

    system("pause"); 
} 

我在做什麼錯?

+1

錯字錯誤。在打印功能中應該是'Node * p'而不是'node * p'。編輯:其實,你有更多的錯誤比。編輯2:只是注意到你正在返回一個指針的引用。 –

回答

1

有幾個問題,你輸錯Node,你沒有正確使用的界面,這將編譯:

template<typename T> 
void print(Node<T>* p) 
{ 
    while(p) 
    { 
      cout << p->getData() << std::endl; 
      p = p->getNextPtr();   
    } 
} 

新增std::endl確保你看到的輸出。此外,您使用該類的方式,您的析構函數將在非動態分配的數據上調用delete。由於intNode2intNode3分配在堆棧上。您也正在使用陣列刪除delete []您應該使用delete。這是main的潛在問題:

int main() 
{ 
    Node<int> intNode1(5) ; 

    Node<int> *nPtr = intNode1.getNextPtr() = new Node<int>(6); 
    nPtr->getNextPtr() = new Node<int>(7) ; 

    print(&intNode1); 

    system("pause") ; // This is not portable 
} 
+0

好吧,它現在是這樣設置的,而且是WORKS。除了當我嘗試退出程序時,它說Node.exe已停止工作。任何想法爲什麼可能會發生? –

+0

我不知道它是否與我的析構... –

+0

@Ericafterdark是的,它的確,我只是更新了我的答案 –

0

也許你想鍵入Node而非node,看到你用Node<T>其他地方...

1

打印功能:

template<typename T> 
void print(node<T>* p) 

應該是:

template<typename T> 
void print(Node<T>* p) 
      //^^^^ 

由於在代碼中沒有定義node類模板。

編輯:在Node類中沒有定義link()data()

+0

'Node'類中也沒有'data()'或'link()'方法。 print()應該調用'getData()'和'getNextPtr()'。 –

+0

@RemyLebeau yeap,同意。 – taocp

+0

我明白了。我想我從來沒有改變它專門爲我的程序工作。 –