【发布时间】:2015-10-08 07:00:40
【问题描述】:
我正在创建一个基于链表的堆栈并且我正在使用类模板。我想通过用户输入定义堆栈的head 节点,然后打印它,但是我收到了分段错误,并且在找出原因时非常迷茫。
TowerHanoi.cpp 使用以下函数创建一个字符串,然后尝试将其存储在一个节点中,然后使用 push() 将其存储在堆栈中,这会将其添加到链接的“head”节点列表。在尝试打印链接列表的头节点时,我收到分段错误:
rod[]指的是一个LStack对象数组,其中包含Linked List以及查询和修改Linked List的成员函数。
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;
}
}
LStack.template 包含'push()' 的定义:
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();
}
LinkedList.template 在构造函数中初始化head 节点并包含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);
}
Node.template 将next 和previous 节点初始化为NULL,并包含set_data() 函数:
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;
}
【问题讨论】:
-
请尝试使用调试器来捕获崩溃,并在这样做时将代码缩小到崩溃的位置(以及相关的代码和上下文)。 the rules of three/five/zero 也可能存在问题。
-
那么,您是否已经使用调试器找到了确切的源代码?
-
什么是
rod?你是怎么定义的? -
您真的只想创建一个项目 (
temp) 并多次推送同一个项目吗?您的堆栈实现不支持。 -
rod 是一个 LStack 对象 Hades。黑暗,我想我应该在 addToHead 函数中创建另一个临时节点,它使用新数据创建 temp 副本并将其存储?