我试图为我的链接列表创建一个函数,在我的程序结尾添加一个节点。我在我的节点中使用前向链接时出现错误,表明"访问冲突读取位置0xccccccd8"。它将该行指向我的add函数中while循环的开头。任何建议都非常感谢。谢谢你提前。
我的添加,打印和showList功能:
./liquibase update
节点和列表类:
void List::Add(char data, char* dataString)
{
Node* n5;
n5 = new Node;
n5->data = data;
n5->dataString = dataString;
while (nodes->linkf != NULL)
{
nodes = nodes->linkf;
}
nodes->linkb = n5;
//n5->linkb = List::nodes;
//n5->linkf = NULL;
}
void List::showList(int dir)
{
if (dir==1){
while (nodes !=NULL)
{
Print();
nodes = nodes->linkf;
}
cout<<"\n";
}
if (dir==0){
while(nodes != NULL)
{
Print();
nodes = nodes->linkb;
}
cout<<"\n";
}
}
void List::Print()
{
cout<<" \n";
cout<<nodes->data;
cout<<nodes->dataString;
cout<<" \n";
}
主:
class Node
{
public:
Node(){
char data[5];
dataString=new(char[10]);
}
~Node(){};
Node *linkb;
char data;
char* dataString;
Node *linkf;
};
class List{
public:
Node* nodes;
List(){}
void Add(char data, char*dataString);
void showList(int);
void Print();
string entry;
};
答案 0 :(得分:0)
查看代码时,您从未将指针设置为null
,这意味着它们只会在构造时获取内存中的任何垃圾值。在node
类构造函数中,您应该初始化指向null
的所有指针:
Node()
: linkb(nullptr), linkf(nullptr)
{
char data[5];
dataString=new(char[10]);
}
您应该对list
类
答案 1 :(得分:0)
问题在于:
当您致电myList.Add(data, dataString);
时,myList.nodes
的内容未确定,因为没有人初始化它。
void List::Add(char data, char* dataString)
{
Node* n5;
n5 = new Node;
n5->data = data;
n5->dataString = dataString;
while (nodes->linkf != NULL) // nodes is undetermined here and therefore
// dereferencing it crashes the program
{
nodes = nodes->linkf;
}
nodes->linkb = n5;
//n5->linkb = List::nodes;
//n5->linkf = NULL;
}
如果使用(猜测是什么)调试器在30个seconbds中找到它。
但是代码中的其他地方很可能存在更多问题,整个代码看起来很可疑。
答案 2 :(得分:0)
所以我刚刚解决了它,尽管在技术上仍然存在很多错误和编写错误的代码。当我在main中声明节点等于n1时,我使用了另一个List对象来添加函数。
之前的代码:
l1->nodes = n1;
myList.Add(data, dataString);
我的代码现在:
l1->nodes = n1;
l1->Add(data, dataString);