我的程序应该执行3次操作:
我的问题在于删除功能。这是代码:
void c_list::del()
{
int num;
if(isempty())
cout<<"List is Empty!"<<endl;
else
{
node *temp1=first;
node *temp2=NULL;
cout<<"Enter the number that u want to DELETE:"<<endl;
cin>>num;
while(temp1->next!=first && temp1->info != num)
{
temp2=temp1;
temp1=temp1->next;
}
if(num != temp1->info )
cout<<"your number was not found in the list"<<endl;
else
{
if(temp2!=NULL)
{
temp2->next=temp1->next;
cout<<temp1->info<<" was deleted"<<endl;
}
else
{
first=temp1->next;
cout<<temp1->info<<"was deleted"<<endl;
}
}
}
system("pause");
}
删除功能正在以这种方式工作:用户输入一个号码,程序搜索该号码&amp;当它找到号码时,将其从列表中删除。
现在的问题是,当用户输入列表中不存在的号码时,会出现“应用程序崩溃窗口”(我的意思是这个窗口:程序没有响应),而我提供了一条错误消息对于这种情况(“你的号码在列表中找不到”)!!
你能告诉我这是什么问题吗?
答案 0 :(得分:0)
发生这种情况,如果您插入一个不在列表中的数字,那么您在第一个时就会有一个循环。
所以:
node* temp1 = first;
node* temp2 = 0;
while(temp1->next!=first && !temp2) {
if(temp1->info == num) {
/* save pointer and exit from while */
temp2 = temp1;
} else {
temp1 = temp1->next;
}
}
然后你的代码产生垃圾,因为你从不调用删除。
很可能问题出在insert方法上,也就是说,你没有指定正确的指针。
然后,为什么系统(“暂停”); ?看看here。
答案 1 :(得分:0)
我认为在你的while循环中你到达列表的末尾并且 在下面的行temp1获得NULL之后。
=的temp1 temp1-&gt;接下来;
然后你试图从空指针读取info属性,这会导致错误。
if(num!= temp1-&gt; info)
我知道你说这是循环列表,但我不确定它是否正确实施。我的建议只是尝试在while循环后打印 temp1-&gt; info ,以确保列表的正确性和您的实现。
答案 2 :(得分:0)
您的插入例程未创建循环列表。当列表为空并且首先插入初始项时== NULL。在这种情况下,您的代码将列表保留为非循环状态。这是因为:
newitem->next=first;
if(first==NULL)
first=newitem;
此时first-&gt; next == NULL,在循环列表中绝不应该是这种情况。只要列表中不存在要查找的项目,您的搜索代码就会失败。这是因为它永远不会循环回到第一个节点,因为列表不是循环的。