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);
}