尝试打印链表节点字符串时C ++分段错误

时间:2015-10-08 07:00:40

标签: c++ class templates fault

我正在创建一个基于链表的堆栈,并且我正在使用类模板。我想通过用户输入定义堆栈的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()

1 个答案:

答案 0 :(得分:0)

在由LinkedList<Item>::addToHead调用的LStack<Item>::push函数中,它使用传入的node并通过设置其next指针将其放入链接列表中名单的负责人。这意味着传入的节点现在是列表的一部分。

当你的set_discs函数再次循环时,它会更改temp的值并再次将其推入堆栈。但temp指向的节点已经在堆栈中!这意味着它最终将指向自身,这肯定会导致一些问题。

您可能想要解决此问题的一种方法是每次循环时为temp分配一个新对象,但这意味着由LinkedList的用户决定是否知道他每次都必须分配新物品。

更好的方法是考虑使用LinkedListLStack的人不应该知道它是如何存储的,因此他们不需要与{ {1}}。请考虑更改nodeLinkedList的方法,只需采用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。一般来说,使用库类比滚动自己更好,除非有充分的理由(比如学习)。