前言
需要用到的函数库
1
2
|
#include<stdio.h> #include<malloc.h> |
malloc函数用来动态分配空间,相当于Java中new的作用
先是需要创建一个节点的结构体
1
2
3
4
|
typedef struct { int data; struct linkNode* next; }linkNode; |
函数
1. 链表初始化
1
2
3
4
5
6
7
8
9
10
|
void iniLinkList(linkNode *fp){ //初始化链表传入一个头节点 linkNode *point = fp; //定义一个指针指向头节点 for ( int i=0;i<5;i++){ linkNode *node = malloc ( sizeof (linkNode)); node->data=i; node->next=NULL; point->next = node; point=point->next; } } |
2. 计算链表长度
1
2
3
4
5
6
7
8
9
|
int countListLength(linkNode *fp){ //fp:链表头节点 linkNode *point = fp; //定义指针指向头节点 int sum = 0; //用来计算链表节点个数 while (point->next){ sum++; point=point->next; } return sum; } |
3. 打印链表
1
2
3
4
5
6
7
8
9
10
|
void printLinkList(linkNode *fp){ //传入链表头节点 linkNode *point = fp; //定义指针指向头节点 printf ( "链表内容如下:\n" ); while (point->next){ linkNode *node = point->next; printf ( "%d\t" ,node->data); point=point->next; } printf ( "\n" ); } |
4.计算链表长度
1
2
3
4
5
6
7
8
9
|
int countListLength(linkNode *fp){ //fp:链表头节点 linkNode *point = fp; //定义指针指向头节点 int sum = 0; //用来计算链表节点个数 while (point->next){ sum++; point=point->next; } return sum; } |
5. 删除链表中指定位置节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int deleteNode( int index,linkNode *fp){ //index:链表中节点的下标,fp:链表头节点 linkNode *point = fp; //定义指针指向头节点 if (index<0||index>(countListLength(fp)-1)){ //判断index是否有效(在链表长度范围内) printf ( "下标不在链表内!" ); return 1; //返回1表示删除失败 } else { for ( int i=0;i<index;i++){ //遍历找到下标前一个位置 point=point->next; } linkNode *node = point->next; point->next=node->next; //删除下标位置节点 return 0; //返回0表示删除成功 } } |
6. 向链表中指定位置插入节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void insertLinkNode(linkNode *fp, int index, int data){ //index:链表中节点的下标,fp:链表头节点,data:插入的新数据 linkNode *point = fp; //定义指针指向头节点 if (index<0||index>(countListLength(fp)-1)){ //判断index是否有效(在链表长度范围内) printf ( "下标不在链表内!" ); return ; } else { for ( int i=0;i<index;i++) point=point->next; //找到下标位置前一个节点 linkNode *node = malloc ( sizeof (linkNode)); node->data=data; //创建新节点 node->next=point->next; //将下标前一个节点的next赋值给node的next point->next = node; //将新创建的节点的地址给下标位置前一个节点 } } |
7. 全代码+运行效果
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
|
#include<stdio.h> #include<malloc.h> typedef struct { int data; struct linkNode* next; }linkNode; //初始化链表 void iniLinkList(linkNode *fp){ //初始化链表传入一个头节点 linkNode *point = fp; //定义一个指针指向头节点 for ( int i=0;i<5;i++){ linkNode *node = malloc ( sizeof (linkNode)); node->data=i; node->next=NULL; point->next = node; point=point->next; } } //向链表中指定位置插入节点 void insertLinkNode(linkNode *fp, int index, int data){ //index:链表中节点的下标,fp:链表头节点,data:插入的新数据 linkNode *point = fp; //定义指针指向头节点 if (index<0||index>(countListLength(fp)-1)){ //判断index是否有效(在链表长度范围内) printf ( "下标不在链表内!" ); return ; } else { for ( int i=0;i<index;i++) point=point->next; //找到下标位置前一个节点 linkNode *node = malloc ( sizeof (linkNode)); node->data=data; //创建新节点 node->next=point->next; //将下标前一个节点的next赋值给node的next point->next = node; //将新创建的节点的地址给下标位置前一个节点 } } //删除链表中指定位置节点 int deleteNode( int index,linkNode *fp){ //index:链表中节点的下标,fp:链表头节点 linkNode *point = fp; //定义指针指向头节点 if (index<0||index>(countListLength(fp)-1)){ //判断index是否有效(在链表长度范围内) printf ( "下标不在链表内!" ); return 1; //返回1表示删除失败 } else { for ( int i=0;i<index;i++){ //遍历找到下标前一个位置 point=point->next; } linkNode *node = point->next; point->next=node->next; //删除下标位置节点 return 0; //返回0表示删除成功 } } //计算链表长度 int countListLength(linkNode *fp){ //fp:链表头节点 linkNode *point = fp; //定义指针指向头节点 int sum = 0; //用来计算链表节点个数 while (point->next){ sum++; point=point->next; } return sum; } //打印链表 void printLinkList(linkNode *fp){ //传入链表头节点 linkNode *point = fp; //定义指针指向头节点 printf ( "链表内容如下:\n" ); while (point->next){ linkNode *node = point->next; printf ( "%d\t" ,node->data); point=point->next; } printf ( "\n" ); } int main(){ linkNode *linkList = malloc ( sizeof (linkNode)); //创建一个头节点 iniLinkList(linkList); printLinkList(linkList); deleteNode(3,linkList); printf ( "删除后" ); printLinkList(linkList); insertLinkNode(linkList,3,7); printf ( "插入后" ); printLinkList(linkList); return 0; } // 链表内容如下: // 0 1 2 3 4 // 删除后链表内容如下: // 0 1 2 4 // 插入后链表内容如下: // 0 1 2 7 4 |
到此这篇关于数据结构C语言链表的实现介绍的文章就介绍到这了,更多相关C语言链表实现内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/qq_43718893/article/details/121930975