为什么链表中最后一个节点删除以后依然会被输出?

xbb223 2009-05-01 05:35:20
为什么链表中最后一个节点删除以后依然会被输出?我在C语言中也遇到过,程序这样写的



#include <iostream>
#include <string>
using namespace std;
class book
{
public:
int num;
float price;
book *next;
};

book *creat()
{
book *head=NULL,*p1=NULL,*p2=NULL;
string s;
cout<<"请输入编号"<<endl;
cin>>s;
if(atoi(s.c_str()))
{
p1=new book;
head=p2=p1;
}
p1->num=atoi(s.c_str());
while(p1->num!=0)
{
cout<<"请输入价格"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
p2=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num;
}
p1=NULL;
delete p1;
p2->next=NULL;
return head;

}

void show(book *p)
{
cout<<"图书信息:"<<endl;
while (p)
{
cout<<p->num<<"\t"<<p->price<<endl;
p=p->next;
}

delete p;
}

void main()
{
book *head;
head=creat();
show(head);
}


这样会输出最后一个节点得到信息,为什么呢?谢谢!
...全文
350 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyun1987 2009-05-02
  • 打赏
  • 举报
回复
p1=NULL;
delete p1;
p2->next=NULL;
return head;
程序会崩溃的原因是当p1->num为0时候,那么p1,p2都指向了最后一个节点 你delete p1之后 p2所指向的空间也被释放了 然后又p2->next 相当于你操作野指针的next 程序当然会崩溃
如果你希望最后一个节点信息不显示 像下面这样改一下
while(p1->num!=0)
{
cout<<"请输入价格"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num;
if(p1->num == 0)
break; //当输入0时 程序跳出 p2指向倒数第二个 p1指向倒数第一个
p2=p1; 当不为0时 指向同一个
}
delete p1; //先释放空间
p1=null; //再=null 这样才是正确的
p2->next=NULL;
return head;
na2650945 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shexinwei 的回复:]
C/C++ code
book *creat()
{
book *head=NULL,*p1=NULL,*p2=NULL;
string s;
cout<<"请输入编号"<<endl;
cin>>s;
if(atoi(s.c_str()))
{
p1=new book;
head=p2=p1;
}
p1->num=atoi(s.c_str());
while(p1->num!=0)
{
cout<<"请输入价格"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
p2=p1;

[/Quote]
貌似正解。
zhhui_syist 2009-05-02
  • 打赏
  • 举报
回复
book *head=NULL,*p1=NULL,*p2=NULL;
book *p3=NULL;
string s;
cout<<"请输入编号"<<endl;
cin>>s;
if(atoi(s.c_str()))
{
p1=new book;
head=p2=p3=p1;
}
p1->num=atoi(s.c_str());
while(p1->num!=0)
{
cout<<"请输入价格99"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
p3=p2;
p2=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num;
}

delete p1;
p1=NULL;
p3->next=NULL;
return head;

}
xbb223 2009-05-02
  • 打赏
  • 举报
回复
谢谢各位,知道原因咯
yangkunhenry 2009-05-02
  • 打赏
  • 举报
回复
代码最好重写下,如果第一次直接输入0,就出现没有new却delete的情况了
光宇广贞 2009-05-01
  • 打赏
  • 举报
回复
p1=NULL;
delete p1;
p2->next=NULL;
return head;
这几行是什么意思?delete一个指向null的指针?

p2=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num;
}

你最循环后最让 p2 = p1 ,你delete p1 ,那 p2 也没用了,你然后让 p2->next=NULL; 能不死么……

太不仔细了!

再说,就因为非法使用野指针而出错,就去delete一个空指针?
而且你的程序没有对指针申请的堆空间进行清理,你的内存里面将满是垃圾……别以为是小程序就不关心了。
xbb223 2009-05-01
  • 打赏
  • 举报
回复

p1=NULL; //这里让p1指向为空,所以下面的delete p1;没用
delete p1; //没起到作用
p2->next=NULL; //p2指向最后的一个节点,此处让最后一个节点的下一个为NULL,最后一个节点未删除
return head;

}


但是如果不用p1=NULL;会崩溃
liliangbao 2009-05-01
  • 打赏
  • 举报
回复
p1=NULL;
delete p1;
p2->next=NULL;//这里退去循环后p1=p2,所以虽然释放了该节点但是p2仍然指着该节点并将它连入了链表~
修改:
cout<<"请输入价格"<<endl;
cin>>p1->price;
while(p1->num!=0)
{
p1=new book;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num;
if(p1->num == 0)
break;
cout<<"请输入价格"<<endl;
cin>>p1->price;
p2->next=p1;
p2=p1;
}




pengzhixi 2009-05-01
  • 打赏
  • 举报
回复
char ch;
while(ch!='n'||ch!='N')
{
cout <<"请输入价格" <<endl;
cin>>price;
cout<<"请输入编号:"<<endl;
cin>>num;
p1=new book;
p1->price=price;
p1->num=num;
p2->next=p1;
p2=p1;
cout < <"请输入编号以0结束" < <endl;
cin>>ch;
}
pengzhixi 2009-05-01
  • 打赏
  • 举报
回复
while(p1->num!=0)
{
cout<<"请输入价格"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
p2=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num;//你这里最后的0编号作为p1->num的值,所以你最后的那个节点肯定是编号为0;你应该加个char字符
}
char ch;
while(ch!='n'||ch!='N')
{
cout<<"请输入价格"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
p2=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>ch;
}
shexinwei 2009-05-01
  • 打赏
  • 举报
回复

book *creat()
{
book *head=NULL,*p1=NULL,*p2=NULL;
string s;
cout<<"请输入编号"<<endl;
cin>>s;
if(atoi(s.c_str()))
{
p1=new book;
head=p2=p1;
}
p1->num=atoi(s.c_str());
while(p1->num!=0)
{
cout<<"请输入价格"<<endl;
cin>>p1->price;
p1=new book;
p2->next=p1;
p2=p1;
cout<<"请输入编号以0结束"<<endl;
cin>>p1->num; //当p1->num为0时候,那么p1,p2都指向了最后一个节点
}
p1=NULL; //这里让p1指向为空,所以下面的delete p1;没用
delete p1; //没起到作用
p2->next=NULL; //p2指向最后的一个节点,此处让最后一个节点的下一个为NULL,最后一个节点未删除
return head;

}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧