2013-04-16 94 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

我明白了。我想我从来没有改变它专门为我的程序工作。 –