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 其它常见算法 ...
随机推荐
- Java核心知识1:泛型机制详解
1 理解泛型的本质 JDK 1.5开始引入Java泛型(generics)这个特性,该特性提供了编译时类型安全检测机制,允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,即给类型指定一个参 ...
- PyTorch 广播机制
PyTorch 广播机制 定义 PyTorch的tensor参数可以自动扩展其大小.一般的是小一点的会变大,来满足运算需求. 规则 满足一下情况的tensor是可以广播的. 至少有一个维度 两个ten ...
- Java并发编程之Lock(同步锁、死锁)
这篇文章是接着我上一篇文章来的. 上一篇文章 同步锁 为什么需要同步锁? 首先,我们来看看这张图. 这是一个程序,多个对象进行抢票. package MovieDemo; public class T ...
- 【第三课】常用的Linux命令(学习笔记)
4月8日 学习笔记打卡
- Java基础语法Day_04
第11节 开发工具-IDEA day04_01_集成开发环境IDE的概述 day04_02_IntelliJ-IDEA的安装 day04_03_IDEA的项目结构 day04_04_IDEA的Hell ...
- Hadoop3.x 三大组件详解
Hadoop Hadoop适合海量数据分布式存储和分布式计算 运行用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理 1. 概述 1.1 简介 Hadoop核心组件 HDFS (分布式文 ...
- springboot:使用异步注解@Async的前世今生
在前边的文章中,和小伙伴一起认识了异步执行的好处,以及如何进行异步开发,对,就是使用@Async注解,在使用异步注解@Async的过程中也存在一些坑,不过通过正确的打开方式也可以很好的避免,今天想和大 ...
- Linux学习教程 | 全文目录
本教程最大的特点是通俗易懂,并且非常详细,花费 7 天时间即可快速了解 Linux. 第一章 Linux简介 1.1 操作系统是什么,操作系统概述 1.2 Linux是什么,有哪些特点? 1.3 Li ...
- Linux 运维工程师面试问答录(推荐阅读)
一个执着于技术的公众号 本文整理了一些比较常见的 Linux 相关的面试题目,该问答录主要分为基础知识篇和服务器篇.内容主要涉及 Linux 基本原理.常用命令操作.服务器应用等部分的内容. Linu ...
- 大白话详解HTTPS!
开源Linux 回复"读书",挑选书籍资料~ 我相信大家面试的时候对于 HTTPS 这个问题一定不会陌生,可能你只能简单的说一下与 HTTP 的区别,但是真正的原理是否很清楚呢?他 ...