前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >双向循环链表设计分析之四

双向循环链表设计分析之四

作者头像
DragonKingZhu
发布2022-05-08 15:48:54
2560
发布2022-05-08 15:48:54
举报
代码语言:javascript
复制
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef unsigned char  D_U8;
typedef unsigned short D_U16;
typedef unsigned int   D_U32;


typedef struct _D_List D_List;
struct _D_List{
	D_List	*prev;
	D_List	*next;
};

typedef struct 
{
	D_List	 list;
	D_List	*tses;
	D_List	*descrs;
} D_Nit;

typedef struct 
{
	D_List	 list;
	D_List	*descrs;
} D_NitTS;

typedef struct 
{
	D_List	list;
	D_U8	tag;
} D_Descr;

#define D_MACRO_BEGIN		do {

/** @brief 宏定义块结束*/
#define D_MACRO_END			} while(0)

//分配一个链表 
#define D_LIST_ALLOC(_d)\
		D_MACRO_BEGIN\
		_d = malloc(sizeof(*(_d)));\
		if(_d)\
		{\
			memset(_d, 0, sizeof(*(_d)));\
			((D_List*)(_d))->prev = (D_List*)(_d);\
			((D_List*)(_d))->next = (D_List*)(_d);\
		}\
		else\
		{\
			printf("malloc error!\n");\
		}\
		D_MACRO_END

#define D_LIST_ADD(_l, _d)\
		D_MACRO_BEGIN\
		if(_l)\
		{\
			D_List *t1, *t2;\
			t1 = ((D_List*)(_l))->prev;\
			t2 = ((D_List*)(_d))->prev;\
			t1->next = (D_List*)(_d);\
			t2->next = (D_List*)(_l);\
			((D_List*)(_l))->prev = t2;\
			((D_List*)(_d))->prev = t1;\
		}\
		else\
		{\
			(_l) = (D_List*)(_d);\
		}\
		D_MACRO_END	

//遍历链表开始
#define D_FOR_EACH_BEGIN(_t,_l,_d)\
		if (_l) {\
			_d = (_t*) (_l);\
			do {\

//遍历链表结束
#define D_FOR_EACH_END(_t,_l,_d)\
			} while (((_d) = (_t*) ((D_List*)(_d))->next) != (_t*) (_l));\
		}

int main()
{
	D_List *list = NULL;
	
	D_Nit  *nit1 = NULL;
	
	D_Nit* nit = NULL;
	D_NitTS* ts = NULL;
	D_Descr	*descr = NULL;
	
	D_LIST_ALLOC(nit);
	D_LIST_ALLOC(ts);
	D_LIST_ALLOC(descr);
	
	D_LIST_ADD(list, nit);
	D_LIST_ADD(nit->tses, ts);
	D_LIST_ADD(ts->descrs, descr); 
	
	descr->tag = 30;
	
	D_FOR_EACH_BEGIN(D_Nit, nit, nit1)
	D_FOR_EACH_BEGIN(D_NitTS, nit1->tses, ts)
	D_FOR_EACH_BEGIN(D_Descr, ts->descrs, descr)
	
	if(descr->tag = 30)
	{
		printf("find\n");
	}
	
	D_FOR_EACH_END(D_Descr, ts->descrs, descr)
	D_FOR_EACH_END(D_NitTS, nit1->tses, ts)
	D_FOR_EACH_END(D_Nit, nit, nit1)
	
	return 0; 
}

运行结果:

链表结构图:

这种链表用于寻找几层链表中的某项值。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档