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 其它常见算法 ...
随机推荐
- kali添加开机自启[亲测有效]
kali添加开机自启 采用systemd的方法,kali默认是没有rc.local的,需要自己创建.本方法也适用于ubuntu 18.04 64bit 改写rc-local.service 文件 先从 ...
- JavaScript 字符串(String)对象的方法
anchor() 描述:用于创建 HTML 锚 原型:stringObject.anchor(anchorname) 用法: <script> var txt="Hello wo ...
- SpringMVC获取请求参数-POJO类型参数
1.Controller中的业务方法的POJO参数的属性名与请求参数一致,参数值会自动映射匹配 1.创建POJO类 public class User { private String usernam ...
- 检查oracle是否是rac
采样rac集群 [root@shfpdb02 disks]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.4 ( ...
- Lumia一键刷稳定版 Win10 arm 及其报错处理
前言 之前我发了一篇Lumia1520 刷Win10 arm双系统的文章,不过后来发现那个方法对小白来说太不友好,且系统也不稳定,所以我找到了更好的方法 刷机 我们可以利用刷机迷进行刷机,支持一键刷机 ...
- Java学习day5
API即应用程序编程接口,Java所包含的方法以及类很多,如果要使用他们就得了解这些的API如何使用,因为API多而复杂,我们可以通过帮助文档查询 与c/c++类似,Java通过Scanner类就可以 ...
- MySQL入门学习day3随笔3
JDBC 数据库驱动 我们的程序会通过数据库驱动和数据库打交道 JDBC Sun公司简化开发人员的操作,提供的规范 第一个JDBC项目 创建一个Java项目 导入jar包 编写测试代码 1 creat ...
- SpringMVC初学习
# SpringMVC快速入门 @[TOC](文章目录) --- # 前言 `提示:这里可以添加本文要记录的大概内容:` 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习 ...
- 删库到跑路?还得看这篇Redis数据库持久化与企业容灾备份恢复实战指南
本章目录 0x00 数据持久化 1.RDB 方式 2.AOF 方式 如何抉择 RDB OR AOF? 0x01 备份容灾 一.备份 1.手动备份redis数据库 2.迁移Redis指定db-数据库 3 ...
- Divan and bitwise operations
这是一道比较综合的数学题目,光是吧题目看懂就花了我好一会儿时间,先看看题目吧: 题目分析:对于m段给定连续段的或值,要求出n个数的序列子序列的异或值之和: 题解: 这道题,我们先不要把它当作一个数一个 ...