说明

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

准备

定义双链表

#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. Nginx高并发实现原理以及常用的优化手段

    Nginx 是如何实现高并发的? 异步,非阻塞,使用了epoll 和大量的底层代码优化. 如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数.正常情况下,会有很多进程一 ...

  2. PMP之挣值管理(PV、EV、AC、SV、CV、SPI、CPI)的记忆方法

    挣值管理法中的PV.EV.AC.SV.CV.SPI.CPI这些英文简写相信把大家都搞得晕头转向的.在挣值管理法中,需要记忆理解的有三个参数:PV.AC.EV. PV:计划值,在即定时间点前计划完成活动 ...

  3. Jquery.Datatables dom表格定位 (转)

    Datatables会添加一些控制元素在表格的周围,比如默认状态下改变每页显示条数(l)的空间在左上角,即使搜索框(f)在右上角,表格的信息(i)显示在左下角,分页控件(p)显示在右下角. 这些控件在 ...

  4. RestTemplate踩坑 之 ContentType 自动添加字符集

    写在前边 最近在写 OAuth2 对接的代码,由于授权服务器(竹云BambooCloud IAM)部署在甲方内网,所以想着自己 Mock 一下授权方的返回体,验证一下我的代码.我这才踩到了坑-- 故事 ...

  5. Spring中毒太深,离开了Spring,我居然连最基本的接口都不会写了¯\_(ツ)_/¯

    前言 众所周知,Java必学的框架其中就是SSM,Spring已经融入了每个开发人员的生活,成为了不可或缺的一份子. 随着 Spring 的崛起以及其功能的完善,现在可能绝大部分项目的开发都是使用 S ...

  6. Zwibbler—前端Canvas绘图工具使用记录

    本人第一次发博客,用意在于记录自己在开发过程中用到的实用工具并分享出来,写的可能不好,请大家多多包涵!!! 工具官网:https://www.zwibbler.com 基于Canvas的一个前端绘画工 ...

  7. Where和having都是条件筛选关键字,它们有什么分别?

    WHERE是在数据分组前进行条件过滤, HAVING子句是在数据分组后进行条件过滤,WHERE子句中不能使用聚合函数,HAVING子句可以使用聚合函数. 需要注意说明:当同时含有where子句.gro ...

  8. Java并发机制(8)--concurrent包下辅助类的使用

    Java并发编程:concurrent包下辅助类的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920397.html 1.CountDown ...

  9. ApplicationContext通常的实现是什么?

    FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数. ClassPathXmlA ...

  10. System.getenv和getProperty的区别

    /** * System.getenv()是获取---环境变量(environment variables), * 系统层面的,好比我linux系统里的.bash_profile文件里面的变量 * 返 ...