删除带头结点的链表中所有值为x的结点

题目描述

假设用带头结点的单链表作为线性表的存储结构,编写算法,删除线性表中所有值为x的结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdlib.h>
//链表的结构体定义
typedef struct Link{
int elem;
struct Link *next;
}link;

//链表初始化函数
link *initLink(){
//先搞个头结点粗来
link *p=(link*)malloc(sizeof(link));
//再弄个工作指针,初始指向头结点p
link *temp=p;
for(int i=1;i<5;++i){
//想初始化,得有原料,那就是一个一个的节点,现在还没有节点,那先搞一个粗来
link *a=(link*)malloc(sizeof(link));
//光有空壳不够,该赋值了(对link结构体中的elem赋值)
a->elem=i;
//有了原料节点,就用一根绳子把它们串起来(对link结构体中的next指针赋地址值)
temp->next=a;//串起来啦
temp=a;//工作指针temp后移,准备迎接下一个节点的到来
}
printf("\n");//为了颜值和正义而生
//串完之后,原来的头结点p身后就有了一大堆节点
return p;//return试试看
}

//打印初始化好的链表元素函数
void display(link *p){
link *x=p;//x初始指向头结点
while(x->next){
x=x->next;
printf("%d",x->elem);
}
printf("\n");
}
link *del(link *p,int x){
link *r=p->next;//r用来自遍历,初始指向第一个元素节点
link *q=p;//q是r的前驱
while(r!=NULL){
if(r->elem!=x){
q=r;
r=r->next;
}//if
else{
q->next=r->next;
r=r->next;
}//else

}//while
return q;
}
int main(){
//初始化链表(1,2,3,4)
printf("初始化链表为:\n");
link *p=initLink();
display(p);

printf("删除链表中元素值为4的结点之后的链表为:\n");
del(p,4);
display(p);
}

运行结果

1
2
3
4
初始化链表为:
1234
删除链表中元素值为4的结点之后的链表为:
123
凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条