【问题标题】:Some pointer arithmetic一些指针算法
【发布时间】:2014-01-19 17:38:58
【问题描述】:

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

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

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

a->next = b;

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

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

但它似乎不起作用...这段代码 sn-p 有什么问题? a->next 是否最终指向自己?通过这样做a->next = b->next,我们是让a->next 指向b->next 指向的任何东西,还是让它指向b->next 在分配时指向的东西?

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

【问题讨论】:

  • 你试过用纸笔检查发生了什么吗?
  • 是的,虽然我不是很清楚,因为我的最后一个问题

标签: c pointers linked-list


【解决方案1】:

像这样可视化你正在尝试做的事情:

甲乙丙 |数据 | |数据 | |数据 | |下一个 | -> |下一个 | -> |下一个 | -> 空

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

a->next = b->next;

执行此语句后,您将拥有:

交流电 |数据 | |数据 | |下一个 | -> |下一个 | -> 空 乙丙 |数据 | |数据 | |下一个 | -> |下一个 | -> 空

下一个语句是这样的:

b->next = a;

执行此语句后,您将得到以下结果:

B A C |数据 | |数据 | |数据 | |下一个 | -> |下一个 | -> |下一个 | -> 空

你已经达到了你想要的结果。你的逻辑是正确的。

【讨论】:

    【解决方案2】:

    我假设有 2 个Node 对象(让我称它们为n0 和n1)和两个变量a 和b 分别指向n0 和n1。此外,每个Node 都有自己的指针。这给我们留下了 4 个最初看起来像这样的指针:

    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
    

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

    在别处寻找错误。

    【讨论】:

      【解决方案3】:

      当您分配a->next = b->next; 时,您丢失了a-next 的指针,所以该怎么办:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 2016-05-19
        • 1970-01-01
        相关资源
        最近更新 更多