听黑马程序员教程《基础数据结构和算法 (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语言 - 基础数据结构和算法 - 企业链表的更多相关文章

  1. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  2. C语言- 基础数据结构和算法 - 循环链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  3. C语言- 基础数据结构和算法 - 栈的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  4. C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611

    09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...

  5. C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  6. C语言- 基础数据结构和算法 - 队列的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  7. C语言- 基础数据结构和算法 - 栈的链式存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  8. C语言- 基础数据结构和算法 - 动态数组

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  9. 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...

随机推荐

  1. nodejs创建服务器

      'use strict'; //加载http模块: const http = require('http'); //创建一个http服务: const server = http.createSe ...

  2. Java多线程与线程池技术

    一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...

  3. thymeleaf的具体语法

    thymeleaf模板引擎是什么?请点击我查看 文章目录 thymeleaf模板引擎是什么?请点击我查看 代码 该实例代码延续[thymeleaf模板引擎](https://blog.csdn.net ...

  4. Prometheus介绍及docker安装方式

    一.介绍 Prometheus是主要基于Go编写,最初在SoundCloud上构建的开源系统监视和警报工具包,它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 ...

  5. python爬虫---字体反爬

    目标地址:http://glidedsky.com/level/web/crawler-font-puzzle-1 打开google调试工具检查发现网页上和源码之中的数字不一样, 已经确认该题目为 字 ...

  6. Centos7 搭建 Socks 服务

    Centos7 搭建 Socks 服务 一丶拿到一个动态拨号的服务器还不能使用网络得先打开: pppoe-start 二丶安装命令汇总: 通过yum安装ss5 依赖包: yum install gcc ...

  7. 2021.08.01 P4359 伪光滑数(二叉堆)

    2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...

  8. Java第十四周作业

    2.设计2个类,要求如下:(知识点:类的继承 方法的覆 盖) [必做题] 2.1 定义一个汽车类Vehicle, 2.1.1 属性包括:汽车品牌brand(String类型).颜色clr (Strin ...

  9. Python 函数进阶-迭代器

    迭代器 什么是迭代器 能被 next 指针调用,并不断返回下一个值的对象,叫做迭代器.表示为Iterator,迭代器是一个对象类型数据. 概念 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重 ...

  10. MyBatis插件 - 通用mapper

    1.简单认识通用mapper 1.1.了解mapper 作用:就是为了帮助我们自动的生成sql语句 [ ps:MyBatis需要编写xxxMapper.xml,而逆向工程是根据entity实体类来进行 ...