c语言链表怎么删除多个节点啊

structstudent*delete(structstudent*head){structstudent*p1=head,*p2;if(head==NULL){pri... struct student *delete(struct student *head)
{
struct student *p1=head,*p2;
if(head==NULL)
{
printf("List is null!\n");
}
while((p1->score>=50)&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->score<50)
{
if(p1==head)
{
p2=p1->next;
free(head);
return p2;
}
else
{
p2->next=p1->next;
free (p1);
}
n=n-1;
}
else printf("No student's score under 50!\n");
return head;
}

需要删除五十分以下的节点,可是我的只能删除一个结点,无法删除多个,那个大牛能帮忙看看原因啊!!!
展开
 我来答
tattackor
2015-10-30 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:891万
展开全部
1、让x节点的前置节点的向后指针域指向x节点的向后指针域指向的节点;
让x节点的后续节点的向前指针域指向x节点的向前指针域指向的节点;
释放x节点;
p->llink->rlink= p->rlink;
p->rlink->llink= p->llink;
free(X);
当然,如果双向链表不是循环链表,带头指针这些,还需要考虑X节点作为第一个节点或者最后一个节点的特殊情况。

2、temp=p;
p=p->next;
temp->next=NULL;
这三句存在问题,temp=p,让temp指向p所指向的节点,p=p->next,p指向后移
temp->next=NULL,让temp的后继为空,这里出了问题,链表从temp指向的节点断开,相当于删除p之后的所有节点。

应该先判断p是不是最后节点
if(p->next==NULL)
如果是,只好去找p的前趋pre,让pre->next=NULL,free(p)
如果不是最后节点,将p的后继节点数值域复制给p,然后将p的后继节点删除,等同与删除p
p->data=p->next->data;
p->next=p->next->next;
free(p);
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kissofblueice
2011-05-25 · TA获得超过471个赞
知道小有建树答主
回答量:814
采纳率:100%
帮助的人:583万
展开全部
一个一个的循环。。慢慢删
追问
额,我知道啊,可是一直没循环成功···所以才来问的····
追答
while((p1->score>=50)&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
你不觉得这个有点问题吗?
如果你第一个人的分数就不到50。。自然就不会进入循环。。更改成
while(p1->next!=NULL)
你的while循环实际上只是在一步一步的移指针。。把你删除节点的代码段,剪切进循环内部。
注意检查下判断条件。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式