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

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

作者头像
DragonKingZhu
发布2022-05-08 15:48:18
1660
发布2022-05-08 15:48:18
举报
代码语言: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_U8    tag3;			
}D_Update_Descr;

typedef struct
{
	D_List list;
	D_U8   tag4;			
}D_Device_Descr;

typedef struct 
{
	D_List		 list;
	D_List		*updates;
	D_List		*devices;
	D_U8        tag2;
}D_Loader_Descr;

typedef struct 
{
	D_List	list;
	D_U8	tag1;
	D_List	*loader_desc;
}D_Loader_List;
	
#define D_MACRO_BEGIN		do {

#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

	
int main(void)
{
	D_List	*list = NULL;
	D_Loader_List	*temp = NULL;
	D_Loader_Descr  *temp2 = NULL;
	D_Update_Descr  *temp3 = NULL;	
	D_Device_Descr  *temp4 = NULL;

	
	D_Loader_List  *loader_list = NULL;
	D_Loader_Descr *loader_descs = NULL;
	D_Update_Descr *update_descs = NULL;
	D_Device_Descr *device_descs = NULL;
	
	D_LIST_ALLOC(loader_list);
	D_LIST_ALLOC(loader_descs);
	D_LIST_ALLOC(update_descs);
	D_LIST_ALLOC(device_descs);
	
	D_LIST_ADD(list, loader_list);
	D_LIST_ADD(loader_list->loader_desc, loader_descs);
	D_LIST_ADD(loader_descs->updates, update_descs);
	D_LIST_ADD(loader_descs->devices, device_descs);
	
	loader_list->tag1 = 10;
	loader_descs->tag2 = 20;
	update_descs->tag3 = 30;
	device_descs->tag4 = 40;
	
	temp = (D_Loader_List*)list;
	
	printf("tag1 = %d\n",temp->tag1);
	printf("temp = 0x%x\n", temp);
	printf("list = 0x%x\n", list);
	printf("list->prev = 0x%x\n", list->prev);
	printf("list->next = 0x%x\n", list->next);
	
	printf("temp->loader_descs = 0x%x\n",temp->loader_desc);
	printf("loader_descs = 0x%x\n",loader_descs);
	
	temp2 = (D_Loader_Descr*)(temp->loader_desc);
	
	temp3 = (D_Update_Descr*)(temp2->updates);
	printf("temp3 = 0x%x\n",temp3);
	printf("temp3->list = 0x%x\n",temp3->list);
	printf("temp3->list->prev = 0x%x\n", temp3->list.prev);
	printf("temp3->list->next = 0x%x\n", temp3->list.next);

	temp4 = (D_Device_Descr*)(temp2->devices);

	printf("tag2 = %d\n", temp2->tag2);
	printf("tag3 = %d\n", temp3->tag3);
	printf("tag4 = %d\n", temp4->tag4);
		
	return 0;
}

运行结果图:

链表结构图:

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

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

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

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

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