数据结构——链表删除结点的问题。
答案:4 悬赏:20 手机版
解决时间 2021-03-01 04:33
- 提问者网友:人生佛魔见
- 2021-02-28 18:28
数据结构——链表删除结点的问题。
最佳答案
- 五星知识达人网友:夜余生
- 2021-02-28 18:34
同学你好:我看了你的程序:注释了你看一下;最主要的错误时没有释放你删除的节点,
再有每次你都要从首节点开始遍历查找所以,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;//删除中间的数据
}
}
再有每次你都要从首节点开始遍历查找所以,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;//删除中间的数据
}
}
全部回答
- 1楼网友:你哪知我潦倒为你
- 2021-02-28 20:47
p1要始终指向首节点
- 2楼网友:duile
- 2021-02-28 20:04
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;//删除中间的数据
}
}
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;//删除中间的数据
}
}
- 3楼网友:廢物販賣機
- 2021-02-28 19:57
按照你传入的参数来看,你的实现的功能是在链表当中删除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;
}
}
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;
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯