数据结构——链表删除结点的问题。
大神帮我看看我自己编写的链表删除节点的程序对不。如果哪里错了,麻烦帮我改正,谢谢了!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指向链表最后一个元素。我的想法对吗? 展开
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指向链表最后一个元素。我的想法对吗? 展开
展开全部
同学你好:我看了你的程序:注释了你看一下;最主要的错误时没有释放你删除的节点,
再有每次你都要从首节点开始遍历查找所以,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;//删除中间的数据
}
}
展开全部
按照你传入的参数来看,你的实现的功能是在链表当中删除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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;//删除中间的数据
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-10-25
展开全部
p1要始终指向首节点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |