为什么我们需要一个“循环链接列表”(单一或双重)数据结构?

时间:2010-08-28 06:48:05

标签: c data-structures linked-list circular-list

为什么我们需要一个“循环链接列表”(单一或双重)数据结构?

通过简单的链接列表(单独或双重)可以解决哪些问题?

10 个答案:

答案 0 :(得分:41)

一个简单的例子就是跟踪多人棋盘游戏的转折点。将所有玩家放入循环链表中。在玩家轮到他之后,前进到列表中的下一个玩家。这将导致程序在玩家之间无限循环。

要遍历循环链表,请存储指向您看到的第一个元素的指针。当您再次看到该元素时,您已遍历整个列表。

void traverse(CircularList *c) {
  CircularList start = c;
  do {
    operateOnNode(c);
    c = c->next;
  } while(c != start);
}

答案 1 :(得分:20)

使用它们的两个原因:

1)一些问题域本质上是循环的。

例如,Monopoly板上的方块可以用循环链表表示,以映射其固有结构。

2)为了提高效率,可以将一些解决方案映射到循环链接列表。

例如,抖动缓冲区是一种缓冲区,它从网络中获取编号的数据包并按顺序放置,以便(例如)视频或音频播放器可以按顺序播放它们。太慢(滞后)的数据包将被丢弃。

这可以在循环缓冲区中表示,而不需要经常分配和释放内存,因为一旦播放了它们就可以重新使用。

可以使用链表实现,但是列表中会有不断的添加和删除,而不是替换常量(更便宜)。

答案 2 :(得分:10)

应用

1)我们可以使用圆形链表任何条目以旋转方式出现的应用程序 2)循环链表是循环调度算法的基本思想。

答案 3 :(得分:8)

我从谷歌找到的东西。

  

单链接循环列表是链表,其中列表中的最后一个节点指向列表中的第一个节点。循环列表不包含NULL指针。

     

应该使用循环链表的应用程序的一个很好的例子是操作系统解决的分时问题。

     

在分时环境中,操作系统必须维护当前用户的列表,并且必须允许每个用户一次使用一小部分CPU时间,一个用户。操作系统将选择一个用户,让他/她使用少量的CPU时间,然后转移到下一个用户等。

     

对于这个应用程序,应该没有NULL指针,除非绝对没有人请求CPU时间。

答案 4 :(得分:5)

循环链表可以有效地用于创建队列(FIFO)或双端队列(高效插入和从正面和背面移除)。见http://en.wikipedia.org/wiki/Linked_list#Circularly-linked_vs._linearly-linked

答案 5 :(得分:1)

应该使用循环链表的应用程序的一个很好的例子是操作系统解决的分时问题。

答案 6 :(得分:0)

循环列表比普通的双向链表更简单。 附加只是 prepend 并向前移动一次,弹回只是转回一次而弹出前面。通过将两端绑在一起,您可以得到一个双端列表,仅用于实现单端列表操作的成本。

答案 7 :(得分:0)

我们可以在资源池中使用循环链表。如果许多用户想要使用共享资源,我们可以使用循环链接列表分配该资源。

答案 8 :(得分:0)

循环链表广泛用于要重复执行任务的应用程序或分时应用程序中。循环队列可以跟踪已执行和必须执行的任务,一旦完成特定任务,它就会跳到下一个任务,当整个任务集用完时,它又会跳到第一个任务以完成剩余任务。 在实际使用中:当您在系统上打开多个应用程序时,这些应用程序的内存以循环方式保存,如果您连续按win + tab / alt + tab切换应用程序,则可以观察到这一点。 同样在多人棋盘游戏中,每个玩家都被分配到链表中的节点,并进行轮换

答案 9 :(得分:0)

循环链接列表(单个或两个)对于需要平均访问每个节点的应用程序很有用,并且列表可能会增长。如果列表的大小固定,则使用循环队列会效率更高(速度和内存)。