Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中实现链表优先级队列_C_Linked List_Queue_Priority Queue_Fifo - Fatal编程技术网

在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的优先级

您将如何使用C中的链表实现优先级队列

典型的链表由指向一个元素的
组成,该元素指向另一个元素,该元素最终以
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");