一些指针算术

时间:2014-01-19 17:38:59

标签: c pointers linked-list

如果我们有这样的结构(链表的节点):

    struct Node{
        int data;
        struct Node* next;
    }

我们有2个指针(a和b),这样

a->next = b;

如何交换两个指针a和b(以便a->next = b->nextb->next = a)?我试过这样的事情:

  a->next = b->next;
  b->next = a;

但它似乎无法正常工作......此代码段有什么问题? a->next最终指向自己吗?通过这样做a->next = b->next,我们是否a->next指向b->next指向的任何内容,或者我们是否指出b->next在指派时指向的内容?

男人,指针令人困惑..任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

我假设有2个Node个对象(让我称之为n0n1)和两个变量ab指向{{分别为1}}和n0。此外,每个n1都有自己的指针。这让我们最初有4个指针看起来像:

Node

以及这两项任务后发生的事情:

a -> n0
b -> n1
n0.next -> n1
n1.next -> ?

到目前为止没有任何可疑之处。正如他们所说,"矛盾不存在 - 检查你的假设"。因此,// a->next = b->next; a -> n0 b -> n1 n0.next -> ? n1.next -> ? // b->next = a; a -> n0 b -> n1 n0.next -> ? n1.next -> n0 a最初可能没有指向正确的位置?可能只有一个b,您可以设置如下设置:

Node

仍然具有问题中a -> n0 b -> n0 n0.next -> n0 的属性,但看起来完全不同。

在其他地方查找错误。

答案 1 :(得分:2)

想象你想要做的事情:

   A           B           C
| data |    | data |    | data |
| next | -> | next | -> | next | -> NULL

这是你的初始状态。让我们逐步完成您的代码,看看它是否会导致您尝试实现的目标。首先,你有这个:

a->next = b->next;

执行此声明后,您将拥有:

   A           C
| data |    | data |
| next | -> | next | -> NULL

   B           C
| data |    | data |
| next | -> | next | -> NULL

下一个陈述是:

b->next = a;

执行此声明后,您最终会得到:

   B           A           C
| data |    | data |    | data |
| next | -> | next | -> | next | -> NULL

您已达到理想的结果。你的逻辑是正确的。

答案 2 :(得分:0)

当您指定a->next = b->next;时,您丢失了a-next的指针,那么该怎么做:

struct Node * tmp;
tmp = a->next;
a->next = b->next;
b->next = tmp;