#define rt_list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
其中pos和head都是rt_list_node类型的地址
/**
* Double List structure
*/
struct rt_list_node
{
struct rt_list_node *next; /**< point to next node. */
struct rt_list_node *prev; /**< point to prev node. */
};
typedef struct rt_list_node rt_list_t; /**< Type for lists. */
不明白的地方是,这个for循环的中断条件,为何事pos != (head)?
链表的末端,pos->(next)就指向自己本身了吗?
最近编辑记录 Gentlepig (2021-03-13 14:30:49)
离线
就是用C语言的 for循环遍历双向链表
把for代码拆成三行就比较明白了
最近编辑记录 raspberryman (2021-03-13 14:27:30)
离线
就是用C语言的 for循环遍历双向链表
把for代码拆成三行就比较明白了
回答的真快啊。
我发布后才发现自己没问明白,现在补充编辑了下。
就是不明白中止条件,没学过双向链表...
离线
防止无限死循环,有可能形成了首尾连接的环形链表
离线
谢谢。
q群了也问了下,也是直接回答“环链”。
这样就明白一些了,pos是不停变化的,head是固定的,跳出条件是转了一圈又回到head。
但是,看rt_list_node定义只是实现了双向链表,不知道是如何形成环的?
具体rt_list_node使用过程中形成了环?
离线
存在环链的可能吧,为了健壮性?
离线
找到了,链表是这么初始化的:
rt_inline void rt_list_init(rt_list_t *l)
{
l->next = l->prev = l;
}
离线
楼主参看linux源码包的include/linux/list.h文件,一切都出自这里。
离线