在C语言中将项目移动到双链接列表的末尾
我想做一个函数,将双链接列表中的一个项移动到列表的末尾。如果你想有一个结构列表,这个结构里面需要有一个列表元素。给你在C语言中将项目移动到双链接列表的末尾,c,pointers,doubly-linked-list,C,Pointers,Doubly Linked List,我想做一个函数,将双链接列表中的一个项移动到列表的末尾。如果你想有一个结构列表,这个结构里面需要有一个列表元素。给你 struct list_elem { struct list_elem *prev; /* Previous list element. */ struct list_elem *next; /* Next list element. */ }; 列表中也有一个头部和尾部。在提供的代码中,有一个swap()函数,它接收两个指向列
struct list_elem
{
struct list_elem *prev; /* Previous list element. */
struct list_elem *next; /* Next list element. */
};
列表中也有一个头部和尾部。在提供的代码中,有一个swap()函数,它接收两个指向列表元素指针的指针,但我有点不明白如何使用它来移动列表中的项目。这是
static void
swap (struct list_elem **a, struct list_elem **b)
{
struct list_elem *t = *a;
*a = *b;
*b = t;
}
如果我有一个像这样的列表,h是它的头,t是它的尾,我想做一个函数,你可以给结构列表*l和列表元素*e,然后把它转换成这个(这个例子我将移动1)h--2--3--1--t
任何帮助都将不胜感激。谢谢。至少有两种方法可以实现移动到结束操作:
prev
和next
指针,但请注意,问题中介绍的swap()
函数不执行节点交换,而是执行指针交换。您可以通过提供的(指针)swap()
函数实现选项(2)中所述的节点交换,但与直接使用所涉及的指针相比,它更丑陋、更混乱、更容易出错。(您的swap()
更适合与指针数组一起使用,而不是与链表一起使用。)
其他的细节都留作练习。如果我有一个像这样的列表,h是它的头,t是它的尾,我想做一个函数,你可以给结构列表*l和列表元素*e,并将其转换成这个(这个例子我将移动1)
h--2--3--1--t
只需将元素与其后继元素交换,直到它成为最后一个。更有效的解决方案是简单地删除元素并将其插入列表末尾。swap
函数将导致节点具有不匹配的next
/prev
指针。当使用恒定时间O(2)remove-insert方法时,O(n)(最坏情况)swap循环的用例是什么(以及更易于编码)…?@Myst,删除/插入为O(n)如果您最初没有指向尾部的指针,也可以设计一个示例,其中交换是唯一可以执行的操作,尽管这种情况在现实世界中不太可能出现。诚然,swap
是一种有效的方法,适用于单链接列表中没有已知的tail
指针的情况。但是r、 OP询问了一个双链接列表。如果没有指向头/尾的指针,交换功能将是该列表上的一个无休止的循环…@Myst,双链接与循环不同。这两个特征是完全正交的。你完全可以拥有一个双链接、非循环的链接列表,并在其中高效地工作我想我学到了一些新东西。我从来没有非循环双链接列表的用例,所以我没有意识到它们可以在不将尾部链接到头部的情况下使用。谢谢你的澄清