当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2022-07-19
说明: 这是一个在开源代码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  

上一篇:如何看待面试?
下一篇:没有了
网友评论