单链表的操作
下面是一个关于单链表的操作宏定义,请问能解释以下下面的代码吗??实在是看的很晕。。
#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)
[解决办法]
其实就相当于删除链表中的一个结点。
[解决办法]
#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)