数据结构——链表删除结点的问题。

大神帮我看看我自己编写的链表删除节点的程序对不。如果哪里错了,麻烦帮我改正,谢谢了!voidDelete(structStudent*Head,intnum){struc... 大神帮我看看我自己编写的链表删除节点的程序对不。如果哪里错了,麻烦帮我改正,谢谢了!

void Delete(struct Student *Head,int num)
{
struct Student *p1,*p2;
if(Head->Next=NULL)
printf("该表是空表!");//空表
p1=Head->Next;
if(p1->Number==num)
Head->Next=p1->Next;//删除链表第一个数据
while(p1->Next!=NULL)
{
p2=p1;
p1=p1->Next;
}
if(p1->Number==num)
p2->Next=NULL;//删除链表最后一个数据
while(p1->Next!=NULL)
{
p2=p1;
p1=p1->Next;
if(p1->NUmber==num)
p2->Next=p1->Next;break;//删除中间的数据
}
}
我还想问下,我第一个循环遍历,是想让循环结束后,p1指向链表最后一个元素。我的想法对吗?
展开
 我来答
蓦然prince
2012-10-24 · TA获得超过255个赞
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:107万
展开全部
同学你好:我看了你的程序:注释了你看一下;最主要的错误时没有释放你删除的节点,
再有每次你都要从首节点开始遍历查找所以,p1要始终指向首节点
希望你能采纳
void Delete(struct Student *Head,int num)
{
struct Student *p1,*p2;
if(Head->Next=NULL)//Head->Next == NULL ;是这里错了
printf("该表是空表!");//空表
p1=Head->Next;
if(p1->Number==num)
Head->Next=p1->Next;//删除链表第一个数据

free(p1);//要释放到你删除的节点,否则会造成内存泄露
p1 = Head->Next;//让p1继续指向第一个有效节点

while(p1->Next!=NULL)
{
p2=p1;
p1=p1->Next;
}
if(p1->Number==num)
p2->Next=NULL;//删除链表最后一个数据

free(p1);//要释放到你删除的节点,否则会造成内存泄露
p1 = Head->Next;//让p1继续指向第一个有效节点

while(p1->Next!=NULL)
{
p2=p1;
p1=p1->Next;
if(p1->NUmber==num)
p2->Next=p1->Next;

free(p1);//要释放到你删除的节点,否则会造成内存泄露

break;//删除中间的数据
}
}
zyh1141298056
2012-10-24 · TA获得超过1308个赞
知道小有建树答主
回答量:500
采纳率:100%
帮助的人:595万
展开全部
按照你传入的参数来看,你的实现的功能是在链表当中删除Number的值为num的结点,但是你的第一个循环只是做了遍历,并没有判断是否相等的相关操作,而且,一般删除结点的操作不仅仅是要把它从链表里拿掉,还要释放掉这个结点的空间。下面的代码是在你的代码的基础上改的,只删除了一个结点,如果你要删除所有值为num的结点的话,也只要改动一点点就行了
void Delete(struct Student *Head,int num)
{
struct Student *p1,*p2;
if(Head->Next=NULL)
 {
  printf("该表是空表!");//空表
   return ;
}
p1=Head->Next;
if(p1->Number==num)
{
Head->Next=p1->Next;//删除链表第一个数据
free(p1);
return ;
}
while(p1 !=NULL)
{
if (p1->Number == num)
{
p2->next = p1->next;
free(p1);
return ;
}
p2=p1;
p1=p1->Next;

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
YubeiMan
2012-10-24
知道答主
回答量:33
采纳率:0%
帮助的人:3万
展开全部
if(Head->Next=NULL)
printf("该表是空表!");//空表
else
{

p1=Head->Next;
if(p1->Number==num)
Head->Next=p1->Next;//删除链表第一个数据
while(p1->Next!=NULL)
{
p2=p1;
p1=p1->Next;
}
if(p1->Number==num)
p2->Next=NULL;//删除链表最后一个数据
while(p1->Next!=NULL)
{
p2=p1;
p1=p1->Next;
if(p1->NUmber==num)
p2->Next=p1->Next;break;//删除中间的数据
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-10-25
展开全部
p1要始终指向首节点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式