读书人

单链表的操作,该如何处理

发布时间: 2012-04-02 19:58:59 作者: rapoo

单链表的操作
下面是一个关于单链表的操作宏定义,请问能解释以下下面的代码吗??实在是看的很晕。。

#define ZB_SL_LIST_REMOVE(type, list, name, ent) \
do \
{ \
type p; \
type prev = 0; \
for (p = (list ## _head) ; p ; prev = p, p = p->name ## _next) \
{ \
if (p == (ent)) \
{ \
if (prev) \
{ \
prev->name ## _next = p->name ## _next; \
if ((list ## _tail) == ent) \
{ \
(list ## _tail) = prev; \
} \
} \
else \
{ \
(list ## _head) = p->name ## _next; \
} \
if (!(list ## _head)) \
{ \
(list ## _tail) = 0; \
} \
break; \
} \
} \
} \
while (0)


[解决办法]
其实就相当于删除链表中的一个结点。
[解决办法]

C/C++ code
#define ZB_SL_LIST_REMOVE(type, list, name, ent) \do \{ \    //定义当前节点和前一个节点type p; \type prev = 0; \//开始循环,并初始化 p = list ## _head  p为头节点    for (p = (list ## _head) ; p ; prev = p, p = p->name ## _next) \    { \    //如果找到需要删除的节点    if (p == (ent)) \     { \     //判断前一个节点 是否非空,空则表示此时prev = 0    if (prev) \     { \     //删除节点    prev->name ## _next = p->name ## _next; \    //如果要删除的节点为尾节点则尾节点前置    if ((list ## _tail) == ent) \    { \    (list ## _tail) = prev; \    } \    } \    //prev为空    else \    { \    //则表明此时头节点等于 ent    (list ## _head) = p->name ## _next; \    } \  //最后检查list是为空,为空则置 尾也空    if (!(list ## _head)) \    { \    (list ## _tail) = 0; \    } \    break; \    } \    } \} \        while (0) 

读书人网 >C语言

热点推荐