说明: 这是一个在开源代码osip中使用的双向链表宏代码,堪称经典。这里贴出其中代码 first_element是一个双向链表的元素指针,并不分配空间。element是一个占用空间的实际元素。从链表
说明:
这是一个在开源代码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