我正在创建一个基于链表的堆栈,并且我正在使用类模板。我想通过用户输入定义堆栈的head
节点然后打印它,但是我收到了一个分段错误,并且在弄清楚原因时很遗憾。
TowerHanoi.cpp
使用以下函数创建一个字符串,然后尝试将其存储在一个节点中,然后使用push()
将其存储在堆栈中,并将其添加到' { {1}}'链接列表的节点。在尝试打印链接列表的头节点时,我收到分段错误:
head
是指一组LStack对象,它包含链接列表和查询和修改链接列表的成员函数。
rod[]
LStack.template包含 void TowerHanoi::set_Discs(size_t disc) {
node<string>* temp= new node<string>();
while (disc != 0) {
string tmp_str;
for (size_t i=0; i<disc; i++) {
tmp_str.append("x");
}
disc--;
temp->set_data(tmp_str);
rod[0].push(temp);
node<string>* tmp_node1 = rod[0].top();
cout << "test: " + tmp_node1->data() << endl;
}
}
的定义:
'push()'
LinkedList.template初始化构造函数中的 namespace oreilly_A2 {
template <typename Item>
LStack<Item>::LStack() {
list = new LinkedList<Item>();
}
//push
template <typename Item>
void LStack<Item>::push(Item* head_in) {
list->addToHead(head_in);
used++;
}
//top
template <typename Item>
Item* LStack<Item>::top() {
return list->list_getHead();
}
节点并包含head
函数:
addToHead(Item* entry)
Node.template将namespace oreilly_A2 {
template <typename Item>
LinkedList<Item>::LinkedList() { //constructor initializing nodes
head= new node<std::string>();
tail= new node<std::string>();
current= new node<std::string>();
}
template <typename Item>
void LinkedList<Item>::addToHead(Item* entry) {
Item* temp = head;
head = entry;
head->set_link(temp);
}
和next
节点初始化为NULL并包含previous
函数:
set_data()
答案 0 :(得分:0)
在由LinkedList<Item>::addToHead
调用的LStack<Item>::push
函数中,它使用传入的node
并通过设置其next
指针将其放入链接列表中名单的负责人。这意味着传入的节点现在是列表的一部分。
当你的set_discs
函数再次循环时,它会更改temp
的值并再次将其推入堆栈。但temp
指向的节点已经在堆栈中!这意味着它最终将指向自身,这肯定会导致一些问题。
您可能想要解决此问题的一种方法是每次循环时为temp
分配一个新对象,但这意味着由LinkedList
的用户决定是否知道他每次都必须分配新物品。
更好的方法是考虑使用LinkedList
或LStack
的人不应该知道它是如何存储的,因此他们不需要与{ {1}}。请考虑更改node
和LinkedList
的方法,只需采用LStack
参考。然后,他们可以构建自己的节点来存储数据。类似的东西:
Item
同样,将template <typename Item>
void LinkedList<Item>::addToHead(Item &entry) {
node<Item>* temp = head;
head = new node<Item>;
head->set_date(Item);
head->set_link(temp);
}
更改为只需LStack
并将其传递给Item &
然后将LinkedList
设为rod
的数组(或任何集合),而不是现在的数据,我怀疑它是LStack<string>
的数组。
您不需要在主循环中进行任何分配,只需将正常LStack<node<string>>
(std::string
将按原样执行)传递给tmp_string
函数。
还有一件事,除非你这样做是为了学习制作链表(或类),考虑使用stl类,例如push
。一般来说,使用库类比滚动自己更好,除非有充分的理由(比如学习)。