【问题标题】:implement a Linked List Priority Queue in C在 C 中实现链表优先级队列
【发布时间】:2011-09-12 05:45:47
【问题描述】:

您将如何使用 C 中的链表实现优先级队列?

典型的链表由指向一个元素的head 组成,该元素指向另一个元素,最终以NULL 或链表的尾部结束。示例:

(Linked List | Head) ----> (Element | Next) ----> (Element | Next) ----> Null

在基本场景中,使用先进先出(添加到列表末尾,从列表前面删除)FIFO方法将新元素添加到列表中。

然而,就我而言,必须考虑优先级值。更具体地说,可以为每个元素分配 1、2 或 3 的优先级。优先级最高的元素被添加到列表的前面,而优先级较低的元素被添加到列表的后面。向列表中的插入保持每个优先级的 FIFO 顺序。

因此,如果要一次将以下元素排入队列:

a 3, b 1, c 2, d 3, e 2

输出应为:a 3, d 3, c 2, e 2, b 1(按优先级和添加顺序排列,而不是忽略优先级的标准先进先出方法)。

这是我所拥有的,但它没有优先级。您将如何实施优先级队列?

http://codepad.org/BMeuSgNBxd

一种方法是使用排序/优先级算法。除了算法之外,对我来说,一些主要的未知数/困惑是优先级的存储方式和位置,它是否在实际元素中,例如:

(链表|头)---->(a | 1 |下一个)---->(b | 2 |下一个)---->空

  q_enqueue(&q, "a", "1");
  q_enqueue(&q, "b", "2");

以及如何在使用指针创建排序算法时比较优先级。

【问题讨论】:

  • 也许这太迂腐了,但指针并没有“指向NULL”,它有一个NULL 值(并且没有指向任何东西)。
  • @Chris-Lutz A ptr 指向 NULL 当且仅当它指向的内存地址 == 0。这是可能的
  • 正确。 NULL 值指向...什么都没有:D.
  • 您似乎实现了常规队列而不是优先队列。
  • @MMavipc - 我想过,但我认为 OP 没有使用任何双指针,所以它可能并不重要。

标签: c linked-list queue priority-queue fifo


【解决方案1】:

如果您只有三个优先级值(或更一般地说 - 固定的优先级范围),为什么不能实现三个单独的队列并编写一个包装函数,根据优先级将元素添加/删除到某个队列?

【讨论】:

  • +1:即使您有几十个优先级,这也是迄今为止最有效的。
  • 有趣的想法。那么,这将是一个允许最快插入的 O(1) 队列的队列吗?您是否有可能更进一步并用代码演示该方法?
  • 对不起,我没有时间写这样的代码。我在工作:-) 我不认为它一定是队列。如果你有固定的优先级,我会选择一组队列。
【解决方案2】:

每当您在列表中添加/移动元素时,使用排序算法根据元素的优先级对列表中的元素重新排序。它可能很慢,但它有效。

【讨论】:

    【解决方案3】:

    你应该考虑实现一个双链表。

    这基本上就像一个简单的链表,但也有一个尾节点指向链表的末尾,链表中的每个元素在链表中都有一个向前和向后的指针。

    所以高优先级节点被添加到前面,低优先级节点被添加到末尾。使用这种数据结构,这两种操作都非常有效。

    我不确定优先级 2 节点在哪里添加 :)

    普通链表之上的开销应该可以忽略不计。

    Doubly linked list - Wikipedia

    【讨论】:

    • 我明白了。优先级 2 应该在中间 :D.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多