在C语言中实现链表优先级队列
您将如何使用C中的链表实现优先级队列 典型的链表由指向一个元素的在C语言中实现链表优先级队列,c,linked-list,queue,priority-queue,fifo,C,Linked List,Queue,Priority Queue,Fifo,您将如何使用C中的链表实现优先级队列 典型的链表由指向一个元素的头组成,该元素指向另一个元素,该元素最终以NULL或链表的尾部结尾。例如: (Linked List | Head) ----> (Element | Next) ----> (Element | Next) ----> Null 在基本场景中,通过使用先进先出(添加到列表末尾,从列表前面删除)FIFO方法将新元素添加到列表中 然而,在我的情况下,必须考虑优先级值。更具体地说,可以为每个元素分配1、2或3的优先级
头
组成,该元素指向另一个元素,该元素最终以NULL
或链表的尾部结尾。例如:
(Linked List | Head) ----> (Element | Next) ----> (Element | Next) ----> Null
在基本场景中,通过使用先进先出(添加到列表末尾,从列表前面删除)FIFO方法将新元素添加到列表中
然而,在我的情况下,必须考虑优先级值。更具体地说,可以为每个元素分配1、2或3的优先级。优先级最高的元素添加到列表的前面,而优先级较低的元素添加到列表的后面。在列表中插入保持每个优先级的FIFO顺序
因此,如果要将以下元素一次一个排队:
a 3, b 1, c 2, d 3, e 2
输出应为:a3、d3、c2、e2、b1
(按优先级以及被添加的顺序排序,而不是忽略优先级的标准先进先出方法)
这是我所拥有的,但它没有优先权。您将如何实现优先级队列
一种方法是使用排序/优先级算法。除了算法之外,对我来说,一些主要的未知数/困惑是如何以及在哪里存储优先级,优先级是否在实际元素中,例如:
(链表| Head)-->(a | 1 | Next)-->(b | 2 | Next)--->空
或
在使用指针创建排序算法时,我将如何比较优先级。每当在列表中添加/移动元素时,使用排序算法根据优先级对列表中的元素重新排序。它可能很慢,但它可以工作 每当在列表中添加/移动元素时,使用排序算法根据其优先级对列表中的元素重新排序。它可能很慢,但它可以工作 >你应该考虑实现一个双链表。 基本上这就像一个简单的链表,但也有一个指向列表末尾的尾部节点,列表中的每个元素都有一个向前和向后的指针 因此,高优先级节点被添加到前端,低优先级节点被添加到后端。使用这种数据结构,这两种操作都非常有效 我不确定在何处添加优先级2节点:) 正常链表的开销应该可以忽略不计
< P>你应该考虑实现一个双链表。 基本上这就像一个简单的链表,但也有一个指向列表末尾的尾部节点,列表中的每个元素都有一个向前和向后的指针 因此,高优先级节点被添加到前端,低优先级节点被添加到后端。使用这种数据结构,这两种操作都非常有效 我不确定在何处添加优先级2节点:) 正常链表的开销应该可以忽略不计
如果只有三个优先级值(或者更一般地说是固定优先级范围),为什么不能实现三个单独的队列并编写一个包装函数,根据优先级将元素添加/删除到特定队列?如果只有三个优先级值(或者更一般地说是固定优先级范围)为什么不能实现三个单独的队列并编写一个包装器函数,根据优先级将元素添加/删除到特定队列?也许这太迂腐了,但指针不是“指向
NULL
”,它有一个NULL
值(并且指向nothing).@Chris Lutz当且仅当ptr指向的内存地址==0时,ptr才指向NULL。这可能是正确的。指向…的结尾处的NULL值。。。无:D.您似乎实现了一个常规队列而不是优先级队列。@MMavipc-我考虑过这一点,但我认为OP没有使用任何双指针,因此它可能并不重要。也许这太迂腐了,但指针没有“指向NULL
”,它有一个NULL
值(并且指向零).@Chris Lutz当且仅当ptr指向的内存地址==0时,ptr才指向NULL。这可能是正确的。指向…的结尾处的NULL值。。。没什么:D.你似乎实现了一个常规队列而不是优先级队列。@MMavipc-我考虑过,但我认为OP没有使用任何双指针,所以它可能不重要。我明白了。优先级2应该在中间:D.我明白了。优先级2应该在中间:D+ 1:这是迄今为止最有效的,即使你有几十个优先级。有趣的想法。那么,这将是一个由O(1)个队列组成的队列,允许最快的插入?您是否可以更进一步,用代码演示该方法?对不起,我没有时间编写这样的代码。我在工作:-)我不认为一定是排队。如果你有一组固定的优先级,我会使用一组队列。+1:这是迄今为止最有效的,即使你有几十个优先级。有趣的想法。那么,这将是一个由O(1)个队列组成的队列,允许最快的插入?您是否可以更进一步,用代码演示该方法?对不起,我没有时间编写这样的代码。我在工作:-)我不认为一定是排队。如果您有固定的优先级设置,我将使用一组队列。
q_enqueue(&q, "a", "1");
q_enqueue(&q, "b", "2");