C语言链表

本文介绍了如何在C语言中创建和操作链表,强调了其在处理多重交叉链接时的便利性,提供了一种简单易用的链表实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候需要用到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
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值