在C中实现链接列表优先级队列

时间:2011-09-12 05:45:47

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

您如何使用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

一种方法是使用排序/优先级算法。除了算法之外,对我来说,一些主要的未知数/混淆是如何以及在何处存储优先级,它是否在实际元素中,例如:

(Linked List | Head)----> (a | 1 |下一个)----> (b | 2 |下一个)---->空

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您应该考虑实施双链表。

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

所以高优先级节点被添加到前端,低优先级节点被添加到最后。这些数据结构都非常有效。

我不确定添加优先级2节点的位置:)

正常链表上方的开销应该可以忽略不计。

Doubly linked list - Wikipedia