您尚未登录。

楼主 #1 2021-03-13 14:24:14

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

不明白rtt的这个for迭代是如何实现的。

#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)

离线

#2 2021-03-13 14:27:00

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 503
积分: 465

Re: 不明白rtt的这个for迭代是如何实现的。

就是用C语言的 for循环遍历双向链表

把for代码拆成三行就比较明白了

最近编辑记录 raspberryman (2021-03-13 14:27:30)

离线

楼主 #3 2021-03-13 14:29:41

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 不明白rtt的这个for迭代是如何实现的。

raspberryman 说:

就是用C语言的 for循环遍历双向链表

把for代码拆成三行就比较明白了


回答的真快啊。
我发布后才发现自己没问明白,现在补充编辑了下。
就是不明白中止条件,没学过双向链表...

离线

#4 2021-03-13 14:33:41

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 503
积分: 465

Re: 不明白rtt的这个for迭代是如何实现的。

防止无限死循环,有可能形成了首尾连接的环形链表

离线

楼主 #5 2021-03-13 14:40:09

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 不明白rtt的这个for迭代是如何实现的。

谢谢。
q群了也问了下,也是直接回答“环链”。
这样就明白一些了,pos是不停变化的,head是固定的,跳出条件是转了一圈又回到head。

但是,看rt_list_node定义只是实现了双向链表,不知道是如何形成环的?
具体rt_list_node使用过程中形成了环?

离线

#6 2021-03-13 15:08:52

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 503
积分: 465

Re: 不明白rtt的这个for迭代是如何实现的。

存在环链的可能吧,为了健壮性?

离线

楼主 #7 2021-03-13 15:25:02

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 不明白rtt的这个for迭代是如何实现的。

找到了,链表是这么初始化的:

rt_inline void rt_list_init(rt_list_t *l)
{
    l->next = l->prev = l;
}

离线

#8 2021-03-14 10:33:59

armstrong
会员
注册时间: 2019-04-10
已发帖子: 287
积分: 196.5

Re: 不明白rtt的这个for迭代是如何实现的。

楼主参看linux源码包的include/linux/list.h文件,一切都出自这里。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn