#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;
}
运行结果:
链表结构图:
这种链表用于寻找几层链表中的某项值。