您的位置:首页 > 其它

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

2015-02-09 18:41 204 查看
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef char  D_Char;
typedef int	  D_Int;

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

typedef struct
{
D_List list;
D_Char name[10];
D_Int  age;
}D_Student;

//宏定义块开始
#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_Student	*temp = NULL;
D_Student	*s1 = NULL;
D_Student	*s2 = NULL;
D_Student	*s3 = NULL;

D_LIST_ALLOC(s1);
D_LIST_ALLOC(s2);
D_LIST_ALLOC(s3);

D_LIST_ADD(list, s1);
D_LIST_ADD(list, s2);
D_LIST_ADD(list, s3);

sprintf(s1->name, "s1");
s1->age = 10;

sprintf(s2->name, "s2");
s2->age = 20;

sprintf(s3->name, "s3");
s3->age = 30;

temp = (D_Student*)(list);
printf("s1->name = %s\n",temp->name);
printf("s1->age  = %d\n",temp->age);
printf("\n");

temp = (D_Student*)(list->prev);
printf("s3->name = %s\n",temp->name);
printf("s3->age  = %d\n",temp->age);
printf("\n");

temp = (D_Student*)(list->prev->prev);
printf("s2->name = %s\n",temp->name);
printf("s2->age  = %d\n",temp->age);
printf("\n");

return 0;
}


运行结果:



链表结构图:



至于其中的D_LIST_ALLOC宏, D_LIST_ADD红自己对照提供的结构图。分析即可得出答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  双向循环链表