C++数据结构笔记(4)企业链表的实现(Linux内核链表)

news2024/12/28 5:42:07

1.企业链表本质上是一种Linux内核链表

2.最本质的区别在于,传统的结点类型中直接同时包含了指针域和数据域,用来实现和其他结点之间的串联;而在企业链表中,结点本身只含有指针域,而数据部分的具体实现则在测试文件中实现即可!这样做的好处是,开发者可以自由的添加自己的数据类型,而不再受限于既定的类型

#ifndef LINKLIST_H
#define LINKLIST_H

typedef struct LinkNode{
    LinkNode* next;
};

#endif 

        注意,上述定义中只包含了指向下一个结点的指针next,而不包含关于数据内容的声明

void* data

之后,开发者只需要将自定义的类型再强转为LinkNode结点类型,即可实现结点的串联

3.企业链表相当于只串联指针,精髓在于将自定义的类型转换为node*,只串联了自定义类型里面的node类型。

4.通俗的说,企业链表的功能就是将自定义的结构体类型转换为指针连接起来,当使用结构体的属性时,再转换回来

LinkList.h头文件

#ifndef LINKLIST_H
#define LINKLIST_H

//链表的小结点 
typedef struct LinkNode{
	LinkNode* next;
};
//链表
typedef struct LinkList{
	LinkNode* head;
	int size;
}; 
//定义打印类型
typedef void(*PRINTNODE)(LinkNode*); 
//定义比较类型
typedef int(*COMPARENODE)(LinkNode*,LinkNode*); 

//初始化链表
LinkList* Init_LinkList();
//插入 
void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
//注意,此处并不是空指针,而是LinkNode型的数据
 
//删除
void Remove_LinkList(LinkList* list,int pos);
//查找
int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare);
//查找函数返回的是位置 
 
//返回链表大小
int Size_InitList(LinkList* list);
//打印
void Print_LinkList(LinkList* list,PRINTNODE print);


//释放链表内存 
void FreeSpace_LinkList(LinkList* list);


#endif 

LinkList.c实现文件

初始化链表

LinkList* Init_LinkList(){
	LinkList* list=(LinkList*)malloc(sizeof(LinkList));
	//开辟内存并强转位LinkList*类型
	list->head->next=NULL;
	list->size=0;
	return list; 
}

插入元素 

void Insert_LinkList(LinkList* list,int pos,LinkNode* data){
	//注意,此处并不是空指针,而是LinkNode型的数据
	if(list==NULL)
		return;
	if(data==NULL)
		return;
	if(pos<0||pos> list->size)
		pos=list->size;
	//如果超越大小则直接插在尾部
	
	//查找插入位置
	LinkNode* pCurrent=(list->head);
	//head结点需要进行取址操作 
	for(int i=0;i<pos;i++)
		pCurrent=pCurrent->next;
	//插入新结点
	data->next=pCurrent->next;
	pCurrent->next=data;
	
	list->size++; 
}

删除元素 

void Remove_LinkList(LinkList* list,int pos){
	if(list==NULL)
		return;
	if(pos<0||pos> list->size)
		pos=list->size;
	LinkNode* pCurrent=list->head->next;
	for(int i=0;i<pos;i++)
		pCurrent=pCurrent->next;
	pCurrent->next=pCurrent->next->next;
	//直接指向下一个
	list->size--; 
}

查找元素 

int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare){
	if(list==NULL)
		return -10;
	if(data==NULL)
		return -10;
	LinkNode* pCurrent=list->head->next;
	int index=0;
	while(pCurrent!=NULL)
	{
		if(compare(pCurrent,data)==0)
		{
			break;
		}
				
		pCurrent=pCurrent->next;
		index++;
	}
	
	return index;
}

返回链表大小

int Size_InitList(LinkList* list){
	return list->size;
}

打印链表

void Print_LinkList(LinkList* list,PRINTNODE print){
		if(list==NULL)
			return;
		LinkNode* pCurrent=list->head->next;
		while(pCurrent!=NULL)
		{
			print(pCurrent);
			pCurrent=pCurrent->next;	
		} 
}

释放链表内存

void FreeSpace_LinkList(LinkList* list){
	if(list==NULL)
		return;
	free(list);
	
}

然后是测试main函数,如下:

#include <iostream>
#include <string.h>
#include "LinkList.h"
using namespace std;

typedef struct Goal{
	LinkNode node;
	char name[64];
	int num;
	
}Goal;

void myPrint(LinkNode* data)
{
	Goal* g=(Goal*)data;
	cout<<(g->name)<<" "<<(g->num)<<endl;	
}

int main(int argc, char** argv) {
	
	LinkList* list=Init_LinkList();
	
	Goal g1,g2;
	strcpy(g1.name,"JSL");
	strcpy(g2.name,"HYH");
	g1.num=7371;
	g2.num=7166;
	
	Insert_LinkList(list,0,(LinkNode*)&g1);
	Insert_LinkList(list,1,(LinkNode*)&g2);
	
	Print_LinkList(list,myPrint);
	FreeSpace_LinkList(list);
	
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

细数 List 的10个坑,保证你一定遇到过!

List 在实际的业务开发中&#xff0c;使用的非常频繁&#xff0c;但同样也有不少的坑&#xff0c;一旦使用不当&#xff0c;就可能带来一系列的问题&#xff1b;今天我们主要来说一说这些问题&#xff0c;以及面对这些坑的时候我们要怎么解决。 Arrays.asList转换基本类型数组…

深度学习----第J2周:ResNet50V2算法实现

深度学习----第J2周&#xff1a;ResNet50V2算法实现 文章目录 深度学习----第J2周&#xff1a;ResNet50V2算法实现前言一、ResNetV2与ResNet结构对比二、模型复现2.1 Residual Block2.2 堆叠的 Residual Block2.3 ResNet50V22.4 查看模型结构2.5 tf下全部代码 三、Pytorch复现3…

有哪些数据分析的工具?

来了&#xff0c;9款大数据&数据分析工具推荐&#xff0c;分享点和别人不一样的。 一、基于 Apache Hudi 的 Onehouse https://www.onehouse.ai 近日&#xff0c;开源大数据项目 Apache Hudi 创始人 Vinoth Chandar 发文官宣基于 Hudi 构建的商业公司和产品 Onehouse&…

Linux +Docker镜像打包导出,上传至内网服务器

1. docker容器打包成镜像和压缩 &#xff08;1&#xff09;首先查看镜像所在的容器&#xff0c;获取到容器id docker ps -a&#xff08;2&#xff09;将容器保存成镜像 sudo docker commit -a yjw e007d8b7e1b7 my_projectv2:v2sudo&#xff1a;以管理员权限运行命令&#x…

Unity快速上手系列1之:2D物理弹球

大家好。 以“跳一跳”为开端&#xff0c;微信小游戏从前几年起以迅雷不及掩耳盗铃儿响叮当之势席卷了用户的手机。从创意小游戏&#xff0c;到页游遗风的挂机游戏&#xff0c;一时间百花齐放。 当然&#xff0c;前者说是创意&#xff0c;其实绝大部分也就是直接把其他平台上的…

5.8.2 TCP报文段首部格式

5.8.2 TCP报文段首部格式 TCP报文段首部格式在很大程度上体现了TCP协议的功能 一、数据封装过程 如图 应用层报文传送到传输层之后&#xff0c;加上TCP报文段的首部构成了TCP数据传送单位&#xff0c;我们称之为TCP报文段。在发送时TCP报文段是作为IP数据报的数据部分&#…

linux虚拟内存管理

目录 虚拟内存分布 进程虚拟内存空间的管理 内核如何划分用户态和内核态虚拟内存空间 内核如何管理虚拟内存区域 定义虚拟内存区域的访问权限和行为规范 关联内存映射中的映射关系 虚拟内存区域在内核中是如何被组织的 程序编译后的二进制文件如何映射到虚拟内存空间中 …

探索图像处理的利器——OpenCV

目录 引言&#xff1a; 一、OpenCV简介&#xff1a; 二、OpenCV的特点&#xff1a; 三、OpenCV的应用领域&#xff1a; 四、实际案例&#xff1a; 结论&#xff1a; 引言&#xff1a; 在当今信息化的时代&#xff0c;图像处理已经成为了日常生活中不可或缺的一部分。从社…

4742. 电(acw每日一题)

来源&#xff1a;Google Kickstart2022 Round H Problem C 题目描述 某城市有 N个电力节点&#xff0c;编号 1∼N。 这些电力节点形成的电力网络&#xff0c;可以看作一个 N 个节点 N−1 条边的连通图。 每个电力节点都有一个固定的电容&#xff0c;其中第 i 个节点的电容为…

CSS 备忘录-基础内容

目录 1、CSS的基本结构 2、样式表的来源以及优先级 3、选择器的优先级 4、源码顺序 5、px、em、rem单位 6、视口相对单位 7、使用 calc() 来定义属性值 8、一些无单位的属性 9、自定义属性 10、使用 JavaScript 来动态修改自定义属性 11、overflow 属性 12、子元素…

【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

文章目录 定时器1_定时中断定时器2_定时中断定时器3_定时中断定时器4_定时中断定时器5_定时中断 高级定时器和普通定时器的区别&#xff08;https://zhuanlan.zhihu.com/p/557896041&#xff09;&#xff1a; 定时器1_定时中断 TIM1是高级定时器&#xff0c;使用的时钟总线是R…

bochs编译安装

编译命令 ./configure --prefix‘/usr/local/bochs2.7’ --enable-debugger --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11 make sudo make install 配置文件 bochsrc # configuration file generated by Bochs plugin_ctrl: unmapped1, biosde…

让开源项目从易用到好用 | 亚马逊的开源文化

亚马逊的领导力准则是亚马逊文化的核心&#xff0c;它如同亚马逊的 DNA 融入贯穿每一个重要决策&#xff0c;深深影响着每一位亚麻人、影响着每一位亚马逊的客户、合作伙伴以及每一位亚马逊云科技的构建者。同时&#xff0c;亚马逊的领导力准则对亚马逊与开源的互动方式也产生着…

如何设计一个文件系统?需要考虑哪些因素?

文件系统的实现 在对文件有了基本认识之后&#xff0c;现在是时候把目光转移到文件系统的实现上了。之前用户关心的一直都是文件是怎样命名的、可以进行哪些操作、目录树是什么&#xff0c;如何找到正确的文件路径等问题。而设计人员关心的是文件和目录是怎样存储的、磁盘空间…

数字孪生和GIS融合会为城市交通带来哪些便利?

数字孪生和GIS的融合对于城市交通领域带来了诸多便利&#xff0c;从智能交通管理到出行体验的提升&#xff0c;为城市交通带来了全新的发展机遇。 首先&#xff0c;数字孪生技术与GIS的结合可以实现智能交通管理。通过GIS建立城市交通网络的数字孪生模型&#xff0c;可以实时模…

程序员找工作难!拿到外包公司的 offer 我应该去么?

引言 前一阵子有一个帖子引起了非常广泛的讨论&#xff0c;描述的就是一个公司的外包工作人员&#xff0c;加班的时候因为吃了公司给员工准备的零食,被公司的HR当场批评&#xff01;这个帖子一发出来&#xff0c;让现在测试行业日益新增的外包公司备受关注。那么外包公司和非外…

Qt开发1--QCustomPlot的第一个示例

本文记录了在Linux上使用QCustomPlot进行一个基本绘制所需的完整过程&#xff0c;包括如何使用qtcreator&#xff0c;编辑ui以及编写相应的C代码。以下是详细步骤&#xff1a; 1、使用qtcreator启动开发环境&#xff1a; [blctrlmain-machine qt]$ qtcreator 启动后&#xf…

GBDT精讲

GBDT算法的流程 首先GBDT是通过采用加法模型(即基函数的线性组合)&#xff0c;以及不断减小训练过程产生的残差来达到将数据分类或回归的算法。 GBDT通过多轮迭代&#xff0c;每轮迭代产生一个弱分类器&#xff0c;每个分类器在上一轮分类器的梯度(如果损失函数是平方损失函数…

Quiz 4: Functions | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 4: Functions 单选题&#xff08;1-9&#xff09;编程题Exercise 4.6 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This course aims to teach everyone the basics of programming computers using Python. 本课…

JAVA2

文章目录 前言 前言 创建&#xff0c;编译java&#xff08;每4修改一次就要重新编译&#xff01;&#xff09; 第一个程序&#xff1a; 解决中文乱码问题&#xff1a; 效果&#xff1a; 总结&#xff1a;