有人可以向我解释这段代码是如何工作的。 我试着把它写出来然后把头包住,但我还是输了。
当你设置next->prev = prev
next->prev
和prev
之间的价值差异是什么? 他们不是一样的价值吗? 对于下一行也是同样的问题。
我尝试写出一个ListElement
结构来试图帮助理解,但我仍然感到困惑。 任何答案或帮助将不胜感激,或任何其他可以让我理解的参考。 我是一个视觉学习者,所以如果你碰巧知道这个很好的可视化,我会很感激。
int unlink(ListElement *element) { ListElement *next = element->next; ListElement *prev = element->prev; next->prev = prev; prev->next = next; return 0; }
前两个分配定义与前 一个节点, 下一个节点3和下一个节点的“连接” 。
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
这就是为什么他们被称为上next
和next
。 其他两行是重新连接 prev
节点和next
节点,以便它们跳过当前节点,即您通过上面定义的连接访问前面和后面节点的成员(具有相同的名称) :
next->prev = prev; // now node: 3 is connected to node: 1 prev->next = next; // now node: 1 is connected to node: 3
注意:请记住,每个节点都有两个名为prev
和next
指针
假设你有一个链表:
1->2->3
指针头指向列表的头部。 head-> next指向元素2。
* 1->2->3
你调用方法取消链接:
unlink(head->next);
通过head-> next,您将元素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已取消链接,可以重复使用/删除。
此代码从双向链表中删除元素。
它是通过将element
前一个元素的“next”指针直接指定给element
的下一个元素来完成的。 反之亦然, element
的下一个元素的“prev”指针设置为element
的前一个元素。 这具有从链表中删除element
的效果。
希望这可以帮助。
当你设置next-> prev = prev next-> prev和prev之间的价值差异是什么? 他们不是一样的价值吗?
这只将指针next->prev
设置为next->prev
的值,这意味着下一个元素的prev
指针指向与变量prev
相同的地址。
这个函数基本上取消了传递列表元素的链接 。
不,他们没有相同的价值。
因此,使用prev->next = next
,您基本上将element
之前的节点的next
指针设置为element
之后的节点。
next->prev = prev
模拟说明。
UCLA中的此图说明了您的函数的行为:
让我们绘制一个双向链表的元素图:
|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(没有任何指向它),我们刚刚将它与链接列表取消链接!
以上就是c/c++开发分享我在C中使用指针时遇到问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559617.html