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

网友投稿 548 2022-10-30

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:redis-monitor 一个部署简单的 redis 监控程序,使用 Flask 和 React 完成
下一篇:SpringMVC中@controllerAdvice注解的详细解释
相关文章

 发表评论

暂时没有评论,来抢沙发吧~