所以我整天都在研究这个程序,所以我可能只是筋疲力尽,但对于我的生活,我无法弄清楚为什么我的显示函数在第一次完成打印后终止程序。我真的需要能够在每个输入循环上打印整个列表。我尝试通过将其包装在循环中并添加 print 语句进行测试来调试它,整个程序运行良好,除了在我打印列表后它终止的事实。
#include<iostream>
using namespace std;
class Node
{
public:
int data;
Node *next;
Node()
{
next = 0;
}
Node(int data)
{
this->data = data;
}
};
class list
{
private:
int Count = 0;
Node *start;
public:
list()
{
start = 0;
}
void display()
{
Node *temp = new Node;
temp = start;
while (temp != 0)
{
cout << temp->data << " ";
temp = temp->next;
}
}
bool insert(int value)
{
Node *newNode = new Node(value);
Node *temp = new Node;
Node *cur = new Node;
Node *pre = new Node;
int track = 0;
cur = start;
if (start == 0)
{
start = newNode;
Count++;
}
else if (value < cur->data)
{
temp->data = value;
temp->next = start;
start = temp;
Count++;
}
else
for (int i = 0; i < Count; i++)
{
if (value > cur->data)
{
pre = cur;
cur = cur->next;
track++;
}
}
if (track > 0)
{
temp->data = value;
pre->next = temp;
temp->next = cur;
Count++;
}
return true;
}
};
int main(void)
{
int input = 0;
list obj;
while (input != -1)
{
cout << "Enter a value: ";
cin >> input;
if (input != -1)
obj.insert(input);
obj.display();
}
}
;
Node(int data){this->data=data;}
采用int
的Node
构造函数仅初始化data
,而不初始化next
。
所以在
Node *newNode=new Node(value);
newNode
指向带有垃圾next
指针的Node
。
第一次通过insert()
进入此分支时:
if(start==0){
start = newNode;
然后,以下对display()
的调用将执行此代码:
temp=start;
while(temp!=0){
cout<<temp->data<<" ";
temp=temp->next; // Bang! temp->next is garbage.
最后一行具有未定义的行为:您正在尝试使用未初始化的指针值并将其分配给temp
。这最迟可能会在cout<<temp->data
(在循环的下一次迭代中(崩溃。