C语言的单向链表删除节点的问题

比如说我建立一个职工年龄和序号的链表,然后里面有两个人是30岁的。现在要删除30岁的所有节点,应该怎么写算法和程序呀。我写的是这样的,只能删除一个structnode*D... 比如说我建立一个职工年龄和序号的链表,然后里面有两个人是30岁的。现在要删除30岁的所有节点,应该怎么写算法和程序呀。我写的是这样的,只能删除一个
struct node*DeletNode(struct node*head,int delet_age){
struct node*p,*q;
if(head->age==delet_age){
p=head;
head=p->next;
free(p);
return head;
}
q=p=head;
while(p!=NULL &&p->age!=delet_age){
q=p;
p=p->next;
}
if(p!=NULL){
q->next=p->next;
free(p);
return head;
}
return head;
}
展开
 我来答
201007031324
2013-10-11 · TA获得超过1239个赞
知道小有建树答主
回答量:505
采纳率:0%
帮助的人:233万
展开全部
伪代码:
if node.age ==30
delete(node)

delete是封装好了的代码

删除一个节点的步骤:
如我有一个链表:A B C D 四个元素
我要删除B,则有
p =A.next
A.next = p.next
free(p)

主要是思想对就行,一定要封装

你这个属于那种在线删除
就是先查找,如果符合条件,就删除。
删除操作,必须知道有删除的节点的前一个节点的地址才行。
那么你应该每次查找的时候不是判断当前节点是否符合要求,而是判断下一个节点。如果符合就按照删除节点的删除来。
删除操作的三部曲:
第一步:保存删除节点的地址
第二步:将删除节点的前一个节点的指针域指向删除节点的下一个
第三部:free 需要删除节点

我现在直接在这里写代码了

void del(head,age)
{
p = head;
while(p)
{
if( p->next && p->next->age == age )//删除操作的三步曲
{
q=p->next;
p->next = q ->next;
free(q);
}//end if
p = p->next;
}//end while
}

代码就是这样的。很简单。这段代码并不能编译,你加上类型就好了。我强调的是方法。
百度网友3ba4e485ce
2019-06-02 · TA获得超过3718个赞
知道大有可为答主
回答量:3258
采纳率:32%
帮助的人:238万
展开全部
if(ptemp->inumber==a)//用于判断学号是否等于输入值
{
if(i==0)//若果是头结点
{
phead=ptemp->pnext;
free(ptemp);
icount--;
ptemp=phead//add
}
else//不是头结点
{
ppre->pnext=ptemp->pnext;
free(ptemp);
icount--;
ptemp=ppre//add
}
}
ppre=ptemp;
ptemp=ptemp->pnext;
每回释放ptemp后要重新给值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
青春無情
2013-10-11 · TA获得超过238个赞
知道答主
回答量:100
采纳率:0%
帮助的人:29.4万
展开全部
全部遍历一次,while(p!=NULL)就可以了把if判断放到while里面,还有你的那个头结点是不应该放数据的,不需要判断
追问
谢谢你><
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xumin10419
2013-10-11 · TA获得超过271个赞
知道答主
回答量:136
采纳率:100%
帮助的人:89.3万
展开全部
struct node*DeletNode(struct node*head,int delet_age){
struct node*p,*q;
//从头查找到尾,无论元链表是否有序,效率低
while((head->age==delet_age) && (head != NULL)){//第一个元素就是目标
q=head;

head = head->next;

free(q);

}

p=head;
while(p!=NULL){//从头部开始的所有目标已被删除,接着查找并删除后面是否还有目标
if(p->age==delet_age){
q=p;

p=p->next;

free(q);

}
p=p->next;
}

return head;
}

没有上机,楼主可以测试一下。
追问
谢谢你><
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式