很多时候需要用到C语言方式的内置链表,根据处理类型多重交叉链接, 非常方便, 这里贴一下链表实现。
// 内置链表
#ifndef CoreLink_h__
#define CoreLink_h__
// 链表
struct LinkNode
{
LinkNode* next;
LinkNode* front;
};
// 初始化链表
#define InitLink(root) ((root)->next = (root)->front = (root))
// 添加到结尾
#define LinkAddToTail(root, node) \
{ \
(node)->next = (root); \
(node)->front = (root)->front; \
(root)->front->next = (node); \
(root)->front = (node); \
}
// 添加到头部
#define LinkAddToHead(root, node) \
{ \
(node)->next = (root)->front; \
(node)->front = (root); \
(root)->next->front = (node); \
(root)->next = (node); \
}
// 移除节点
#define LinkRemoveSelf(node) \
{ \
(node)->front->next = (node)->next; \
(node)->next->front = (node)->front;\
(node)->next = (node)->front = NULL;\
}
// 是否为空
#define LinkEmpty(root) ((root)->next == (root))
// 第一个节点
#define LinkFirst(root) ((root)->next)
// 最后一个节点
#define LinkTail(root) ((root)->front)
// 下一个节点
#define LinkNext(node) ((node)->next)
// 上一个节点
#define LinkFront(node) ((node)->front)
// 节点是否有效
#define LinkNodeValid(root, node) ((node) && ((node) != (root)))
// 清空节点
#define LinkClear(root) \
do{ \
if (LinkEmpty(root)) { \
break; \
} \
\
while (auto node = LinkFirst(root)) { \
if (!LinkNodeValid(root, node)) { \
break; \
} \
LinkRemoveSelf(node); \
} \
}while(0)
// 获取父类结构体指针
#define LinkNodeData(root, node, data_struct, member)\
(data_struct*)((char*)node - (char*)(&((data_struct*)0)->member))
// 遍历链表
// @cb : void cb(data_struct* ptr);
#define LinkLoopData(root, data_struct, member, cb) \
do{ \
for (auto node = LinkFirst(root); LinkNodeValid(root, node); \
node = LinkNext(root, node)){ \
data_struct* ptr = LinkNodeData(root, node, data_struct, member); \
cb(ptr); \
} \
\
} while(0)
#endif // CoreLink_h__
简单使用:
// 自定义结构
struct StoreData
{
LinkNode typeLink; // 类型节点
LinkNode delLink; // 删除节点
void* data; // 数据
};
// 定义根节点
LinkNode type_root; // 类型链表根节点
LinkNode delete_root; // 删除的链表根节点
int main()
{
StoreData _data; // 自定义数据
// 根节点初始化
InitLink(&type_root);
InitLink(&delete_root);
// 把数据添加到类型链表中
LinkAddToTail(&type_root, &_data.typeLink);
// 把数据添加到删除链表中
LinkAddToTail(&delete_root, &_data.delLink);
// 遍历类型链表
for (auto pNode = LinkFirst(&type_root); LinkNodeValid(&type_root, pNode);
pNode = LinkNext(pNode))
{
StoreData* pData = LinkNodeData(&type_root, pNode, StoreData, typeLink);
// TODO
}
// 清理删除链表
while (auto pNode = LinkFirst(&delete_root))
{
if (!LinkNodeValid(&delete_root, pNode))
{
break;
}
LinkRemoveSelf(pNode);
StoreData* pData = LinkNodeData(&delete_root, pNode, StoreData, delLink);
// TODO
}
}