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

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.hqwc.cn/news/2103.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】k8s之pod基础(下)

1.pod的镜像拉取策略 1.1 镜像拉取说明 当你在创建容器时会针对指定的镜像来进行容器的创建&#xff0c;所以pod的创建是以镜像为基础。当你在拉取镜向不指定仓库的主机名&#xff0c;Kubernetes 认为你在使用 Docker 公共仓库。 在镜像名称之后&#xff0c;你可以添加一个…

Stage模型HarmonyOS服务卡片开发ArkTS卡片相关模块

图1 ArkTS卡片相关模块 FormExtensionAbility&#xff1a;卡片扩展模块&#xff0c;提供卡片创建、销毁、刷新等生命周期回调。 FormExtensionContext&#xff1a;FormExtensionAbility的上下文环境&#xff0c;提供FormExtensionAbility具有的接口和能力。 formProvider&…

自制游戏引擎

这是一个玩具 1. 引擎使用流程 SmallEngine是引擎的核心模块,封装渲染功能和场景管理功能等Editor是编辑器,类似unity和ue编辑器,能够动态添加对象和组件Sandbox是游戏播放器,能够运行游戏 2. SmallEngine 参考 https://www.bilibili.com/video/BV1KE41117BD/?spm_id_from333…

基于PyQt5的图形化界面开发——天气应用

目录 0. 前言1. 注册心知天气2. 代码实现3. 其他PyQt5文章 0. 前言 本节使用PyQt5开发天气应用程序实现以下功能&#xff1a; 通过调用天气API获取实时天气数据&#xff0c;并在应用程序中显示当前城市的温度、天气状况、风速等信息。 操作系统&#xff1a;Windows10 专业版…

ps htop 输出可读文件

需要安装sudo apt-get install aha echo q | ps auxf | aha --black --line-fix > psps.html echo q | htop | aha --black --line-fix > htop.html 使用浏览器打开

MYSQL 数据清理磁盘没变小问题解决方法

我们到数据目录查看有些表比较大&#xff0c;清理了一些无用数据后发现&#xff0c;文件大小不变。这是mysql的机制导致的。 解决方法&#xff1a;重建索引释放空间。 alter table $TABLE engineInnoDB;

代码随想录算法训练营第五十二天|300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组

最长递增子序列 dp[i]的定义dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度状态转移方程 位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 1 的最大值。 所以&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1);dp[i]的初始化 每一…

DETR系列:RT-DETR(一) 论文解析

论文&#xff1a;《DETRs Beat YOLOs on Real-time Object Detection》 2023.4 DETRs Beat YOLOs on Real-time Object Detection&#xff1a;https://arxiv.org/pdf/2304.08069.pdf 源码地址&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/tree/develop/conf…

项目——学生信息管理系统7

目录 学生选课功能的介绍 把 课程的数据库表创建出来 创建实体类 创建添加课程页面 AddCourseFrm&#xff0c;注意创建成JInternalFrame类型 页面制作&#xff0c;具体参照之前的 回到 MainFrm 添加课程管理菜单项 给添加课程按钮绑定事件 回到AddCourseFrm 页面 1. 把…

Solid Converter PDF v10 安装及使用教程

目录 一、软件介绍二、下载教程三、安装教程四、使用教程1.PDF转Word、Html等2.合并PDF文件 一、软件介绍 Solid Converter PDF是一套专门将PDF文件转换成Word的软件。 能够将PDF转换为Word、Excel、HTML、PowerPoint、纯文本文件从PDF文档中提取数据并以CSV等格式保存能够转…

CENTOS上的网络安全工具(二十四)Windows下的Hadoop+Spark编程环境构建

前面我们搭建了hadoop集群&#xff0c;spark集群&#xff0c;也利用容器构建了spark的编程环境。但是一般来说&#xff0c;就并行计算程序的开发&#xff0c;一刚开始一般是在单机上的&#xff0c;比如hadoop的single node。但是老师弄个容器或虚拟机用vscode远程访问式开发&am…

Android13 安装最新版 Frida

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰&#xff0c;更不会影响计算机信息系统的正常运行。不得将代码用于非法用途&#xff0c;如侵立删&#xff01; Android13 安装最新版 Frida 环境 win10Pixel4Android13Python3.9Frida1…