📄 slist.h
字号:
/*
* 通用双向循环链表
* Author: huangqiang.zhou@gmail.com 2009-5-15
*/
#ifndef SLIST_H
#define SLIST_H
/* 计算结构体成员在结构体中的内存偏移 */
#define offsetof(TYPE, MEMBER) \
(size_t)&(((TYPE*)0)->MEMBER)
/* 由结构体结点成员计算结构体地址 */
#define container_of(TYPE, MEMBER, ADDR) \
(size_t)((size_t)ADDR - offsetof(TYPE, MEMBER))
/* 数据结构 */
struct Slist
{
struct Slist *pre;
struct Slist *next;
};
/* 双向循环链表初始化 */
#define slist_init(head) \
(head)->pre = (head); \
(head)->next = (head)
/* 双向循环链表在头结点后顺序增加结点 */
#define slist_add_node(head, node) \
(node)->next = (head)->pre->next; \
(node)->pre = (head)->pre; \
(head)->pre->next = (node); \
(head)->pre = (node)
/* 双向循环链表从后往前顺序删除结点 */
#define slist_del_node(head, node) \
(head)->pre = (node)->pre; \
(node)->pre->next = (head); \
(node)->next = NULL; \
(node)->pre = NULL
/* 双向循环链表获取第一个有数据的结点 */
#define slist_get_head(head) \
(head)->next
/* 双向循环链表获取后继结点 */
#define slist_next(head, node) \
(node)->next == (head) \
? NULL \
: (node)->next
/* 双向循环链表获取前驱结点 */
#define slist_pre(head, node) \
((node)->pre == (head) \
? NULL \
: (node)->pre)
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -