⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slist.h

📁 小型内存分配模块,用通用循环双向链表实现
💻 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 + -