c ++:链接列表错误"访问违规阅读位置"

时间:2017-11-07 13:26:30

标签: c++ linked-list

我试图为我的链接列表创建一个函数,在我的程序结尾添加一个节点。我在我的节点中使用前向链接时出现错误,表明"访问冲突读取位置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;
};

3 个答案:

答案 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);