ch2_线性表_链表的增删改查

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdio.h>
#include <stdlib.h>

typedef struct Link{
int elem;
struct Link *next;
}link;
link * initLink();
//链表插入的函数,p是链表,elem是插入的结点的数据域,add是插入的位置
link * insertElem(link * p,int elem,int add);
//删除结点的函数,p代表操作链表,add代表删除节点的位置
link * delElem(link * p,int add);
//查找结点的函数,elem为目标结点的数据域的值
int searchElem(link * p,int elem);
//更新结点的函数,newElem为新的数据域的值
link *amendElem(link * p,int add,int newElem);
void display(link *p);

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

printf("在第4的位置插入元素5:\n");
p=insertElem(p, 5, 4);
display(p);

printf("删除元素3:\n");
p=delElem(p, 3);
display(p);

printf("查找元素2的位置为:\n");
int address=searchElem(p, 2);
if (address==-1) {
printf("没有该元素");
}else{
printf("元素2的位置为:%d\n",address);
}
printf("更改第3的位置上的数据为7:\n");
p=amendElem(p, 3, 7);
display(p);

return 0;
}

link * initLink(){
link * p=(link*)malloc(sizeof(link));//创建一个头结点
link * temp=p;//声明一个指针指向头结点,用于遍历链表
//生成链表
for (int i=1; i<5; i++) {
link *a=(link*)malloc(sizeof(link));//a在每次循环中是变化的
a->elem=i;
a->next=NULL;
temp->next=a;
temp=temp->next;
}
return p;
}


//p是已经创建好的链表,add是待插入的位置,elem是元素值
link * insertElem(link * p,int elem,int add){
link *temp=p;//创建一个工作指针
//找到插入位置的前一个位置,并用temp指向它
for(int i=0;i<add-1;i++){
temp=temp->next;
}
//开始准备一个插入结点
link *a=(link*)malloc(sizeof(link));
a->elem=elem;
a->next=temp->next;
temp->next=a;//至此插入完毕
return p;

}


//add是待删除的结点的位置(第几个,从1开始,不是下标)
link * delElem(link * p,int add){
link *temp=p;//创建一个工作指针指向p,即头结点
//来到待删除位置的前驱位置
for(int i=0;i<add-1;i++){
temp=temp->next;
}
//把待删除结点用q指向
link *q;
q=temp->next;
temp->next=q->next;
free(q);
return p;
}

int searchElem(link * p,int elem){
link *temp=p->next;//temp指向首元结点,因为含有头结点
int i=1;
while(temp){
if (temp->elem==elem){
return i;
}
temp=temp->next;
i++;

}
return -1;//若程序能运行到此处,说明查找失败
}

//add是待更新位置
link *amendElem(link * p,int add,int newElem){
link *temp=p;//设置一个工作指针,初始指向头结点
//循环来到add处
for(int i=0;i<add;i++){
temp=temp->next;
}//到add处啦
temp->elem=newElem;//开始更新
return p;
}
void display(link *p){
link* temp=p;//将temp指针重新指向头结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (temp->next) {
temp=temp->next;
printf("%d ",temp->elem);
}
printf("\n");
}

运行结果

1
2
3
4
5
6
7
8
9
10
初始化链表为:
1 2 3 4
在第4的位置插入元素5:
1 2 3 5 4
删除元素3:
1 2 5 4
查找元素2的位置为:
元素2的位置为:2
更改第3的位置上的数据为7:
1 2 7 4

凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条