Queue学习之Singly-Linked List
早就听说了libevent
这个开源网络库的大名,刚好最近时间比较闲,所以就拜读一下。计划是从0.1版本(最早版)开始看起,因为我想看一下libevent
成长历史和网络通信方面的相关技术发展。在libevent0.1
版本中,核心就是event
这个结构体了。而这个结构体中又用了sys/queue.h
中的TAIL QUEUES
。因此打算先学习一下sys/queue.h
中提到的几个queue
。本文将会讲解一下sys/queue.h
中的Singly-Linked-Lists
。
singly-linked list有一个SLIST_HEAD宏定义的结构作为链表头。这个结构包含一个指向该单向链表第一个元素的指针。单向链接的元素具有最小的空间,移除任意元素的指针操作开销为O(n)。新元素可以加在链表中已存在元素的后面或者在链表的头部。
单向链表的宏定义
/** Singly-linked List definitions.*/
#define SLIST_HEAD(name, type) \
struct name { \struct type *slh_first; /* first element */ \
}#define SLIST_HEAD_INITIALIZER(head) \{ NULL }#define SLIST_ENTRY(type) \
struct { \struct type *sle_next; /* next element */ \
}/** Singly-linked List access methods.*/
#define SLIST_FIRST(head) ((head)->slh_first)
#define SLIST_END(head) NULL
#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head))
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)#define SLIST_FOREACH(var, head, field) \for((var) = SLIST_FIRST(head); \(var) != SLIST_END(head); \(var) = SLIST_NEXT(var, field))/** Singly-linked List functions.*/
#define SLIST_INIT(head) { \SLIST_FIRST(head) = SLIST_END(head); \
}#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \(elm)->field.sle_next = (slistelm)->field.sle_next; \(slistelm)->field.sle_next = (elm); \
} while (0)#define SLIST_INSERT_HEAD(head, elm, field) do { \(elm)->field.sle_next = (head)->slh_first; \(head)->slh_first = (elm); \
} while (0)#define SLIST_REMOVE_HEAD(head, field) do { \(head)->slh_first = (head)->slh_first->field.sle_next; \
} while (0)
SLIST_HEAD
结构定义如下:
SLIST_HEAD(HEADNAME, TYPE) head;
HEADNAME
是要定义的单链表头结构体的名字,TYPE
是链表中的元素类型。下面就是定义了一个单链表头的指针:
struct HEADNAME *headp;
SLIST_ENTRY
宏声明了一个连接单链表内元素的结构体
SLIST_INIT
宏通过参数head
初始化单链表
SLIT_INSERT_HEAD
宏在单链表的头部插入一个元素elm
SLIST_INSERT_AFTER
宏插入一个新元素elm
SLIST_REMOVE_HEAD
宏从单链表头部移除元素elm
SLIST_REMOVE
宏从单链表中移除elm
单向链表的例子
LIST_HEAD(slisthead, entry) head;
struct slisthead *headp; /* 单向链表头部 */
struct entry {SLIST_ENTRY(entry) entries; /* 单向链表 */int data;
} *n1, *n2, *n3, *np;SLIST_INIT(&head); /* 初始化链表 */n1 = malloc(sizeof(struct entry)); /* 插入到头部 */
SLIST_INSERT_HEAD(&head, n1, entries);n2 = malloc(sizeof(struct entry)); /* 插入n1后面 */
SLIST_INSERT_AFTER(n1, n2, entries);SLIST_REMOVE(&head, n2, entry, entries); /* 移除n2 */
free(n2);n3 = head.slh_first; /* 移除头部元素 */
SLIST_REMOVE_HEAD(&head, entries);
free(n3);for (np = head.slh_first; np != NULL; np = np->entries.sle_next) /* 遍历 */np->data = 1;while (head.slh_first != NULL) {n1 = head.slh_first;SLIST_REMOVE_HEAD(&head, entries);free(n1);
}
参考资料
GNO:queue(3)
Queue学习之Singly-Linked List相关推荐
- 数据结构与算法(二)单链表(Singly linked list)
数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...
- python创建一个有序链表_Python实现单向有序链表(Singly linked list)
概念介绍 上一博文已经介绍了Python实现单向无序链表的实现方式,这篇博文来介绍Python如何实现单向有序链表.有序和无序仅仅指节点所包含的数据成员的大小排列顺序,有序指各个节点按照节点数据成员的 ...
- lintcode-easy-Delete Node in the Middle of Singly Linked List
Implement an algorithm to delete a node in the middle of a singly linked list, given only access to ...
- 基本的数据结构:单链表(Singly Linked List)
一.基本的数据结构:单链表(Singly Linked List) 什么是单链表? 下面是百度百科给出的官方解释: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表 ...
- 单链表(Singly LInked LIst)
单链表(Singly Linked List) 单链表是比较常见的链表类型.其中每个节点都有一个指向序列下一个节点的指针.这意味着,对链表执行遍历时,只能在一个方向上从头到尾的遍历:为了能够访问链表中 ...
- Reverse a singly linked list python
Reverse a singly linked list. class Solution(object):def reverseList(self, head):""": ...
- [LintCode] Delete Node in the Middle of Singly Linked List 在单链表的中间删除节点
Implement an algorithm to delete a node in the middle of a singly linked list, given only access to ...
- LeetCode 206 Reverse a singly linked list.
Reverse a singly linked list. Hint: A linked list can be reversed either iteratively or recursively. ...
- LintCode Delete Node in the Middle of Singly Linked List 在O(1)时间复杂度删除链表节点
中文描述: 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2->3->4,和节 ...
- Q2.2 Find the kth to last element of a singly linked list
Q: Find the kth to last element of a singly linked list A:两个指针,第一个指针从头开始,遍历k-1步,第二个指针开始从头遍历,当第一个指针到最 ...
最新文章
- 停止linux下正在执行的ping命令
- 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是否缺少程序集引用?...
- python下标从0开始_从零学Python之入门(三)序列
- 关于计算机设计的英语作文,一篇关于计算机的看法的英语作文
- python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发
- 你见过股市亏最惨的有多惨?
- 移动广告聚合平台经验分享:芒果、果合、KeyMob、Adview、抓猫哪家强?
- 项目周例会会议纪要模板
- oracle最小值寒素,新人教版备考2020年浙江中考语文复习专题:基础知识与古诗文专项特训(五十六)D卷...
- 内蒙古煤炭经济杂志社内蒙古煤炭经济编辑部2022年第14期目录
- powerbi服务器无法显示报表,Power BI 报表中的页面显示设置 - Power BI | Microsoft Docs...
- Vue.js / Nuxt.js / uni-app - 移动端 H5 网页,在电脑 PC 上打开时居中显示(手机网页在电脑上打开后,简单粗暴防止 “界面样式“ 拉伸变形的解决方案)适用所有web项目
- 大数据开发都需要掌握哪些编程语言
- windows下rabbitmq以服务启动时提示发生系统错误 1068
- Android -- 在线播放歌曲 1 -- 搜索歌曲
- 近红外光谱基础知识—数据预处理
- 机器人将颠覆零售业,看AI在零售行业有哪些应用?
- 2D卷积与3D卷积的区别
- 陌陌 Service Mesh 架构的探索与实践
- 马云现身杭州谈ChatGPT;GPT机器人要来了?OpenAI领投人形机器人公司;马斯克退出OpenAI内幕|极客头条