探索flutter框架开发的app在移动应用市场的潜力与挑战
548
2022-10-30
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~