我的任务是创建一个使用递归来打印单链表(堆栈)数据的打印函数。这是我到目前为止的代码:
IntStack.h
#include <iostream>
struct NodeType
{
int data;
NodeType *next;
};
class IntStack
{
private:
NodeType root;
int count;
public:
IntStack(void);
~IntStack(void);
void push(int);
int pop(void);
bool isEmpty(void);
void print(NodeType&);
int getSize() const;
NodeType* getRoot();
};
IntStack.cpp
#include "IntStack.h"
IntStack::IntStack()
{
count = 0;
}
IntStack::~IntStack()
{
}
void IntStack::push(int num)
{
NodeType newNode;
newNode.data = num;
newNode.next = &root;
root = newNode;
++count;
}
int IntStack::pop(void)
{
// get root data
// set root equal to root.next
int num = root.data;
root = *root.next;
--count;
return num;
}
bool IntStack::isEmpty(void)
{
return (count == 0);
}
void print(NodeType *node)
{
if (node->next != NULL) {
std::cout << node->data << " " << std::endl;
print(node->next);
}
}
NodeType* IntStack::getRoot()
{
return &root;
}
int IntStack::getSize() const
{
return count;
}
的main.cpp
#include <iostream>
#include "IntStack.h"
int main()
{
IntStack stack;
stack.push(7);
stack.push(10);
stack.push(13);
stack.push(43);
stack.push(23);
stack.push(5);
stack.push(32);
stack.push(8);
std::cout << stack.getSize() << " item(s) in the stack." << std::endl;
std::cout << "Pop item off stack: " << stack.pop() << std::endl;
std::cout << stack.getSize() << " item(s) in the stack." << std::endl;
stack.print(stack.getRoot());
return 0;
}
我在main.cpp中的stack.print(stack.getRoot())函数中收到错误:
main.cpp:28:17:类型为'NodeType'的非const左值引用无法绑定到'NodeType *'类型的临时值
显然,我没有发送指向该函数的指针,但我尝试了各种方法来发送根节点而没有运气。非常感谢有关我应该如何进行的任何信息。感谢
答案 0 :(得分:2)
首先,您应该在不在堆栈上的堆上分配节点。简而言之,要分配Heap而不是Stack,你必须使用“new”关键字。
// node1 is stack allocated
NodeType node1;
// node2 is heap allocated
NodeType *node2 = new NodeType;
原因是,当函数返回时,分配给堆栈的任何内容都会过期(被删除)。在您的情况下,您需要将节点保持在函数末尾之外。
所以将NodeType root;
更改为NodeType *root;
并在构造函数中将root设置为NULL。
您必须更改推送功能,以便让您的程序立即运行。
void IntStack::push(int num)
{
NodeType *newNode = new NodeType; // heap allocated now
newNode->data = num; // use appropriate dereferencing operator "->"
newNode->next = root; // root is now a pointer
root = newNode;
++count;
}
要删除节点,您可以执行相反的操作
int IntStack::pop(void)
{
int num = root->data;
NodeType *tmp = root; // don't lose the pointer
root = root->next;
delete tmp; // heap allocated memory must be freed if it is allocated
--count;
return num;
}
向NodeType添加构造函数以将变量设置为NULL也是一个好主意,因为在递归打印节点时,您必须知道何时到达最后一个节点,将由“下一个”指针指示为NULL。
修改强>
我在上面划了一条线。由于您将root初始化为NULL,并且next
始终设置为root的值,因此NodeType
不需要构造函数。但是,打印功能中的条件应为if (node != NULL)
而不是if (node->next != NULL)
。考虑您有0或1个节点的情况。
答案 1 :(得分:1)
您在头文件中编写了void print(NodeType&);
,而不是使用.cpp文件中的指针版本。将&
更改为*
即可。
(顺便说一句奇怪的模式)
答案 2 :(得分:0)
您的原型与您的功能使用不符。
void print(NodeType&)
在您的实施文件中,您有以下
void print(NodeType *node)
我相信你想要使用NodeType *,所以在你的头文件中更改它以反映它。
我看到另一条线,我发现令人困惑的是打印功能中的打印线。
std::cout << node->data << " " << std::endl;
为什么要在每次打印后打印换行符?我建议将其更改为删除endl
打印。