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;
} 展开
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;
} 展开
4个回答
展开全部
伪代码:
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
}
代码就是这样的。很简单。这段代码并不能编译,你加上类型就好了。我强调的是方法。
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
}
代码就是这样的。很简单。这段代码并不能编译,你加上类型就好了。我强调的是方法。
展开全部
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后要重新给值
{
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后要重新给值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
全部遍历一次,while(p!=NULL)就可以了把if判断放到while里面,还有你的那个头结点是不应该放数据的,不需要判断
追问
谢谢你><
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
没有上机,楼主可以测试一下。
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;
}
没有上机,楼主可以测试一下。
追问
谢谢你><
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询