C++链表头结点删除问题

yushuqianqian 2012-07-21 08:34:00
#include <iostream>
using namespace std;
class book
{
public:
int num;
float price;
book *next;
};
book *head=NULL; //全局指针
book *creat()
{
book *p1,*p2;
p1=new book;
head=p1;
p2=p1;
while (1)
{
cout<<"请输入编号:";
cin>>p1->num;
if (p1->num!=0)
{
p2=p1;
cout<<"请输入价格:";
cin>>p1->price;
p1=new book;
p2->next=p1;
}
else
{
delete p1;
p2->next=NULL;
break;
}
}
return head;
}
void showbook(book *head)
{
cout<<"图书信息如下:"<<endl;
while(head)
{
cout<<"编号:"<<head->num;
cout<<"价格:"<<head->price<<endl;
head=head->next;
}
}
void deletebook(book *head,int num)
{
book *p1;
if (head->num==num)
{
p1=head;
::head=head->next; //head是一个全局指针
delete p1;
cout<<"操作成功"<<endl;
return;
} //删除头结点
while(head)
{
if(head->next==NULL)
{
cout<<"找不到要删除的节点"<<endl;
return;
}
if(head->next->num==num)
{
p1=head->next;
head->next=p1->next;
delete p1;
cout<<"操作成功"<<endl;
return;
}
head=head->next;
}
cout<<"找不到需要删除的节点"<<endl;
}

int main()
{
int num;
book *head;
head=creat();
showbook(head);
cout<<"请输入要删除的节点:";
cin>>num;
deletebook(head,num);
showbook(head);
return 0;
}


在运行时删除头节点时会出现乱码,同时系统崩溃。
求高手解答!
...全文
423 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
linguangliang 2012-07-27
  • 打赏
  • 举报
回复
去掉main函数中局部定义的head,因为deletebook删除头结点后修改的仅仅是全局的head,这样继续在main中使用局部head显示链表就会出现内存异常(使用了野指针),劝你认认真真把这段代码修改一下!!代码不够清晰
zfk198687 2012-07-26
  • 打赏
  • 举报
回复
ok了。楼主既然定义了全局变量head,为什么又在main函数定义一个局部变量head?这样你删除时传进去的head是局部的head,而全局的不会变。局部的head在退出deletebook()时不会传到main函数。接下来showbook()用的是全局的head,全局的head指向的地址没变,但是被delete了所以程序崩溃。
应该这样:

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

book *head;

book *creat()
{
book *p1,*p2;
p1=new book;
head=p1;
p2=p1;
while (1)
{
cout<<"请输入编号:";
cin>>p1->num;
if (p1->num!=0)
{
p2=p1;
cout<<"请输入价格:";
cin>>p1->price;
p1=new book;
p2->next=p1;
}
else
{
delete p1;
p2->next=NULL;
break;
}
}
return head;
}
void showbook(book *head)
{
cout<<"图书信息如下:"<<endl;
while(head)
{
cout<<"编号:"<<head->num;
cout<<"价格:"<<head->price<<endl;
head=head->next;
}
}
void deletebook(int num)
{
book *p1;
if (head->num==num)
{
p1=head;
head=head->next; //head是一个全局指针
delete p1;
cout<<"操作成功"<<endl;
return;
} //删除头结点
while(head)
{
if(head->next==NULL)
{
cout<<"找不到要删除的节点"<<endl;
return;
}
if(head->next->num==num)
{
p1=head->next;
head->next=p1->next;
delete p1;
cout<<"操作成功"<<endl;
return;
}
head=head->next;
}
cout<<"找不到需要删除的节点"<<endl;
}

int main()
{
int num;
head=creat();
showbook(head);
cout<<"请输入要删除的节点:";
cin>>num;
deletebook(num);
showbook(head);
system("pause");
return 0;
}


zfk198687 2012-07-23
  • 打赏
  • 举报
回复
调试几回,在deletebook()函数中已经释放内存了,并且head已经等于下个结点了,为什么返回到主函数main()时,head又成了已经删除的内存地址了?求高手指导!
yushuqianqian 2012-07-23
  • 打赏
  • 举报
回复
程序崩溃
ppsharp 2012-07-23
  • 打赏
  • 举报
回复
分数太少了
x363635334 2012-07-21
  • 打赏
  • 举报
回复
看的有点不耐烦了,系统崩溃还是程序崩溃,吓人啊
程序奔溃我一般调试delete p1;这样的句子

65,187

社区成员

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

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