如何在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 一种方法是使用排序/优先级算法。除了算法之外,对我来说,一些主要的未知/困惑是如何以及在哪里存储优先级,它是否在实际元素中,例如:(链表|头)->(| 1 |下一个)——> (b | 2 |下一个)——>空
或
q_enqueue(&q, "a", "1");
q_enqueue(&q, "b", "2");
以及在使用指针创建排序算法时如何比较优先级
如果你只有三个优先级值(或者更一般地-固定的优先级范围),为什么不能实现三个单独的队列,并编写一个包装器函数,根据优先级添加/删除元素到特定队列?
每当在列表中添加/移动元素时,使用排序算法根据其优先级对列表中的元素重新排序。它可能很慢,但很有效。
你应该考虑实现一个双链表。
基本上这就像一个简单的链表,但也有一个指向链表末尾的尾节点,并且链表中的每个元素在链表中都有一个向前和向后的指针。
因此高优先级节点被添加到前面,低优先级节点被添加到末尾。对于这种数据结构,这两种操作都非常有效。
我不确定优先级2节点被添加到哪里:)
在普通链表之上的开销应该可以忽略不计。
双链表- Wikipedia