【发布时间】: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(按优先级和添加顺序排列,而不是忽略优先级的标准先进先出方法)。
这是我所拥有的,但它没有优先级。您将如何实施优先级队列?
一种方法是使用排序/优先级算法。除了算法之外,对我来说,一些主要的未知数/困惑是优先级的存储方式和位置,它是否在实际元素中,例如:
(链表|头)---->(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