在链接列表中交换2个节点

时间:2014-02-17 16:18:13

标签: c

大家好,我刚接触C,我正在尝试学习链接列表。我一直在尝试从链接列表中交换2个节点,但到目前为止一直无法使其工作。我试图使用的代码导致无限循环循环,但我认为这不是因为if或while语句。

看一看?这里有什么指示?非常感谢帮助。

基本上,代码使用用户输入根据内部数据搜索节点,然后它应该将节点与内部数据交换到下一个节点。在这3个小时,有人可以帮忙吗?谢谢!

/ conductor是使用当前节点指针的名称 /

#include <stdio.h>
#include <stdlib.h>

struct node {
  int x;
  struct node *next;
  struct node *prev;
};

struct node *root;
struct node *conductor;
struct node *counter;
struct node *newnode;
struct node *back;

struct node *swapper;
struct node *swappee;
struct node *blanker;

int add = 0;
int initialization = 0;
int query = 0;

int swap ()
{

printf("enter data to search from within the nodes: ");
fflush(stdin);
scanf("%d", &query);

conductor = root;
while ( conductor->next != 0)
    {
        if(conductor->x == query)
        {
        printf("\n%d\n", query);
        swapper = conductor;
        swappee = conductor->prev;
        conductor = swappee;
        conductor->next = swapper;
        break;
        }
        else
        {
        conductor = conductor->next;
        }
    }

mainMenu ();

}

2 个答案:

答案 0 :(得分:1)

双链表(就像你的那个)基本上是一个节点数组,每个节点都指向它的邻居。假设我们有节点-A-B-C-D-(A-B意味着A指向B而B指向A)。假设您要交换B和C.您必须进行4次更改:

  • 指向C
  • 使C指向B和A
  • 使B指向D和B
  • 使D指向B

您只进行第二次和第三次更改。因此,您需要添加A->next = BD->prev=C。我希望它足够清楚。

另外,你不应该fflush输入流。

答案 1 :(得分:0)

如果要交换数据:

if (conductor->x == query) {
    int temp = conductor->x;
    if (conductor->next)
        conductor->x = conductor->next->x;
        conductor->next->x = temp;
    }
}

通常这就是你想要做的。如果你有一个具有多个成员而不是1 int的结构,交换指针在理论上可能看起来不那么混乱,但事实并非如此,主要是因为你必须测试下一个/前一个是否存在节点经常这样。事实上,在这种情况下,你可能想要一个指向单独结构的指针。

给定三个节点 - previouscurrentnext,分别指向current->prevcurrentcurrent->next - 您必须最多更新6个指针:

  1. next-&gt; prev = previous
  2. previous-&gt; next = next
  3. current-&gt; prev = next
  4. current-&gt; next = next-&gt; next
  5. next-&gt; next = current
  6. current-&gt; next-&gt; prev = current
  7. 如果previousNULL,则无需执行步骤2。 如果current->nextNULL,则无需第7步。

    如果nextNULL,则不需要全部内容。

    如果要与前一个节点而不是下一个节点交换,请将变量previous的任何实例与变量next交换,反之亦然,并交换{{1}的任何实例与->prev相反,反其道而行。

    总的来说,这需要相当多的分支代码,这可能很慢。这就是为什么通常更好地交换数据而不是搞乱指针。当你想要与前一个节点交换并且你只有一个指向下一个节点的单链表时,它会变得更加混乱,因为你必须存储另一个等价于->next的指针,假设为{{1}存在。