在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,双链接与循环不同。这两个特征是完全正交的。你完全可以拥有一个双链接、非循环的链接列表,并在其中高效地工作我想我学到了一些新东西。我从来没有非循环双链接列表的用例,所以我没有意识到它们可以在不将尾部链接到头部的情况下使用。谢谢你的澄清