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

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;
}

需要删除五十分以下的节点,可是我的只能删除一个结点,无法删除多个,那个大牛能帮忙看看原因啊!!!

第1个回答  2015-10-30
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);本回答被网友采纳
第2个回答  2011-05-25
一个一个的循环。。慢慢删追问

额,我知道啊,可是一直没循环成功···所以才来问的····

追答

while((p1->score>=50)&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
你不觉得这个有点问题吗?
如果你第一个人的分数就不到50。。自然就不会进入循环。。更改成
while(p1->next!=NULL)
你的while循环实际上只是在一步一步的移指针。。把你删除节点的代码段,剪切进循环内部。
注意检查下判断条件。

本回答被提问者采纳
相似回答