C语言 - 基础数据结构和算法 - 企业链表
听黑马程序员教程《基础数据结构和算法 (C版本)》,照着老师所讲抄的,
视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
03 企业链表
1 #include<stdio.h >
2 #include<stdlib.h>
3 #include<string.h>
4
5 // 链表小结点
6 typedef struct LINKNODE{
7 struct LINKNODE* next;
8 }LinkNode;
9
10 // 链表结点
11 typedef struct LINKLIST{
12 LinkNode head;
13 int size;
14 }LinkList;
15
16 // 自定义数据结构
17 typedef struct PERSON{
18 LinkNode node; // 相当于 next 。
19 char name[32];
20 int age;
21 }Person;
22
23 // 打印回调
24 void myPrint(LinkNode* data){
25 Person* p = (Person*)data;
26 printf("姓名:%s\t年龄:%d\n",
27 p->name,p->age);
28 }
29 // 查找的回调函数
30 int myCompare(LinkNode* node1,LinkNode* node2){
31 Person* p1 = (Person*)node1;
32 Person* p2 = (Person*)node2;
33 if(strcmp(p1->name,p2->name)==0 && p1->age==p2->age){
34 return 1;
35 }
36 return -1;
37 }
38 // --------------------------- 功能函数 ----------------------
39
40 // 打印回调
41 typedef void(*PRINTNODE)(LinkNode*);
42 // 比较函数指针
43 typedef int(*COMPARENODE)(LinkNode*,LinkNode*);
44
45 // 初始化链表,返回一个链表
46 LinkList* Init_LinkList();
47
48 // 插入节点
49 void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
50
51 // 删除节点
52 void Remove_LinkList(LinkList* list,int pos);
53
54 // 查找
55 int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare);
56
57 // 返回链表节点数量
58 int Size_LinkList(LinkList* list);
59
60 // 打印
61 void Print_LinkList(LinkList* list,PRINTNODE print);
62
63 // 释放内存
64 void FreeSpace_LinkList(LinkList* List);
65
66 int main(){
67 printf("好好学习,天天向上~!\t\t企业链表20220603\n\n\n");
68
69 // 创建链表
70 LinkList* list = Init_LinkList();
71 // 创建数据
72 Person p1,p2,p3,p4,p5;
73 strcpy(p1.name,"aaa1");
74 strcpy(p2.name,"bbb2");
75 strcpy(p3.name,"ccc3");
76 strcpy(p4.name,"ddd4");
77 strcpy(p5.name,"eee5");
78 p1.age = 10;
79 p2.age = 13;
80 p3.age = 15;
81 p4.age = 16;
82 p5.age = 20;
83
84 // 将节点插入到链表
85 Insert_LinkList(list,0,(LinkNode*)&p1);
86 Insert_LinkList(list,0,(LinkNode*)&p2);
87 Insert_LinkList(list,0,(LinkNode*)&p3);
88 Insert_LinkList(list,0,(LinkNode*)&p4);
89 Insert_LinkList(list,0,(LinkNode*)&p5);
90
91 // 打印
92 Print_LinkList(list,myPrint);
93
94 // 删除结点
95 printf("\n删除第3个结点后,\n");
96 Remove_LinkList(list,3);
97 // 打印
98 Print_LinkList(list,myPrint);
99
100 // 查找
101 Person temp;
102 strcpy(temp.name,"ccc3");
103 temp.age= 18;
104 int pos = Find_LinkList(list,(LinkNode*)&temp,myCompare);
105 printf("查找结点的位置为:%d\n\n",pos);
106
107 // 释放内存
108 FreeSpace_LinkList(list);
109 return 0;
110 }
111
112 // --------------------------- 功能函数 实现 ----------------------
113
114 // 初始化链表,返回一个链表
115 LinkList* Init_LinkList(){
116 LinkList * list = (LinkList*)malloc(sizeof(LinkList));
117 list->head.next = NULL;
118 list->size = 0;
119 return list;
120 }
121
122 // 插入节点
123 void Insert_LinkList(LinkList* list,int pos,LinkNode* data){
124 if(list==NULL){
125 return ;
126 }
127 if(data==NULL){
128 return;
129 }
130 if(pos<0 || pos > list->size){
131 pos = list->size;
132 }
133 // 查找插入位置
134 int i;
135 LinkNode* pCurrent = &(list->head);
136 for(i =0;i<pos;i++){
137 pCurrent = pCurrent->next;
138 }
139 // 插入新节点
140 data->next = pCurrent->next;
141 pCurrent->next = data;
142
143 list->size++;
144 }
145
146 // 删除节点
147 void Remove_LinkList(LinkList* list,int pos){
148 if(list==NULL){
149 return ;
150 }
151 if(pos<0 || pos > list->size){
152 return;
153 }
154 // 查找要删除节点的位置
155 int i;
156 LinkNode* pCurrent = &(list->head);
157 for(i =0;i<pos;i++){
158 pCurrent = pCurrent->next;
159 }
160 pCurrent->next = pCurrent->next->next;
161 list->size--;
162 }
163
164 // 查找,返回结点地址(指针)
165 int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare){
166 if(list==NULL){
167 return ;
168 }
169 if(data==NULL){
170 return;
171 }
172 // 辅助指针变量
173 int i=0;
174 int flag=-1;
175 LinkNode* pCurrent = list->head.next;
176 while(pCurrent){
177 if(compare(pCurrent,data)==1){
178 flag = i;
179 break;
180 }
181 i++;
182 pCurrent = pCurrent->next;
183 }
184 return flag;
185 }
186
187 // 返回链表节点数量
188 int Size_LinkList(LinkList* list){
189 return -1;
190 }
191
192 // 打印
193 void Print_LinkList(LinkList* list,PRINTNODE print){
194 if(list==NULL){
195 return ;
196 }
197 // 辅助指针
198 LinkNode* pCurrent = list->head.next;
199 while(pCurrent){
200 print(pCurrent);
201 pCurrent = pCurrent->next;
202 }
203 }
204
205 // 释放内存
206 void FreeSpace_LinkList(LinkList* list){
207 if(list==NULL){
208 return ;
209 }
210 }
C语言 - 基础数据结构和算法 - 企业链表的更多相关文章
- C语言 - 基础数据结构和算法 - 单向链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言- 基础数据结构和算法 - 循环链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言- 基础数据结构和算法 - 栈的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...
- C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 队列的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 动态数组
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...
随机推荐
- SpringMVC获取请求参数-集合类型
1.创建User实体类 ```java public class User { private String username; private int age; public String getU ...
- 轻量化安装 TKEStack:让已有 K8s 集群拥有企业级容器云平台的能力
关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...
- 使用nmtui命令解决network-scripts目录下无网卡对应配置文件问题
//网卡通过命令ifconfig可以识别到,但是在配置文件目录下,没有该文件,一旦重启等配置了该地址的应用则可能会出现问题所以需要重新生成对应配置文件,我首先想到的就是用 nmtui 这个程序来重新生 ...
- MySQL 集群历史版本信息
MySQL 集群有两种命名方式,在Mysql5.1版本之前,MySQL 集群是以MySQL版本号命名:MySQL5.1(包括)之后开始以 mysql-mysql_server_version-ndb- ...
- 新手入门C语言第九章:C函数
C 函数 函数是一组一起执行一个任务的语句.每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数.您可以把代码划分到不同的函数中.如何划分代码到不同的函数中 ...
- 【原创】记一次DouPHP站点的RCE实战之旅
声明 本次实践是在合法授权情况下进行,数据已经全部脱敏,主要是提供思路交流学习,请勿用于任何非法活动,否则后果自负. 实战记录 信息收集 1,踩点站点 通过fofa 查到目标DouPHP框架该站点(也 ...
- python基础练习题(题目 递归求等差数列)
day20 --------------------------------------------------------------- 实例028:递归求等差数列 题目 有5个人坐在一起,问第5个 ...
- python基础练习题(题目 画菱形)
day15 --------------------------------------------------------------- 实例022:画菱形 题目 打印出如下图案(菱形):. * * ...
- golang /js index 转换excel字母表头
Golang 1 package main 2 3 import "fmt" 4 5 func main() { 6 var Letters = []string{"A& ...
- spring中的事件发布与监听
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. spring事件发布与监听的应用场景 当处理完一段代码逻辑,接下来需要同 ...