C语言学习记录4 — 链表3

链表3 — 单链表结点删除

局部代码详解

目的:实现单链表数据为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
//删除结点函数
void del(List *head,int x){
if (head == NULL) {
return;
}
//单独判断头结点,如果为x则删除
if (head->d == x) {
List *temp = head;
head = head->next;
free(temp); //删除结点(释放内存)
}
//定义结构体指针
List *p = head;

//头节点判断结束,顺序判断各结点是否需要删除
while (p->next != NULL) {
if (p->next->d == x) {
List *temp = p->next; //将需要删除的结点储存在结构体指针temp中
p->next = p->next->next; //将指针移动到下一结点处
free(temp); //删除结点(释放内存)
}else {
p = p->next; //不需要删除时,判断下一结点是否删除
}
}
return;
}

完整代码实现

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <stdlib.h>

//定义结点
typedef struct LinkList{
int d;
struct LinkList *next;
} List;

//尾插法
List *add_list(List *head, int data){
List *newnode = (List *)malloc(sizeof(List));

newnode->d = data;
newnode->next = NULL;

if (head ==NULL) {
head = newnode;
}else {
List *pT = head;
while (pT->next != NULL) {
pT = pT->next;
}
pT->next = newnode;
}
return head;
}

//输出函数
void output(List *head){
List *pT = head;
while (pT != NULL) {
printf("%d",pT->d);
printf(" ");
pT = pT->next;
}
}

//删除结点函数
void del(List *head,int x){
if (head == NULL) {
return;
}

if (head->d == x) {
List *temp = head;
head = head->next;
free(temp);
}

List *p = head;
while (p->next != NULL) {
if (p->next->d == x) {
List *temp = p->next;
p->next = p->next->next;
free(temp);
}else {
p = p->next;
}
}
return;
}

int main() {
int n,i,x;
List *head = NULL;
scanf("%d",&n);
getchar();
scanf("%d",&x);
int a[n];

for (i=0; i < n; i++) {
scanf("%d",&a[i]);
getchar();
}
for (i=0; i < n; i++) {
head = add_list(head, a[i]);
}
del(head,x); //调用删除结点函数
output(head);
return 0;
}

C语言学习记录4 — 链表3
http://example.com/post/text6-cstudy-4.html
作者
Destiny
发布于
2024年4月8日
更新于
2024年5月24日
许可协议