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 其它常见算法 ...
随机推荐
- 搭建 LNMP 环境
搭建 LNMP 环境 搭建 Nginx 静态服务器 安装 Nginx 使用 yum 安装 Nginx: yum install nginx -y 修改 /etc/nginx/conf.d/defaul ...
- QT 如何让release生成的EXE可在他人电脑上运行(尝试了全网的方法后,这应该能帮你解决)
这两天,迅速上手了QT并用其基于C++编写了一个含UI的小程序 跳过中间的开发阶段 当我兴致满满的要将程序打包时,却是费尽周折,搜尽全网的关于QT的打包教程,最后都不顶用. 后面自己和队友的共同发现, ...
- 使用Socket实现HttpServer(三)
使用Socket实现HttpServer(三) 这一章继续对我们的服务器进行优化,引入 NIO package com.fengsir.network.step4; import java.io.IO ...
- js模块系统 - amd|cmd|commonjs|esm|umd
写过前端代码大概率听说过amd cmd umd commonjs esm这些名词, 想当初我第一次看到这些的时候, 人都麻了, 都是些啥啊. 后来我知道了, 这些都是js的模块规范. amd - 浏览 ...
- Istio实践(2)-流量控制及服务间调用
前言:接上一篇istio应用部署,本文介绍通过virtualservice实现流量控制,并通过部署client端进行服务调用实例 1. 修改virtualservice组件,实现权重占比访问不同版本服 ...
- Java语言学习day32--8月07日
###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...
- JS获取Cookie失败
项目开发日记-bug多多篇(1) 在做评论功能的时候遇到了一个很无厘头的错误,我的思路是参照点赞功能,用Ajax技术异步完成评论信息的传输,然后展示在页面上. 那么在提交评论信息的同时,要连着用户名, ...
- 保姆级教程:VsCode调试docker中的NodeJS程序
最近在写NodeJS相关的项目,运行在docker容器中,也是想研究一下断点调试,于是查阅相关资料,最终顺利配置好了. 首先我选择了VsCode作为ide,并用VsCode来做NodeJS可视化deb ...
- EntityFramwork常见问题
1.常用的语句有哪些 添加migration dotnet ef migrations add [MIgrationName] 删除刚添加的migration dotnet ef ...
- js 如何判断变量类型
自定义一些类型 const boolean = true const string = '这是一个字符串' const number = 1 const array = [] const object ...