C++ C++;尝试打印链接列表节点字符串时出现分段错误
我正在创建一个基于链表的堆栈,并使用类模板。我想通过用户输入定义堆栈的C++ C++;尝试打印链接列表节点字符串时出现分段错误,c++,class,templates,fault,C++,Class,Templates,Fault,我正在创建一个基于链表的堆栈,并使用类模板。我想通过用户输入定义堆栈的head节点,然后将其打印出来,但是我收到了一个分段错误,我很难找出原因 TowerHanoi.cpp使用下面的函数,该函数创建一个字符串,然后尝试将其存储在节点中,然后使用push()将其存储在堆栈中,并将其添加到链表的“head”节点中。在尝试打印链接列表的头节点时,我收到一个分段错误: rod[]指的是一组LStack对象,其中包含链表和查询和修改链表的成员函数 void TowerHanoi::set_Disc
head
节点,然后将其打印出来,但是我收到了一个分段错误,我很难找出原因
TowerHanoi.cpp
使用下面的函数,该函数创建一个字符串,然后尝试将其存储在节点中,然后使用push()
将其存储在堆栈中,并将其添加到链表的“head
”节点中。在尝试打印链接列表的头节点时,我收到一个分段错误:
rod[]
指的是一组LStack对象,其中包含链表和查询和修改链表的成员函数
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;
}
}
LinkedList.template初始化构造函数中的头节点
并包含addToHead(Item*entry)
函数:
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);
}
namespace oreilly_A2 {
template <typename Item>
node<Item>::node() {
next= NULL;
previous= NULL;
}
template <typename Item>
void node<Item>::set_data(Item new_data){
word = new_data;
}
template <typename Item>
Item node<Item>::data() const { //return the word
return word;
}
在由LStack::push
调用的LinkedList::addToHead
函数中,它使用传入的节点
,并通过将其下一个
指针设置为列表的开头,将其放入链接列表中。这意味着传入的节点现在是列表的一部分
当set\u discs
函数再次循环时,它会更改temp
的值,并再次将其推送到堆栈上。但是temp
指向的节点已经在堆栈上!这意味着它最终会指向自己,这肯定会引起一些问题
您可能想解决这个问题的一种方法是在循环中每次为temp
分配一个新对象,但这意味着LinkedList
的用户每次都必须分配新项目
一个更好的方法是考虑有人使用<代码> LIKEDList或<代码> LStack <代码>不需要知道它是如何存储的,所以它们根本不需要与<代码>节点< /代码>交互。请考虑更改<代码> > Link目录> /COD>和<代码> LStack <代码>,以获取<代码>项目参考。然后,他们可以构建自己的节点来存储数据。比如:
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);
}
模板
无效链接列表::addToHead(项目和条目){
节点*温度=头部;
头=新节点;
表头->设置日期(项目);
头部->设置链接(温度);
}
同样,将您的LStack
更改为只获取项目&
,并将其传递到链接列表
然后将你的棒
作为LStack
的数组(或任何集合),而不是你现在拥有的,我怀疑它是LStack
的数组
然后,您将不需要在主循环中执行任何分配,只需将一个正常的std::string
(tmp_string
将按原样执行)传递到push
函数
另一件事,除非你是为了学习链表(或类),否则只需要使用STL类,比如<代码> STD::Stuts。一般来说,使用库类比使用自己的类要好得多,除非有充分的理由(如学习)。
请尝试使用调试器捕获崩溃,并在这样做时将代码缩小到崩溃的位置(以及相关代码和上下文)。可能还有一些问题。那么,您是否已经使用调试器找到了确切的源代码?什么是rod
?您是如何定义的?您真的只想创建一个项目(temp
)并多次推送同一项目吗?您的堆栈实现不支持。rod是一个LStack对象HadeS。Dark,我想我应该在addToHead函数中创建另一个临时节点,该节点使用新数据创建一个temp副本并存储该副本?是的,作为测试,我将其更改为,只创建一个字符串(无while循环),将字符串传递到list->addToHead(),将字符串传递到head节点。我还对它进行了修改,以获得您对addToHead()的建议,但我仍然犯了分段错误!我快要疯了。。
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);
}