通用链表实现(参考Linux List)】的更多相关文章

最近参考Linux实现的通用双向链表时,因typeof并不是标准c规定的关键字,除GCC编译器外其他编译器未必支持typeof关键字,所以在使用上并不能想Linux所实现的链表哪样灵活,它要求将连接器即链表结构作为用户自定义结构体的第一个元素使用,话不多说,直接上代码,内嵌详细注释. IList.h #ifndef _I_LIST_H_2012_11_23_ #define _I_LIST_H_2012_11_23_ #ifdef __cplusplus extern "C" { #e…
通常我们设计设计链表都是将数据域放在里面,这样每次需要使用链表的时候都需要实现一个链表,然后重新实现它的相关操作,这里参考Linux系统中的设计实现了一个通用的双向链表,只需要在你的结构里面有一个这个链表的域,就可以使用链表的相关操作了. 注意:这个通用的双向链表是参考Linux系统中的实现,它使用了typeof这个功能,所以有些编译器可能不支持.我是再Windows系统中使用MinGW下使用GCC编译的. ////////////////////////////////////////////…
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head.本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使用的函数都给出了详细的说明和测试用例,并且移植了Linux内核的链表结构,在任意平台都可以方便的调用内核已经写好的函数.建议收藏,以备不时之需! @ 目录 链表简介 单链表 双链表 循环链表 Linux内核中的链表 链表的定义 链表的初始化 内核实现 说明 举例 链表增加节点 内核实现 说明 举例…
注意:本文讨论的是无头单向非循环链表. 假设不采用Linux内核链表的思路,怎样用C语言实现通用链表呢? 一种常用的做法是: typedef int element_t; struct node_info { element_t data; struct node_info *next; }; 其实这样的链表算不上通用,因为无法同时使用不同的数据类型.参考网友的思路,以上可以改为下面的定义: //无头非循环单向链表 struct node_info { void *data; struct no…
引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是C++写,界面是C#写.那时候刚进去评级我是中级,因为他问我关于系统锁和信号量都答出来.开发一段 时间,写C#也写的很溜.后面招我那个人让我转行就写C++和php,那时候就开始学习C++有关知识. 后面去四川工作了,开发安卓,用eclipse + java语法 + android jdk,开发前端,…
最近编程总想着参考一些有名的开源代码是如何实现的,因为要写链表就看了下linux内核中对链表的实现. 链表是一种非常常见的数据结构,特别是在动态创建相应数据结构的情况下更是如此,然而在操作系统内核中,动态创建相应的数据结构尤为频繁.由于不带数据域所以Linux中的这种链表是通用的,在如何情况下,只要需要链表的数据结构包含它就行了. 链表只包含两个指针 struct list_head { struct list_head *next, *prev; }; 数据结构如果需要链表只需要包含它就行 t…
在前面的文章中,我们讨论了如何实现通用类型的链表,方法是用void *类型的指针,指向数据.那么还有其他的方法吗(不考虑内核链表)? 答案是肯定的.用零长数组也可以实现. struct node_info { struct node_info *next; struct node_info *prev; char data[0]; }; 这里的最后一个元素,是元素个数为0的数组.其不占用任何空间,甚至是一个指针的空间都不占! 注意:在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU…
引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的.这里当然不是指随机存取那些东西,而是因为链表的构造方法(在一个结构体中套入其同类型指针)使得链表本身的逻辑操作(如添加结点,删除结点,查询结点等),往往与其应用场景中的业务数据相互混杂.这导致我们每次使用链表都要进行手工打造,做过链表的人肯定对此深有了解. 是否能将链表从变换莫測的业务数据中抽象出…
安装mysql前可能需要其他软件的依赖,请先执行下面命令安装mysql的依赖软件 shell> apt-cache search libaio # search for info shell> apt-get install libaio1 # install library 然后可以进入mysql的安装步骤了 1 解压缩二进制文件: tar -xzvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz 2 将解压后的文件夹更名为mysql mv mysql-…
前两节,我们已经完成了链表的一些操作,快来测试一下吧. 这里使用的单元测试工具名字叫"check". START_TEST(my_slist_1) { struct student students[8] = {{"WangDong",18},{"LiuMing",19},{"SunYazhou",21},{"ChenYu",27},{"LiuXuewei",28},\ {"Z…