我创建了2个名为nodelist.h和nodelist.cpp的文件,基本上它们里面的函数包含基本的链表功能,如(例如addNode,printNode ......等)之后我创建了另一个源文件利用在该类中创建的函数,如下所示:
#include "NodeList.h"
bool insertR(stringstream &lineStream)
{
int node1,node2;
lineStream>> node1 >> node2;
nodelist *n1 = new nodelist; //EDIT: FIXED
nodelist *n2 = new nodelist; // EDIT: FIXED
n1->addNode(node1);
n2->addNode(node2);
n1->print();
n2->print();
return true;
}
请注意,此函数不在main中,而是由main调用的另一个源文件。我的nodelist.cpp工作正常,虽然这个程序运行,但当我输入节点值时,我的程序崩溃了。有什么帮助吗?
这是我的节点列表文件:
#include <iostream>
#include "NodeList.h"
using namespace std;
nodelist::nodelist(){
head = NULL;
current = NULL;
temp = NULL;
}
void nodelist::addNode(int node_id_){
nodePtr n = new Node;
n->next = NULL;
n->node_id = node_id_;
if(head!=NULL)
{
current = head;
while(current->next != NULL)
{
current = current ->next;
}
current->next = n;
}
else
{
head = n;
}
}
void nodelist::deleteNode(int del_node){
nodePtr delPtr = NULL;
temp = head;
current = head;
while(current!=NULL&¤t->node_id!=del_node){
temp = current;
current = current->next;
}
if (current == NULL)
{
cout << del_node<<" does not exist"<<endl;
delete delPtr;
}
else
{
delPtr = current;
current = current->next;
temp->next= current;
delete delPtr;
cout << del_node<< " has been deleted"<<endl;
}
}
void nodelist::print(){
current = head;
while(current != NULL){
cout << current->node_id<<endl;
current = current ->next;
}
}
编辑:所以现在它在我创建一个类型为nodelist的新对象时有效,但是当我传入node1和node2的值时,我得到一个与任一节点都不对应的连续循环。但是,如果我在main()中执行此操作,则可以正常工作。
答案 0 :(得分:2)
声明指针是不够的,您需要使用new运算符来实例化它们指向的节点列表。
n1和n2没有指出崩溃的原因
nodelist *n1;
nodelist *n2;
n1->addNode(node1);
n2->addNode(node2);
答案 1 :(得分:2)
nodelist *n1; // unintialized pointer
nodelist *n2; // another uninitialized pointer
n1->addNode(node1); // you try to use an uninitialized pointer
n2->addNode(node2); // same here
n1->print(); // and here
n2->print(); // and here!
如果您没有看到如何声明/实施链接列表类,那么很难为您的整体问题提供潜在的解决方案。但是,崩溃是由于您尝试访问随机内存块并将其视为nodelist
对象(例如未定义的行为)引起的。