双向循环链表设计分析之一
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红自己对照提供的结构图。分析即可得出答案。
相关文章推荐
- 双向循环链表设计分析之二
- 双向循环链表设计分析之四
- 双向循环链表设计分析之五
- 数据结构课程设计_双向循环链表
- Linux内核2.6.14源码分析-双向循环链表代码分析
- Linux内核-双向循环链表代码分析
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构基础(12) --双向循环链表的设计与实现
- Linux内核2.6.14源码分析-双向循环链表代码分析
- 数据结构基础(12) --双向循环链表的设计与实现
- Linux内核2.6.14源码分析-双向循环链表代码分析
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
- 数据结构基础(12) --双向循环链表的设计与实现
- (8) Java源码分析 ---- LinkedList (对应数据结构中线性表中的双向循环链表,JDK1.6)
- [精华]]Linux内核2.6.14源码分析-双向循环链表代码分析(转)
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
- 数据结构基础(12) --双向循环链表的设计与实现
- 双向循环链表的删除