C单链表操作模板

函数顺序依次为单链表的创建(头插和尾插法),初始化,判空,遍历,求链表长度,按值查找,按位查找,插入,删除,销毁操作 并且在主函数中举例说了链表的创建,遍历,求长,删除,插入操作;

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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#include <stdio.h>

#include <stdlib.h>


typedef int DataType; //用DataType 替代 int方便修改数据类型
typedef struct Node{
DataType data; //数据域
struct Node *next; //指针域
}Node;


//建立单链表(尾插法)
//比如说数据1 2 3 4 5
//链表中从头指针开始数据顺序为1 2 3 4 5
//每次从链表末尾插入
Node *CreatTailList(DataType a[],int n){
Node *s = NULL,*r = NULL;
Node *first = (Node *)malloc( sizeof(Node));
r = first;//尾指针初始化
first -> next = NULL;
int i = 0;
for(i;i < n;i++){
s = (Node*)malloc(sizeof(Node));
s -> data = a[i];
r-> next = s;
r = s; //将结点S插入到终端结点之后
}
r -> next = NULL; //终端结点指针指向NULL
return first;
}


//建立单链表(头插法)
//比如说数据1 2 3 4 5
//链表中从头指针开始数据顺序为5 4 3 2 1
//每次从链表头部插入
Node *CreatHeadList(DataType a[],int n){
Node *s = NULL;
Node *first = (Node*)malloc(sizeof(Node));
first -> next= NULL;
int i = 0;
for(i;i < n;i++){
s = (Node*)malloc(sizeof(Node));
s -> data = a[i];
s -> next = first -> next;
first-> next = s;
}
return first;


}
//链表初始化
Node *InitList(){
Node *first = (Node *)malloc(sizeof(Node));
first->next = NULL;
return first;
}






//判断空是否为空链表
int Empty(Node *first){
if(first->next == NULL)
return 1;
return 0;
}


//遍历
void PrintList(Node*first){
Node*p = first -> next;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
}


//求链表长度
int Length(Node*first){
Node *p = first->next;
int cnt = 0;
while(p != NULL){
cnt++;
p = p -> next;
}
return cnt;
}


//按值查找,查找失败返回0,成功返回数据所在位置
int Locale(Node *first,int x){
Node *p = first->next;
int cnt = 1;
while(p != NULL){
p = p -> next;
cnt ++;
if( p -> data == x)
return cnt;
}
return 0;
}




//按位查找,失败返回0,成功返回指向第x个数据的指针ptr
int Get(Node *first,int x,DataType *ptr){
Node *p = first->next;
int cnt = 1;
while(p != NULL && cnt < x){
p = p -> next;
cnt ++;
}
if(p == NULL)
return 0;
*ptr = p->data;
return 1;
}




//插入
int Insert(Node *first,int x,DataType t){ //x 为插入位置,t为要插入的数据
Node *s = NULL,*p = first;
int cnt = 0;
while ( p != NULL && cnt < x - 1){
p = p -> next;
cnt ++;
}
if(p == NULL ){
return 0; // 插入位置错误返回0
}
s = (Node*)malloc(sizeof(Node));//请求分配空间 .
s -> data = t; //申请一个结点,数据域为x
s -> next = p -> next; //将结点S插入到结点P之后
p -> next = s;
return 1;
}


//删除某一位置的结点
int Delete(Node *first,int i,DataType *ptr){ //i为要删除的数据,ptr取得删除的值
Node *p = first,*q = NULL;
int cnt = 0;
DataType x;
while(p != NULL && cnt < i - 1){
p = p -> next;
cnt++;
}
if(p == NULL || p-> next == NULL){
return 0; //删除失败
}
q = p -> next;
*ptr = q -> data; //删除失败的值
p -> next = q -> next;
free(q);
return 1;
}


//销毁
void DestroyList(Node *first){
Node *p = first;
while (first != NULL){ //依次释放储存空间
first = first -> next;
free(p);
p = first;
}
}




int main()
{
Node *first;
DataType data[] = {1,2,3,4,5};
int x,n;


n = sizeof(data)/sizeof(data[0]);//求出数组data中元素个数


first = CreatTailList(data,n);//尾插


printf("After Creat,the data is: ");
PrintList(first);
printf("\n");


if(Delete(first,3,&x)){
printf("After Delete,the data is: ");
PrintList(first);
printf(" Delete %d",x);
printf("\n");
}
else
printf("Delete Defult\n");


if(Insert(first,2,7)){
printf("After Insert,the data is: ");
PrintList(first);
printf("\n");
}
else
printf("Insert Defult\n");


printf("the List Length is: %d",Length(first));


return 0;
}

觉得文章不错的话可以请我喝一杯茶哟~
  • 本文作者: bestsort
  • 本文链接: https://bestsort.cn/2019/04/21/58/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
-------------本文结束感谢您的阅读-------------