C中使用宏处理双向链表的经典例子

说明:

这是一个在开源代码osip中使用的双向链表宏代码,堪称经典。这里贴出其中代码 first_element是一个双向链表的元素指针,并不分配空间。element是一个占用空间的实际元素。从链表删除元素并不释放元素空间

代码:

#define REMOVE_ELEMENT(first_element, element) \ if (element->parent==NULL) \//element是头元素 { first_element = element->next; \//设置下一个元素为头元素 if (first_element!=NULL) \//下一个元素不为空 first_element->parent = NULL; } \//下一个元素即头元素的父结点 ==NULL else \ { element->parent->next = element->next; \//设置element的子元素为element父元素的子元素 if (element->next!=NULL) \//element的子元素 <> NULL element->next->parent = element->parent; \//设置element的父元素为element子元素的父元素 element->next = NULL; \//element没有子元素和父元素 element->parent = NULL; }#define ADD_ELEMENT(first_element, element) \ if (first_element==NULL) \//链表为空 { \ first_element = element; \//该元素是头元素 element->next = NULL; \//既没有子元素也没有父元素 element->parent = NULL; \ } \ else \//加到链表头部 { \ element->next = first_element; \//element的子元素为链表指针 element->parent = NULL; \//element的父元素为空 element->next->parent = element; \//element为原链表的父元素 first_element = element; \//element为头元素 }#define APPEND_ELEMENT(type_of_element_t, first_element, element) \ if (first_element==NULL) \//链表为空 { first_element = element; \ element->next = NULL; /* useless */ \ element->parent = NULL; /* useless */ } \ else \//加到链表尾部 { type_of_element_t *f; \//另外申请一个指针 for (f=first_element; f->next!=NULL; f=f->next) \//把指针移动到链表尾部 { } \ f->next = element; \//element为原链表尾元素的子元素 element->parent = f; \//element的父元素为原链表尾元素 element->next = NULL; \//element的子元素 == NULL }

关键注意点: 链表指针first_element指向 要删除的元素前后指向,要删除元素的父元素后指向,要删除元素的子元素前指向 要添加的元素前后指向,要添加元素的父元素后指向,要添加元素的子元素前指向 删除的元素是不是头元素,如果是,设置其子元素前指向 要添加的链表是否为空,设置要添加元素前后指向

关于:

编者:李国帅

时间:2006-8

找寻隐藏在山间的纯净和那“鸟鸣山更幽”的飞鸟。

C中使用宏处理双向链表的经典例子

相关文章:

你感兴趣的文章:

标签云: