C 链表追加到头部或尾部?
C linked-list append to head or tail?
我正在查看这段代码,实现了双向链表中元素的插入操作。我试图理解为什么 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、list.prev
的next
指向(new->member)
2.(new->member)
的prev
现在是list.prev
3.list
的prev
现在是(new->member)
4.(new->member)
的下一个是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)
这里的insert(struct link *prev, struct link *new, struct link *next)
函数是在前一个节点和下一个节点之间插入一个新节点。
这里insert()
函数struct link *prev, struct link *new, struct link *next
是struct link
类型的指针变量
并且在双向链表中,没有必要在头部或尾部追加节点。这完全取决于程序员选择在双向链表中追加新节点的位置。
我正在查看这段代码,实现了双向链表中元素的插入操作。我试图理解为什么 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、list.prev
的next
指向(new->member)
2.(new->member)
的prev
现在是list.prev
3.list
的prev
现在是(new->member)
4.(new->member)
的下一个是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)
这里的insert(struct link *prev, struct link *new, struct link *next)
函数是在前一个节点和下一个节点之间插入一个新节点。
这里insert()
函数struct link *prev, struct link *new, struct link *next
是struct link
并且在双向链表中,没有必要在头部或尾部追加节点。这完全取决于程序员选择在双向链表中追加新节点的位置。