说明

共享双链表意义在于,可以用一套函数维护不同数据类型的双链表

准备

定义双链表

#include <iostream>
#include <string> using namespace std; //此处并不包含数据域,仅有指针域用于连接结点
typedef struct _DbLinkList
{
struct _DbLinkList *next;
struct _DbLinkList *prev;
}DbLinkList;

定义结构体

//定义数据类型,并挂载双链表的指针
struct num
{
int data;
DbLinkList node; //此处不用指针,以保证在为该结构体分配内存时同时为双链表分配
}; struct str
{
string data;
DbLinkList node; //此处不用指针,以保证在为该结构体分配内存时同时为双链表分配
};

操作

初始化

//因为在保存数据的结构体中未用双链表的指针,所以此处L使用引用而非引用类型的指针
bool initList(DbLinkList &L)
{
L.next = NULL;
L.prev = NULL;
return true;
}

尾插法

bool insertBack(DbLinkList &L, DbLinkList &node)
{
DbLinkList *p = &L; while(p->next) p = p->next; node.next = NULL;
p->next = &node;
node.prev = p; return true;
}

实际操作

对于struct num

main函数

int main()
{ num *N = new num;
N->data = -1; initList(N->node); //尾插法
num *n = new num;
n->data = 2;
insertBack(N->node, n->node); //用链表访问结点的数据
DbLinkList *p = &(N->node);
while(p)
{
//获取在结构体中node距离结构体顶点的距离
int offset = offsetof(num, node);
/*
* data地址 = 结构体底地址 - node距离结构体顶点的距离
* 但指针不能直接加减,所以要先转化为size_t类型,得到结果后再转为指针类型
*/
num *tmp = (num *)((size_t)p - offset);
cout << "NUM:" << tmp->data << endl;
p = p->next;
} return 0;
}

输出结果

NUM:-1
NUM:2

对于struct str

同理

main函数

int main()
{
str *S = new str;
S->data = "hello,world"; initList(S->node); //尾插法
str *s = new str;
s->data = "你好,世界";
insertBack(S->node, s->node); //用链表访问结点的数据
DbLinkList *p = &(S->node);
while(p)
{
//获取在结构体中node距离结构体顶点的距离
int offset = offsetof(str, node);
/*
* data地址 = 结构体底地址 - node距离结构体顶点的距离
* 但指针不能直接加减,所以要先转化为size_t类型,得到结果后再转为指针类型
*/
str *tmp = (str *)((size_t)p - offset);
cout << "STR:" << tmp->data << endl;
p = p->next;
} return 0;
}

输出结果

STR:hello,world
STR:你好,世界

(注意:本文没有做双链表的销毁操作,虽然程序可以正常运行但这样做是不可取的)

思考

能不能将不同类型的结构体都放在一个双链表上?

如果能该怎么读取数据?

Linux内核链表之共享双链表的更多相关文章

  1. Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

    直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:

  2. linux内核里的字符串转换 ,链表操作常用函数(转)

    1.对双向链表的具体操作如下: list_add ———向链表添加一个条目 list_add_tail ———添加一个条目到链表尾部 __list_del_entry ———从链表中删除相应的条目 l ...

  3. Python与数据结构[0] -> 链表/LinkedList[1] -> 双链表与循环双链表的 Python 实现

    双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指 ...

  4. 深入分析 Linux 内核链表--转

    引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...

  5. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  6. Linux内核中链表实现

    关于双链表实现,一般教科书上定义一个双向链表节点的方法如下: struct list_node{ stuct list_node *pre; stuct list_node *next; ElemTy ...

  7. Linux 内核链表的使用及深入分析【转】

    转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...

  8. linux 内核的链表操作(好文不得不转)

    以下全部来自于http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 无任何个人意见. 本文详细分析了 2.6.x 内 ...

  9. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

随机推荐

  1. 关于使用charles进行mock步骤

    1.应用场景: 1.1 测试环境中,可能存在部分依赖外部系统的http接口,因为外部系统未部署或服务不可用等其他原因,导致接口无法正常响应(特别是qa1环境): 而平时的测试主要还是以界面上的功能测试 ...

  2. idea导入gitee下载的项目文件

    前一段时间在学习javaWeb时想要把gitee中的下载的项目在本地环境中跑一遍,然后根据效果再自己做出来. 但是当导入到IDEA中,配置完tomcat后一直报404错误.404是学习javaweb阶 ...

  3. 不会DRF?源码都分析透了确定不来看?

    目录 不会DRF?源码都分析透了确定不来看? 快速使用DRF写出接口 序列化和反序列化 drf快速使用 views.py serializer.py urls.py 在settings的app中注册 ...

  4. Idea集成CSSO插件压缩css文件

    首先需要本地已安装node环境,并且csso-cli已通过npm安装到本地目录,只要能找到就行. 1. 打开Settings配置,确认图中的 File Watchers 插件是否已存在,如果不存在,去 ...

  5. Redis 常见的性能问题都有哪些?如何解决?

    Redis 常见的性能问题都有哪些?如何解决? Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最 ...

  6. elasticsearch 是如何实现 master 选举的 ?

    面试官:想了解 ES 集群的底层原理,不再只关注业务层面了. 前置前提: 1.只有候选主节点(master:true)的节点才能成为主节点. 2.最小主节点数(min_master_nodes)的目的 ...

  7. (stm32f103学习总结)—stm32定时器中断

    一.定时器介绍 STM32F1的定时器非常多,由2个基本定时器(TIM6.TIM7).4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1.TIM8)组成.基本定 时器的功能最为简单,类似 ...

  8. 顺利通过EMC试验(2)

    限制值 电磁波照射,静电放电敏感性

  9. EMC EMI EMS定义与区别

    一.EMC EMI EMS定义: EMC(ElectromagneticCompatibility) 电磁兼容,是指设备或系统在电磁环境中性能不降级的状态.电磁兼容,一方面要求系统内没有严重的干扰源, ...

  10. 基于HTML5的网络拓扑图(1)

    什么是网络拓扑 网络拓扑,指构成网络的成员间特定的排列方式.分为物理的,即真实的.或者逻辑的,即虚拟的两种.如果两个网络的连接结构相同,我们就説它们的网络拓扑相同,尽管它们各自内部的物理接线.节点间距 ...