C链表附加到头部还是尾部?

时间:2016-01-17 22:25:16

标签: c insert linked-list macros

我正在查看此代码,在双向链表中实现元素的插入操作。我试图理解为什么LIST_APPEND宏将它附加到列表的末尾,但是,我总是向自己解释它是否在头脑中。代码:

struct link {
    struct link *prev;
    struct link *next;
};

void insert(struct link *prev, struct link *new, struct link *next)
{
    prev->next = new;
    new->prev = prev;
    next->prev = new;
    new->next = next;
}

#define LIST_APPEND(member, list, new)    \
    insert(list.prev, &(new->member), &list)

我的考虑因素:

首先,在C-Preprocessor替换实际代码中的宏内容后,我们得到

void insert(list.prev, &(new->member), &list)
{
    (list.prev)->next = (new->member);    //1.
    (new->member)->prev = list.prev;      //2.
    list->prev = (new->member);           //3.
    (new->member)->next = list;           //4.
}

对应于:
1. next的{​​{1}}指向list.prev
2. (new->member)的{​​{1}}现在是prev
3. (new->member)的{​​{1}}现在是list.prev
4. prev的下一个是list

如果我的逻辑中有流量,他们可能就在这里。

现在说明一下,这是一个可能的(据我所知)描述插入。

linked-list

问题:毕竟,是追加头部还是尾部?如果后者在哪里我错了?

1 个答案:

答案 0 :(得分:0)

在上面给出的代码中

struct link {
struct link *prev;
struct link *next;
};

void insert(struct link *prev, struct link *new, struct link *next)
{
prev->next = new;
new->prev = prev;
next->prev = new;
new->next = next;
}

#define LIST_APPEND(member, list, new)    \
insert(list.prev, &(new->member), &list)

这里insert(struct link *prev, struct link *new, struct link *next)函数在prev节点和下一节点之间插入一个新节点。

此处insert()函数struct link *prev, struct link *new, struct link *nextstruct link类型的指针变量

在双向链表中,没有必要在头部或尾部附加节点。它完全取决于程序员选择在双向链表中添加新节点的位置。