我在C中使用指针时遇到问题

时间:2017-05-08 18:55:42

标签: c list pointers

有人可以向我解释这段代码的工作原理。我试着把它写出来,把头包住,但我还是输了。

当您设置next->prev = prev next->prevprev之间的价值差异时?他们不是一样的价值吗?同样的问题也适用于下一行。

我尝试写出ListElement结构以试图帮助理解,但我仍然感到困惑。任何答案或帮助将不胜感激,或任何其他可以让我理解的参考。我是一个视觉学习者,所以如果你碰巧知道这个很好的可视化,我会很感激。

int unlink(ListElement *element)
{
    ListElement *next = element->next;
    ListElement *prev = element->prev;

    next->prev = prev;
    prev->next = next;

    return 0;
}

5 个答案:

答案 0 :(得分:2)

假设你有一个链表:

1->2->3

指针头指向列表的头部。 head-> next指向元素2。

   *
1->2->3

您可以在其上调用方法取消链接:

unlink(head->next);

通过head->接下来,您将元素2传递给函数。

然后它会指向下一个和前一个元素:

ListElement *next = element->next; //3
ListElement *prev = element->prev; //1

然后将继续取消链接此元素:

next->prev = prev; // now next (3) has a previous pointer to 1
prev->next = next; // now prev (1) has a next pointer to 3

现在2已取消链接,可以重复使用/删除。

答案 1 :(得分:2)

enter image description here

前两个分配将“connections”定义为 previous ,1和 next ,3,node。

ListElement *next = element->next;  // next connects current node to the one that follows 
ListElement *prev = element->prev;  // prev connects current node to the one that precedes

这就是他们被称为prevnext的原因。其他两行是重新连接 prevnext节点,以便它们跳过当前节点,即 您正通过上面定义的 connections 访问前面和后面节点的成员(具有相同的名称)

next->prev = prev; // now node: 3 is connected to node: 1 
prev->next = next; // now node: 1 is connected to node: 3

注意:请记住,每个节点都有两个名为prevnext

的指针

答案 2 :(得分:1)

此代码从双向链表中删除元素。

通过分配" next"来完成。 element前一个元素的指针直接指向element的下一个元素。反之亦然," prev" element的下一个元素的指针设置为element的前一个元素。 这会导致element从链接列表中删除。

希望这有帮助。

  

当您设置next-> prev = prev时,值的差异是什么   在next-> prev和prev之间?它们的价值是否相同?

这仅将指针next->prev设置为prev的值,这意味着下一个元素的prev指针指向与变量{{1}相同的地址}。

答案 3 :(得分:1)

此函数基本上取消链接传递了列表元素。

不,他们没有相同的价值。

  • prev->next是列表中next之前节点的element指针。
  • next定义为element->next,因此它是指向列表中element之后的节点的指针。

因此,对于prev->next = next,您基本上将next之前的节点的element指针设置为element之后的节点。

next->prev = prev的模拟说明。

UCLA的这张图说明了你的功能的行为:

diagram element unlinking

答案 4 :(得分:0)

让我们绘制一个双向链表的元素图:

|ITEM0        |  |ITEM1        |  |ITEM2        |
| next->ITEM1 |  | next->ITEM2 |  | next->NULL  |
| prev->NULL  |  | prev->ITEM0 |  | prev->ITEM1 |

假设我们要取消链接ITEM1,我们将下一个元素保存到名为next的变量中,即*next = element->next;部分,现在next = ITEM2,然后我们保存前一个:*prev = element->prev; ,现在prev = ITEM0。现在,我们将下一个元素的前一个元素(也就是ITEM2的前一个元素)设置为prev(即ITEM0)并将下一个元素(也就是ITEM0的下一个)设置为next(即ITEM2),因此我们最终得到了这个:

|ITEM0        |  |ITEM1        |  |ITEM2        |
| next->ITEM2 |  | next->ITEM2 |  | next->NULL  |
| prev->NULL  |  | prev->ITEM0 |  | prev->ITEM0 |

注意我们如何将ITEM1的下一个指针移动到ITEM0的下一个指针,并将ITEM1的prev指针移动到ITEM2的prev指针中。

此时,我们可以释放ITEM1(没有任何意义),我们刚刚将其与链接列表取消链接!