【问题标题】:What are the differences in coding a destruction algorithm for destroying double and singly linked lists separately in C?在 C 中分别编写用于销毁双链表和单链表的销毁算法有什么区别?
【发布时间】:2020-08-15 07:22:14
【问题描述】:

在我的考试中,有一个这样的问题,我一直在想,在 C 中分别销毁双链表和单链表的销毁算法编码有什么区别?

【问题讨论】:

  • 我会四处走动,说我认为没有必要有任何区别。适用于单链表(从头到尾迭代)的算法同样适用于双链表。我想您可以从任何节点开始销毁双向链表,但这是糟糕的设计。
  • 双链表是循环的(尾部指向头部)吗?如果是这样(通常是这样),您可能必须在循环中实现不同的条件。
  • @Beta - 通常情况下,双向链表的“头部”将与不同的数据结构或内存模型相关联......此外,如果你要迭代直到你点击@ 987654321@,现在你可能需要迭代直到你(重新)点击head
  • @Myst:同样的警告也适用于循环单独链表。
  • @Beta - 在一个链表中,head != tail(尾部通常是NULL)...而在一个链表中链表head == tail,除非您对其进行测试,否则这可能会导致双重free

标签: c linked-list singly-linked-list doubly-linked-list


【解决方案1】:

如果你的数据类型允许你的双向链表是一个环,你需要将链接断开回到头部。然后像往常一样遍历列表,复制指针,边走边释放。

【讨论】:

  • 为什么必须在头部断开反向链接?如果你不这样做会发生什么? 什么都没有?
  • 感谢您的提问。我的回答措辞不佳,我应该说要断开链接回到头部。请记住,在一个环中,如果你没有想出一些方法来阻止你绕着这个圆圈走,那么你最终会碰到同一个节点两次。在这种情况下,您可能会跟踪损坏的指针,甚至更糟——已经 free()d 的 free() 内存。最后一种情况基本上打开了通往地狱的大门,让所有的守护进程都出来了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多