您如何使用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
(按优先级排序,以及添加的顺序,而不是标准的先入先出方法,忽略优先级)。
这是我所拥有的,但它没有优先权。您将如何实施优先级队列?
一种方法是使用排序/优先级算法。除了算法之外,对我来说,一些主要的未知数/混淆是如何以及在何处存储优先级,它是否在实际元素中,例如:
(Linked List | Head)----> (a | 1 |下一个)----> (b | 2 |下一个)---->空
或
q_enqueue(&q, "a", "1");
q_enqueue(&q, "b", "2");
在使用指针创建排序算法时,我将如何比较优先级。
答案 0 :(得分:6)
如果您只有三个优先级值(或更一般 - 固定的优先级范围),为什么不能实现三个单独的队列并编写一个包装函数,这取决于优先级添加/删除元素到某个队列?
答案 1 :(得分:0)
每当您在列表中添加/移动元素时,使用排序算法根据列表中的元素优先级重新排序元素。它可能很慢,但它有效。
答案 2 :(得分:0)
您应该考虑实施双链表。
基本上这就像一个简单的链表,但是还有一个尾节点指向列表的末尾,列表中的每个元素都在列表中有一个向前和向后的指针。
所以高优先级节点被添加到前端,低优先级节点被添加到最后。这些数据结构都非常有效。
我不确定添加优先级2节点的位置:)
正常链表上方的开销应该可以忽略不计。