早就听说了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相关推荐

  1. 数据结构与算法(二)单链表(Singly linked list)

    数据结构与算法(二)单链表(Singly linked list) 链表(Linked list) Python完整功能实现 LeetCode思想实践: 链这个东西大家一定都不陌生, 脖子上有项链, ...

  2. python创建一个有序链表_Python实现单向有序链表(Singly linked list)

    概念介绍 上一博文已经介绍了Python实现单向无序链表的实现方式,这篇博文来介绍Python如何实现单向有序链表.有序和无序仅仅指节点所包含的数据成员的大小排列顺序,有序指各个节点按照节点数据成员的 ...

  3. 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 ...

  4. 基本的数据结构:单链表(Singly Linked List)

    一.基本的数据结构:单链表(Singly Linked List) 什么是单链表? 下面是百度百科给出的官方解释: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表 ...

  5. 单链表(Singly LInked LIst)

    单链表(Singly Linked List) 单链表是比较常见的链表类型.其中每个节点都有一个指向序列下一个节点的指针.这意味着,对链表执行遍历时,只能在一个方向上从头到尾的遍历:为了能够访问链表中 ...

  6. Reverse a singly linked list python

    Reverse a singly linked list. class Solution(object):def reverseList(self, head):""": ...

  7. [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 ...

  8. LeetCode 206 Reverse a singly linked list.

    Reverse a singly linked list. Hint: A linked list can be reversed either iteratively or recursively. ...

  9. LintCode Delete Node in the Middle of Singly Linked List 在O(1)时间复杂度删除链表节点

    中文描述: 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2->3->4,和节 ...

  10. 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步,第二个指针开始从头遍历,当第一个指针到最 ...

最新文章

  1. 停止linux下正在执行的ping命令
  2. 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是否缺少程序集引用?...
  3. python下标从0开始_从零学Python之入门(三)序列
  4. 关于计算机设计的英语作文,一篇关于计算机的看法的英语作文
  5. python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发
  6. 你见过股市亏最惨的有多惨?
  7. 移动广告聚合平台经验分享:芒果、果合、KeyMob、Adview、抓猫哪家强?
  8. 项目周例会会议纪要模板
  9. oracle最小值寒素,新人教版备考2020年浙江中考语文复习专题:基础知识与古诗文专项特训(五十六)D卷...
  10. 内蒙古煤炭经济杂志社内蒙古煤炭经济编辑部2022年第14期目录
  11. powerbi服务器无法显示报表,Power BI 报表中的页面显示设置 - Power BI | Microsoft Docs...
  12. Vue.js / Nuxt.js / uni-app - 移动端 H5 网页,在电脑 PC 上打开时居中显示(手机网页在电脑上打开后,简单粗暴防止 “界面样式“ 拉伸变形的解决方案)适用所有web项目
  13. 大数据开发都需要掌握哪些编程语言
  14. windows下rabbitmq以服务启动时提示发生系统错误 1068
  15. Android -- 在线播放歌曲 1 -- 搜索歌曲
  16. 近红外光谱基础知识—数据预处理
  17. 机器人将颠覆零售业,看AI在零售行业有哪些应用?
  18. 2D卷积与3D卷积的区别
  19. 陌陌 Service Mesh 架构的探索与实践
  20. 马云现身杭州谈ChatGPT;GPT机器人要来了?OpenAI领投人形机器人公司;马斯克退出OpenAI内幕|极客头条

热门文章

  1. 计算机网络知识与技巧概括
  2. 纯css控制文字2行显示多余部分隐藏
  3. 某公司8面惨烈面试记录
  4. 简单分账系统的分账能力有多强?
  5. 集群对讲 文字 文件_英国小学生是如何学习中国高考词汇的?第一讲(文末留言送礼)...
  6. android 清单文件注册,在AndroidManifest(清单文件)中注册activity(活动)及配置主活动、更改App图标、App名称、修改隐藏标题栏...
  7. Azkaban任务流编写
  8. 手机项目开发过程简介
  9. 文献管理工具zotero的下载及使用
  10. 【转】OSD字符叠加芯片