
1.单链表
//单链表代码,手打纯手工
//***********************************link.h***********************************
#ifndef LINK_H
#define LINK_H
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link
{
datatype data;
struct link *next;
}Node,*Link;
//创建单链表
Link linkCreate();
//获得链表长度
size_t length(Link link);
//判断链表是否为空
bool isEmpty(Link link);
//获得第i个前的地址
Node *addressFront(Link link,size_t i);
//获取第i个节点的值
datatype getElement(Link link,size_t i);
//查找元素num是否存在
bool isExist(Link link,datatype num);
//插入元素
bool insert(Link link,size_t i,datatype num);
//在链表头插入元素
bool pushFront(Link link,datatype num);
//在链表尾插入元素
bool pushBack(Link link,datatype num);
//删除第i个元素
bool deleteI(Link link,size_t i);
//删除包含元素num的第一个节点
bool deleteNum(Link link,datatype num);
//遍历打印整个链表
void travel(Link link);
//清空链表
bool clear(Link link);
//销毁链表
bool destroy(Link link);
//链表翻转
bool reverse(Link link);
//链表指定长度反转
void reverseN(Link link,int n);
#endif //LINK_H
//*************************link.c****************************************
#include "link.h"
//创建单链表头
Link linkCreate()
{
Node *p = (Node *)malloc(sizeof(Node));
p->next = NULL;
return p;
}
//获得链表长度
size_t length(Link link)
{
size_t count = 0;
Node *node = link->next;
while(node)
{
count++;
node = node->next;
}
return count;
}
//判断链表是否为空
bool isEmpty(Link link)
{
if(NULL == link->next)return true;
return false;
}
//获得第i个前的地址,供内部使用
Node *addressFront(Link link,size_t i)
{
if(NULL == link)return NULL;//头节点为空,返回NULL
if(i > (length(link)+1))return NULL;//i越界,len+1是可取的,相当于最后加上这个数,i不能为0.返回于NULL
if(isEmpty(link))return link;//当链表为空时,返回头节点地址
Node *pre = link; //保存前一个节点的地址
Node *curr = link->next;
for(size_t j = 1;j < i;j++)
{
pre = curr;
curr = curr->next;
}
return pre;
}
//获取第i个节点的值
datatype getElement(Link link,size_t i)
{
Node *node = addressFront(link,i);
return node->next->data;
}
//查找元素num是否存在
bool isExist(Link link,datatype num)
{
if(NULL == link)return false;
Node *node = link->next;
while(node)
{
if(num == node->data)return true;
node = node->next;
}
return false;
}
//插入元素
bool insert(Link link,size_t i,datatype num)
{
if(NULL == link)return false;
if(i > (length(link)+1)||i <= 0)return false;
Node *pre = addressFront(link,i);//获得第i-1个节点的地址
Node *node = (Node *)malloc(sizeof(Node));//申请内存存放新节点
Node *save = pre->next; //将原来的第i个节点的地址保存在save中
pre->next = node; //将原来的第i-1个节点指向新节点
node->data = num; //为新节点的数据域赋值
node->next = save;//将新节点指向原来的第i个节点
return true;
}
//在链表头插入元素
bool pushFront(Link link,datatype num)
{
return insert(link,1,num);
}
//在链表尾插入元素
bool pushBack(Link link,datatype num)
{
return insert(link,length(link)+1,num);
}
//删除第i个元素
bool deleteI(Link link,size_t i)
{
if(NULL == link)return false;
if(i>length(link) || i<=0)return false;
Node *pre = addressFront(link,i);
Node *node= pre->next;
pre->next = node->next;
free(node);
node = NULL;
return true;
}
//删除包含元素num的第一个节点
bool deleteNum(Link link,datatype num)
{
if(NULL == link)return false;
Node *pre = link;
Node *curr = link->next;
while(curr)
{
if(num == curr->data)
{
pre->next = curr->next;
free(curr);
curr = NULL;
return true;
}
pre = curr;
curr= curr->next;
}
return false;
}
//遍历打印整个链表
void travel(Link link)
{
if(NULL == link)return;
Node *node = link->next;
while(node)
{
printf("%d ",node->data);
node = node->next;
}
printf("
");
}
//清空链表
bool clear(Link link)
{
if(NULL == link)return false;
Node *node = link->next;//从头节点开始释放
while(node)
{
Node *temp = node->next;//保存下一个节点的地址
free(node);//释放当前节点
node = temp;//将下一个节点地址赋给node
}
link->next = NULL;//头节点指向空
return true;
}
//销毁链表
bool destroy(Link link)
{
if(NULL == link)return false;
clear(link);
free(link);
link = NULL;
return true;
}
//链表翻转
bool reverse(Link link)
{
if(NULL == link)return false;
Node *pre = link->next;
Node *curr= pre->next;
while(curr)
{
Node *temp = curr->next;//保存当前节点的下一个节点地址
curr->next = pre;//将当前节点指向上一个节点
pre = curr;//将上一个节点指向当前节点
curr= temp;//将当前节点指向喜爱一个节点
}
link->next->next = NULL;//将原来第一个节点指向空
link->next = pre;//将头节点指向原来的最后一个节点
return true;
}
//链表指定长度反转工具
void reverseTool(Node *prev,Node *curr,int num)
{
if(NULL == curr)return;
Node *prevNode = curr;
Node *currNode = curr->next;
int count = 1;
while(currNode)
{
Node *nextNode = currNode->next;
currNode->next = prevNode;
prevNode = currNode;
currNode = nextNode;
count++;
if(num == count)
{
Node *temp = prev->next;
prev->next->next =currNode;
prev->next = prevNode;
reverseTool(temp,currNode,num);
return;
}
}
prev->next->next = currNode;
prev->next = prevNode;
}
//链表指定长度反转
void reverseN(Link link,int n)
{
Node *node = link->next;
reverseTool(link,node,n);
}
//************************linkTest.c*****************************************
#include "link.h"
int main(int argc,char *argv[])
{
Link head = linkCreate();
travel(head);
insert(head,1,77);
travel(head);
insert(head,1,777);
travel(head);
insert(head,3,7777);
travel(head);
printf("length = %d
",length(head));
pushFront(head,52);
travel(head);
printf("length = %d
",length(head));
pushBack(head,00);
travel(head);
printf("length = %d
",length(head));
//deleteNum(head,777);
//deleteI(head,2);
travel(head);
printf("length = %d
",length(head));
printf("-----
");
reverseN(head,2);
//clear(head);
travel(head);
return 0;
}377
1
//单链表代码,手打纯手工2
3
4
//***********************************link.h***********************************5
6
7
8
9
10
11
12
13
14
typedef int datatype;15
16
typedef struct link17
{18
datatype data;19
struct link *next;20
21
22
}Node,*Link;23
24
25
//创建单链表26
Link linkCreate();27
28
29
//获得链表长度30
size_t length(Link link);31
32
//判断链表是否为空33
bool isEmpty(Link link);34
35
//获得第i个前的地址36
Node *addressFront(Link link,size_t i);37
38
//获取第i个节点的值39
datatype getElement(Link link,size_t i);40
41
42
//查找元素num是否存在43
bool isExist(Link link,datatype num);44
45
//插入元素46
bool insert(Link link,size_t i,datatype num);47
48
//在链表头插入元素49
bool pushFront(Link link,datatype num);50
51
//在链表尾插入元素52
bool pushBack(Link link,datatype num);53
54
//删除第i个元素55
bool deleteI(Link link,size_t i);56
57
58
//删除包含元素num的第一个节点59
bool deleteNum(Link link,datatype num);60
61
//遍历打印整个链表62
void travel(Link link);63
64
//清空链表65
bool clear(Link link);66
67
//销毁链表68
bool destroy(Link link);69
70
//链表翻转71
bool reverse(Link link);72
73
//链表指定长度反转74
void reverseN(Link link,int n);75
76
77
78
79
//LINK_H80
81
82
83
//*************************link.c****************************************84
85
86
87
88
89
//创建单链表头90
Link linkCreate()91
{92
Node *p = (Node *)malloc(sizeof(Node));93
p->next = NULL;94
return p;95
}96
97
98
//获得链表长度99
size_t length(Link link)100
{101
size_t count = 0;102
Node *node = link->next;103
while(node)104
{105
count++;106
node = node->next;107
}108
return count;109
}110
111
//判断链表是否为空112
bool isEmpty(Link link)113
{114
if(NULL == link->next)return true;115
return false;116
}117
118
119
//获得第i个前的地址,供内部使用120
Node *addressFront(Link link,size_t i)121
{122
if(NULL == link)return NULL;//头节点为空,返回NULL123
124
if(i > (length(link)+1))return NULL;//i越界,len+1是可取的,相当于最后加上这个数,i不能为0.返回于NULL125
126
if(isEmpty(link))return link;//当链表为空时,返回头节点地址127
128
Node *pre = link; //保存前一个节点的地址129
Node *curr = link->next;130
for(size_t j = 1;j < i;j++)131
{132
pre = curr;133
curr = curr->next; 134
}135
136
return pre;137
}138
139
//获取第i个节点的值140
datatype getElement(Link link,size_t i)141
{142
Node *node = addressFront(link,i);143
return node->next->data;144
}145
146
147
//查找元素num是否存在148
bool isExist(Link link,datatype num)149
{150
if(NULL == link)return false;151
152
Node *node = link->next;153
154
while(node)155
{156
if(num == node->data)return true;157
node = node->next;158
}159
return false;160
}161
162
//插入元素163
bool insert(Link link,size_t i,datatype num)164
{165
if(NULL == link)return false;166
if(i > (length(link)+1)||i <= 0)return false;167
168
169
Node *pre = addressFront(link,i);//获得第i-1个节点的地址170
Node *node = (Node *)malloc(sizeof(Node));//申请内存存放新节点171
Node *save = pre->next; //将原来的第i个节点的地址保存在save中172
173
pre->next = node; //将原来的第i-1个节点指向新节点174
175
node->data = num; //为新节点的数据域赋值176
node->next = save;//将新节点指向原来的第i个节点177
178
return true;179
}180
181
//在链表头插入元素182
bool pushFront(Link link,datatype num)183
{184
return insert(link,1,num);185
}186
187
//在链表尾插入元素188
bool pushBack(Link link,datatype num)189
{190
return insert(link,length(link)+1,num);191
}192
193
//删除第i个元素194
bool deleteI(Link link,size_t i)195
{196
if(NULL == link)return false;197
if(i>length(link) || i<=0)return false;198
199
200
Node *pre = addressFront(link,i);201
Node *node= pre->next;202
203
pre->next = node->next;204
free(node);205
node = NULL;206
return true;207
}208
209
210
//删除包含元素num的第一个节点211
bool deleteNum(Link link,datatype num)212
{213
if(NULL == link)return false;214
215
Node *pre = link;216
Node *curr = link->next;217
while(curr)218
{219
if(num == curr->data)220
{221
pre->next = curr->next;222
free(curr);223
curr = NULL;224
return true;225
}226
pre = curr;227
curr= curr->next;228
}229
230
return false;231
}232
233
//遍历打印整个链表234
void travel(Link link)235
{236
if(NULL == link)return;237
238
Node *node = link->next;239
while(node)240
{241
printf("%d ",node->data);242
node = node->next;243
}244
printf("
");245
}246
247
//清空链表248
bool clear(Link link)249
{250
if(NULL == link)return false;251
252
Node *node = link->next;//从头节点开始释放253
254
while(node)255
{256
Node *temp = node->next;//保存下一个节点的地址257
free(node);//释放当前节点258
node = temp;//将下一个节点地址赋给node259
}260
link->next = NULL;//头节点指向空261
262
return true;263
}264
265
//销毁链表266
bool destroy(Link link)267
{268
if(NULL == link)return false;269
270
clear(link);271
free(link);272
link = NULL;273
return true;274
}275
276
277
//链表翻转278
bool reverse(Link link)279
{280
if(NULL == link)return false;281
282
Node *pre = link->next;283
Node *curr= pre->next;284
285
while(curr)286
{287
Node *temp = curr->next;//保存当前节点的下一个节点地址288
curr->next = pre;//将当前节点指向上一个节点289
290
pre = curr;//将上一个节点指向当前节点291
curr= temp;//将当前节点指向喜爱一个节点292
}293
294
link->next->next = NULL;//将原来第一个节点指向空295
link->next = pre;//将头节点指向原来的最后一个节点296
return true;297
}298
299
300
//链表指定长度反转工具301
void reverseTool(Node *prev,Node *curr,int num)302
{303
if(NULL == curr)return;304
305
Node *prevNode = curr;306
Node *currNode = curr->next;307
308
int count = 1;309
while(currNode)310
{311
Node *nextNode = currNode->next;312
currNode->next = prevNode;313
prevNode = currNode;314
currNode = nextNode;315
count++;316
317
if(num == count)318
{319
Node *temp = prev->next;320
prev->next->next =currNode;321
prev->next = prevNode;322
reverseTool(temp,currNode,num);323
return;324
}325
}326
327
prev->next->next = currNode;328
prev->next = prevNode;329
}330
331
//链表指定长度反转332
void reverseN(Link link,int n)333
{ 334
Node *node = link->next;335
reverseTool(link,node,n);336
}337
338
339
340
//************************linkTest.c*****************************************341
342
343
344
345
int main(int argc,char *argv[])346
{347
Link head = linkCreate();348
travel(head);349
insert(head,1,77);350
travel(head);351
insert(head,1,777);352
travel(head);353
insert(head,3,7777);354
travel(head);355
printf("length = %d
",length(head));356
357
pushFront(head,52);358
travel(head);359
printf("length = %d
",length(head));360
361
362
pushBack(head,00);363
travel(head);364
printf("length = %d
",length(head));365
366
//deleteNum(head,777);367
//deleteI(head,2);368
travel(head);369
printf("length = %d
",length(head));370
371
372
printf("-----
");373
reverseN(head,2);374
//clear(head);375
travel(head);376
return 0;377
}2.静态链表
//静态链表代码,纯手打
//********************static_link.h***********************
#ifndef STATIC_LINK_H
#define STATIC_LINK_H
#include <stdio.h>
#include <stdbool.h>
#define MAXSIZE 1000
typedef int datatype;
typedef struct Static_linklist
{
datatype data;
int curr;
}Node,static_link[MAXSIZE];
//初始化静态链表
bool InitList(static_link link);
//获取链表长度
size_t length(static_link link);
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(static_link link);
//Free_SSL将下标为K的空闲节点回收到备用链表
void Free_SSL(static_link link,int k);
//插入元素
bool insert(static_link link,int i,datatype num);
//删除元素
bool Delete(static_link link,int i );
//判断链表是否为空
bool isEmpty(static_link link);
//获取第i个对象的值
datatype getElement(static_link link,int i);
//历遍整个链表
void travel(static_link link);
#endif //STATIC_LINK_H
//********************static_link.c***********************
#include "static_link.h"
//初始化静态链表
bool InitList(static_link link)
{
if(NULL == link)return false;
for(int i = 0;i < MAXSIZE-1;i++)
{
link[i].curr = i+1;
}
link[MAXSIZE-1].curr = 0;
return true;
}
//获取链表长度
size_t length(static_link link)
{
if(NULL == link)return false;
size_t index = link[MAXSIZE-1].curr;
size_t count = 0;
while(index)
{
count++;
index = link[index].curr;
}
return count;
}
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(static_link link)
{
if(0 == link[0].curr)return 0;
int result = link[0].curr;
link[0].curr = link[link[0].curr].curr;
return result;
}
//Free_SSL将下标为K的空闲节点回收到备用链表
void Free_SSL(static_link link,int k)
{
link[k].curr = link[0].curr;
link[0].curr = k;
}
//插入元素
bool insert(static_link link,int i,datatype num)
{
if(i<1 || i > length(link)+1)return false; //当输入的i小于1或者比链表长度+1大,则非法。
int index = Malloc_SLL(link);
if(index)
{
link[index].data = num;
int index_front = MAXSIZE-1;
for(int j = 1;j < i;j++)
{
index_front = link[index_front].curr;
}
link[index].curr = link[index_front].curr;
link[index_front].curr = index;
return true;
}
return false;
}
//删除元素
bool Delete(static_link link,int i )
{
if(i<1 || i > length(link))return false;
size_t index = MAXSIZE-1;
for(int j =1;j < i;j++)
{
index = link[index].curr;
}
size_t tmp = link[index].curr;
link[index].curr = link[tmp].curr;
Free_SSL(link,i);
return true;
}
//判断链表是否为空
bool isEmpty(static_link link)
{
return !link[MAXSIZE-1].curr;
}
//获取第i个对象的值
datatype getElement(static_link link,int i)
{
if(i<1 || i>length(link))return ~(1<<(sizeof(datatype)*8-1))+1;//这里由于函数的返回值是数据类型,因此不能返回false来报告输入错误,因此后面取了这个数据类型的最大值+1输出表示输入下标不合法
size_t index = link[MAXSIZE-1].curr;
for(size_t j = 1;j < i;j++)
{
index = link[index].curr;
}
return link[index].data;
}
//历遍整个链表
void travel(static_link link)
{
size_t index = link[MAXSIZE-1].curr;
while(index)
{
printf("%d ",link[index].data);
index = link[index].curr;
}
printf("
");
}
//********************static_linkTest.c***********************
#include "static_link.h"
int main()
{
Node arr[MAXSIZE];
InitList(arr);
printf("isEmpty: %d
",isEmpty(arr));
travel(arr);
insert(arr,1,77);
insert(arr,2,25);
printf("isEmpty: %d
",isEmpty(arr));
travel(arr);
//Delete(arr,2);
//travel(arr);
//printf("isEmpty: %d
",isEmpty(arr));
printf("arr[2]:%d
",getElement(arr,2));
printf("arr[3]:%d
",getElement(arr,3));
return 0;
}220
1
//静态链表代码,纯手打2
3
//********************static_link.h***********************4
5
6
7
8
9
10
11
typedef int datatype;12
13
14
typedef struct Static_linklist15
{16
datatype data;17
int curr;18
}Node,static_link[MAXSIZE];19
20
21
//初始化静态链表22
bool InitList(static_link link);23
24
25
26
//获取链表长度27
size_t length(static_link link);28
29
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回030
int Malloc_SLL(static_link link);31
32
//Free_SSL将下标为K的空闲节点回收到备用链表33
void Free_SSL(static_link link,int k);34
35
//插入元素36
bool insert(static_link link,int i,datatype num);37
38
//删除元素39
bool Delete(static_link link,int i );40
41
//判断链表是否为空42
bool isEmpty(static_link link);43
44
//获取第i个对象的值45
datatype getElement(static_link link,int i);46
47
48
//历遍整个链表49
void travel(static_link link);50
51
//STATIC_LINK_H52
53
54
55
//********************static_link.c***********************56
57
58
59
//初始化静态链表60
bool InitList(static_link link)61
{62
if(NULL == link)return false;63
for(int i = 0;i < MAXSIZE-1;i++)64
{65
link[i].curr = i+1;66
}67
link[MAXSIZE-1].curr = 0;68
return true;69
}70
71
72
73
//获取链表长度74
size_t length(static_link link)75
{76
if(NULL == link)return false;77
78
size_t index = link[MAXSIZE-1].curr;79
size_t count = 0;80
81
while(index)82
{83
count++;84
index = link[index].curr;85
}86
87
return count;88
}89
90
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回091
int Malloc_SLL(static_link link)92
{93
if(0 == link[0].curr)return 0;94
95
int result = link[0].curr;96
link[0].curr = link[link[0].curr].curr;97
return result;98
}99
100
//Free_SSL将下标为K的空闲节点回收到备用链表101
void Free_SSL(static_link link,int k)102
{103
link[k].curr = link[0].curr;104
link[0].curr = k;105
}106
107
//插入元素108
bool insert(static_link link,int i,datatype num)109
{110
if(i<1 || i > length(link)+1)return false; //当输入的i小于1或者比链表长度+1大,则非法。111
int index = Malloc_SLL(link);112
113
if(index)114
{115
link[index].data = num;116
117
int index_front = MAXSIZE-1;118
for(int j = 1;j < i;j++)119
{120
index_front = link[index_front].curr;121
}122
link[index].curr = link[index_front].curr;123
link[index_front].curr = index;124
return true;125
}126
return false;127
}128
129
//删除元素130
bool Delete(static_link link,int i )131
{132
if(i<1 || i > length(link))return false;133
size_t index = MAXSIZE-1;134
for(int j =1;j < i;j++)135
{136
index = link[index].curr;137
}138
size_t tmp = link[index].curr;139
link[index].curr = link[tmp].curr;140
Free_SSL(link,i);141
return true;142
}143
144
//判断链表是否为空145
bool isEmpty(static_link link)146
{147
return !link[MAXSIZE-1].curr;148
}149
150
//获取第i个对象的值151
datatype getElement(static_link link,int i)152
{153
if(i<1 || i>length(link))return ~(1<<(sizeof(datatype)*8-1))+1;//这里由于函数的返回值是数据类型,因此不能返回false来报告输入错误,因此后面取了这个数据类型的最大值+1输出表示输入下标不合法154
155
size_t index = link[MAXSIZE-1].curr;156
for(size_t j = 1;j < i;j++)157
{158
index = link[index].curr;159
}160
return link[index].data;161
}162
163
//历遍整个链表164
void travel(static_link link)165
{166
size_t index = link[MAXSIZE-1].curr;167
while(index)168
{169
printf("%d ",link[index].data);170
index = link[index].curr;171
}172
printf("
");173
}174
175
176
177
//********************static_linkTest.c***********************178
179
180
181
182
183
184
int main()185
186
{187
188
Node arr[MAXSIZE];189
190
InitList(arr);191
192
193
194
printf("isEmpty: %d
",isEmpty(arr));195
196
197
198
travel(arr);199
200
insert(arr,1,77);201
202
insert(arr,2,25);203
204
printf("isEmpty: %d
",isEmpty(arr));205
206
travel(arr);207
208
//Delete(arr,2);209
210
//travel(arr);211
212
//printf("isEmpty: %d
",isEmpty(arr));213
214
printf("arr[2]:%d
",getElement(arr,2));215
216
printf("arr[3]:%d
",getElement(arr,3));217
218
return 0;219
220
}3.循环链表
//******************************circular_link.h**************************************
#ifndef CIRCULAR_LINK_H
#define CIRCULAR_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct circular_link
{
datatype data;
struct circular_link *next;
}Node,*Link;
//创建链表
Link create();
//获取链表长度
size_t length(Link link);
//获取第i-1个节点的地址,工具函数内部使用
Node *addressTool(Link link,size_t i);
//插入节点
bool insert(Link link,size_t i,datatype data);
//删除节点
bool Delete(Link link,size_t i);
//历遍节点
void travel(Link link);
//判断节点是否为空
bool isEmpty(Link link);
//获取第i个节点的数据
datatype getElement(Link link,size_t i);
#endif //CIRCULAR_LINK_H
//******************************circular_link.c**************************************
#include "circular_link.h"
//创建链表 创建失败返回NULL
Link create()
{
Link link = (Link)malloc(sizeof(Node));
link->next = link;
return link;
}
//获取链表长度
size_t length(Link link)
{
if(NULL==link || NULL==link->next)return false;
Node *node = link->next;
int count = 0;
while(node != link)
{
count++;
node = node->next;
}
return count;
}
//获取第i-1个节点的地址,工具函数内部使用
Node *addressTool(Link link,size_t i)
{
Node *node = link;
for(size_t j = 1;j < i;j++)
{
node = node->next;
}
return node;
}
//插入节点
bool insert(Link link,size_t i,datatype data)
{
if(i<1 || i > length(link)+1)return false;
if(NULL == link)return false;
Node *prev = addressTool(link,i);//获取第i-1个节点地址
Node *curr = prev->next;//获取第i个节点地址
Node *node = (Node *)malloc(sizeof(Node));//创建新节点
node->data = data;
prev->next = node;
node->next = curr;
return true;
}
//删除节点
bool Delete(Link link,size_t i)
{
if(i<1 || i>length(link))return false;
if(NULL == link)return false;
Node *prev = addressTool(link,i);
Node *curr = prev->next;
Node *temp = curr->next;
prev->next = temp;
free(curr);
curr = NULL;
return true;
}
//历遍节点
void travel(Link link)
{
Node *node = link->next;
while(node != link)
{
printf("%d ",node->data);
node = node->next;
}
printf("
");
}
//判断节点是否为空
bool isEmpty(Link link)
{
return link->next == link;
}
//获取第i个节点的数据
datatype getElement(Link link,size_t i)
{
if(i<1 || i > length(link) || NULL == link)return !(1<<(sizeof(datatype)-1))+1;
Node *node = link->next;
for(size_t j = 1;j < i;j++)
{
node = node->next;
}
return node->data;
}
//******************************circular_linkTest.c**************************************
#include "circular_link.h"
int main()
{
Link head = create();
printf("isEmpty: %d
",isEmpty(head));
printf("%d
",length(head));
travel(head);
insert(head,1,77);
travel(head);
printf("isEmpty: %d
",isEmpty(head));
insert(head,1,52);
insert(head,1,44);
travel(head);
printf("%d
",length(head));
printf("head:1:%d
",getElement(head,1));
printf("head:2:%d
",getElement(head,2));
printf("head:3:%d
",getElement(head,3));
// Delete(head,1);
// travel(head);
// Delete(head,1);
// travel(head);
// Delete(head,1);
// travel(head);
return 0;
}x
1
//******************************circular_link.h**************************************2
3
4
5
6
7
8
typedef int datatype;9
10
typedef struct circular_link11
{12
datatype data;13
struct circular_link *next;14
}Node,*Link;15
16
17
//创建链表18
Link create();19
20
//获取链表长度21
size_t length(Link link);22
23
//获取第i-1个节点的地址,工具函数内部使用24
Node *addressTool(Link link,size_t i);25
26
27
//插入节点28
bool insert(Link link,size_t i,datatype data);29
30
//删除节点31
bool Delete(Link link,size_t i);32
33
//历遍节点34
void travel(Link link);35
36
//判断节点是否为空37
bool isEmpty(Link link);38
39
//获取第i个节点的数据40
datatype getElement(Link link,size_t i);41
42
43
44
45
//CIRCULAR_LINK_H46
47
48
//******************************circular_link.c**************************************49
50
51
52
53
//创建链表 创建失败返回NULL54
Link create()55
{56
Link link = (Link)malloc(sizeof(Node));57
link->next = link;58
return link;59
}60
61
//获取链表长度62
size_t length(Link link)63
{64
if(NULL==link || NULL==link->next)return false;65
66
67
Node *node = link->next;68
int count = 0;69
while(node != link)70
{71
count++;72
node = node->next;73
}74
75
return count;76
}77
78
//获取第i-1个节点的地址,工具函数内部使用79
Node *addressTool(Link link,size_t i)80
{81
Node *node = link;82
for(size_t j = 1;j < i;j++)83
{84
node = node->next;85
}86
return node;87
}88
89
90
//插入节点91
bool insert(Link link,size_t i,datatype data)92
{ 93
if(i<1 || i > length(link)+1)return false;94
if(NULL == link)return false;95
96
Node *prev = addressTool(link,i);//获取第i-1个节点地址97
Node *curr = prev->next;//获取第i个节点地址98
99
Node *node = (Node *)malloc(sizeof(Node));//创建新节点 100
node->data = data;101
102
prev->next = node;103
node->next = curr;104
105
return true;106
}107
108
//删除节点109
bool Delete(Link link,size_t i)110
{111
if(i<1 || i>length(link))return false;112
if(NULL == link)return false;113
114
Node *prev = addressTool(link,i);115
Node *curr = prev->next;116
Node *temp = curr->next;117
118
prev->next = temp;119
free(curr);120
curr = NULL;121
return true;122
}123
124
//历遍节点125
void travel(Link link)126
{127
Node *node = link->next;128
while(node != link)129
{130
printf("%d ",node->data);131
node = node->next;132
}133
printf("
");134
}135
136
//判断节点是否为空137
bool isEmpty(Link link)138
{139
return link->next == link;140
}141
142
//获取第i个节点的数据143
datatype getElement(Link link,size_t i)144
{145
if(i<1 || i > length(link) || NULL == link)return !(1<<(sizeof(datatype)-1))+1;146
147
Node *node = link->next;148
149
for(size_t j = 1;j < i;j++)150
{151
node = node->next;152
}153
return node->data;154
}155
156
157
//******************************circular_linkTest.c**************************************158
159
160
161
162
163
164
165
int main()166
167
{168
169
Link head = create();170
171
printf("isEmpty: %d
",isEmpty(head));172
173
printf("%d
",length(head));174
175
travel(head);176
177
178
179
insert(head,1,77);180
181
travel(head);182
183
printf("isEmpty: %d
",isEmpty(head));184
185
insert(head,1,52);186
187
insert(head,1,44);188
189
travel(head);190
191
printf("%d
",length(head));192
193
194
195
printf("head:1:%d
",getElement(head,1));196
197
printf("head:2:%d
",getElement(head,2));198
199
printf("head:3:%d
",getElement(head,3));200
201
202
203
// Delete(head,1);204
205
// travel(head);206
207
// Delete(head,1);208
209
// travel(head);210
211
// Delete(head,1);212
213
// travel(head);214
215
return 0;216
217
}4.双向循环链表
//**********************************double_link.h************************************
#ifndef DOUBLE_LINK_H
#define DOUBLE_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct double_link
{
datatype data;
struct double_link *prior;
struct double_link *next;
}DulNode,*DulLink;
//创建链表
DulLink create();
//链表长度
size_t length(DulLink link);
//链表是否为空
bool isEmpty(DulLink link);
//获取第i-1和节点的地址,工具函数,内部使用
DulNode *addressTool(DulLink link,size_t i);
//插入节点
bool insert(DulLink link,size_t i,datatype data);
//删除节点
bool Delete(DulLink link,size_t i);
//历遍节点
void travel(DulLink link);
#endif //DOUBLE_LINK_H
//**********************************double_link.c************************************
#include "double_link.h"
//创建双向循环链表
DulLink create()
{
DulLink link = (DulLink)malloc(sizeof(DulNode));
link->prior = link;
link->next = link;
return link;
}
//链表长度
size_t length(DulLink link)
{
if(NULL == link)return 0;
DulNode *node = link->next;
size_t count = 0;
while(node != link)
{
count++;
node = node->next;
}
return count;
}
//链表是否为空
bool isEmpty(DulLink link)
{
return (link->next == link);
}
//获取第i-1和节点的地址,工具函数,内部使用
DulNode *addressTool(DulLink link,size_t i)
{
DulNode *prev = link;
for(int j = 1;j < i;j++)
{
prev = prev->next;
}
return prev;
}
//插入节点
bool insert(DulLink link,size_t i,datatype data)
{
if(i<1 || i > length(link)+1)return false;
if(NULL == link)return false;
DulNode *prev = addressTool(link,i);//获得第i-1个节点的地址
DulNode *old = prev->next;//获得原来第i个地址
DulNode *node = (DulNode *)malloc(sizeof(DulNode));//创建新节点
node->data = data;
prev->next = node; //新节点与prev节点的连接
node->prior= prev;
node->next = old;
old->prior = node;
return true;
}
//删除节点
bool Delete(DulLink link,size_t i)
{
if(i<1 || i>length(link))return false;
if(NULL == link)return false;
DulNode *prev = addressTool(link,i);//获取第i-1个节点地址
DulNode *curr = prev->next;
DulNode *behind = curr->next;
prev->next = behind;//将第i-1个节点和i+1个节点连接起来
behind->prior = prev;
free(curr);//释放第i个节点
curr = NULL;
return true;
}
//历遍节点
void travel(DulLink link)
{
DulNode *node = link->next;
while(node != link)
{
printf("%d ",node->data);
node = node->next;
}
printf("
");
}
//**********************************double_linkTest.c************************************
#include "double_link.h"
int main()
{
DulLink head = create();
printf("length: %d
",length(head));
printf("isEmpty: %d
",isEmpty(head));
insert(head,1,77);
travel(head);
insert(head,1,52);
travel(head);
insert(head,3,1314);
travel(head);
insert(head,1,74);
insert(head,1,75);
travel(head);
Delete(head,2);
travel(head);
Delete(head,1);
travel(head);
return 0;
}x
144
1
//**********************************double_link.h************************************2
3
4
5
6
7
8
typedef int datatype;9
10
typedef struct double_link11
{12
datatype data;13
struct double_link *prior;14
struct double_link *next;15
}DulNode,*DulLink;16
17
18
//创建链表19
DulLink create();20
21
//链表长度22
size_t length(DulLink link);23
24
//链表是否为空25
bool isEmpty(DulLink link);26
27
//获取第i-1和节点的地址,工具函数,内部使用28
DulNode *addressTool(DulLink link,size_t i);29
30
//插入节点31
bool insert(DulLink link,size_t i,datatype data);32
33
//删除节点34
bool Delete(DulLink link,size_t i);35
36
//历遍节点37
void travel(DulLink link);38
39
40
//DOUBLE_LINK_H41
42
43
44
45
46
//**********************************double_link.c************************************47
48
49
50
//创建双向循环链表51
DulLink create()52
{53
DulLink link = (DulLink)malloc(sizeof(DulNode));54
link->prior = link;55
link->next = link;56
return link;57
}58
59
//链表长度60
size_t length(DulLink link)61
{62
if(NULL == link)return 0;63
64
DulNode *node = link->next;65
size_t count = 0;66
while(node != link)67
{68
count++;69
node = node->next;70
}71
72
return count;73
}74
75
//链表是否为空76
bool isEmpty(DulLink link)77
{78
return (link->next == link);79
}80
81
//获取第i-1和节点的地址,工具函数,内部使用82
DulNode *addressTool(DulLink link,size_t i)83
{ 84
DulNode *prev = link;85
for(int j = 1;j < i;j++)86
{87
prev = prev->next;88
}89
return prev;90
}91
92
//插入节点93
bool insert(DulLink link,size_t i,datatype data)94
{95
if(i<1 || i > length(link)+1)return false;96
if(NULL == link)return false;97
98
DulNode *prev = addressTool(link,i);//获得第i-1个节点的地址99
DulNode *old = prev->next;//获得原来第i个地址100
101
DulNode *node = (DulNode *)malloc(sizeof(DulNode));//创建新节点102
node->data = data;103
104
prev->next = node; //新节点与prev节点的连接105
node->prior= prev;106
107
node->next = old;108
old->prior = node;109
110
return true;111
}112
113
//删除节点114
bool Delete(DulLink link,size_t i)115
{116
if(i<1 || i>length(link))return false;117
if(NULL == link)return false;118
119
DulNode *prev = addressTool(link,i);//获取第i-1个节点地址120
DulNode *curr = prev->next;121
DulNode *behind = curr->next;122
123
prev->next = behind;//将第i-1个节点和i+1个节点连接起来124
behind->prior = prev;125
126
free(curr);//释放第i个节点127
curr = NULL;128
129
return true;130
}131
132
//历遍节点133
void travel(DulLink link)134
{135
DulNode *node = link->next;136
while(node != link)137
{138
printf("%d ",node->data);139
node = node->next;140
}141
printf("
");142
}143
144
145
146
//**********************************double_linkTest.c************************************147
148
149
150
int main()151
{152
DulLink head = create();153
printf("length: %d
",length(head));154
printf("isEmpty: %d
",isEmpty(head));155
156
insert(head,1,77);157
travel(head);158
insert(head,1,52);159
travel(head);160
insert(head,3,1314);161
travel(head);162
163
insert(head,1,74);164
insert(head,1,75);165
travel(head);166
Delete(head,2);167
travel(head);168
Delete(head,1);169
travel(head);170
return 0;171
}