C链表追加到头还是尾?

标签 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预处理器替换实际代码中的宏内容后,我们得到

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.list.prevnext指向(new->member)
2. (new->member)prev 现在是 list.prev
3. listprev 现在是 (new->member)
4. (new->member) 的下一个是 list

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

现在为了说明这一点,这里是(据我理解)插入的可能描述。

linked-list

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

最佳答案

在您上面给出的代码中

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)功能是在上一个节点和下一个节点之间插入一个新节点。

这里是insert()功能struct link *prev, struct link *new, struct link *nextstruct link 类型的指针变量

在双向链表中,不需要在头或尾添加节点。这完全取决于程序员选择在双向链表中添加新节点的位置。

关于C链表追加到头还是尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844493/

相关文章:

c - 如何在 FFmpeg 中模拟 OpenFile?

c - 混合 Bison 和 C 代码

c - 如何在 C 中一起使用 getline 和 strtok?

c++ - 动态创建对象并将它们添加到链表中

java - 链表 : definition of . 下一个和临时链表节点

c - 为什么这个简单的链表程序会出现段错误?

c++ - 在存储到 sqlite 上的记录时处理字符串中的特殊字符

mysql - 从 tmp 数据库中的表插入和更新到另一个数据库中的表

postgresql - pgSQL : am trying to insert into a table using dblink_exec() method, 但出现以下错误

PHP mySQL 不允许我插入到表中