在带头结点的单链表中:
一、删除第一个值为x的结点:
先循环找到值为x的结点,并对其进行删除操作;
注意:当找到第一个值为x的节点时;就不再接着往下寻找!
#include <stdio.h>
#include <stdlib.h>
#include "Untitled1.h"
void delx(linklist head,datatype x)
{
linklist p,q;
p=head->next;
q=NULL;
while (p&&p->info!=x) //找到值为x的结点
{
q=p;
p=p->next;
}
if (p) //判断p是否为空
{
q->next=p->next; //进行删除操作
free(p); //回收p的空间
}
return head;
}
int main()
{
datatype x;
linklist head;
head=creatbyqueue();
print(head);
printf("请输入想删除的值:");
scanf("%d",&x);
delx(head,x);
print (head);
return 0;
}
二、删除所有值为x的结点:
循环找到所有值为x的结点,并对它们都进行删除操作
注意:只有遍历所有结点后,循环才停止!
#include <stdio.h>
#include <stdlib.h>
#include "Untitled2.h"
void linklist_delallx(linklist head,int x)
{
linklist p,q;
p=head->next;
q=NULL;
while (p) //遍历链表
{
while(p&&p->info!=x) //寻找值为x的结点
{
q=p;
p=p->next;
}
if(q==NULL) //判断是否为头结点后的第一个结点(特殊情况)
{
head->next=p->next;
p=head->next;
}
else
{
if(p)
{
q->next=p->next; //进行删除操作
p=q->next;
}
}
}
return head;
}
int main()
{
linklist head;
int x;
head=creatbyqueue();
print(head);
printf("请输入要删除的值:");
scanf("%d",&x);
linklist_delallx(head,x);
print(head);
return 0;
}
最后感谢观看!!!