如何在C编程中实现优先级队列?

时间:2011-11-24 08:11:21

标签: c data-structures linked-list priority-queue

我需要使用单链表在C编程中实现优先级队列。

我对优先级队列没有一个清晰的认识。我用谷歌搜索,但没有完全理解我发现了什么。我的理解是优先级队列是一个队列,其元素按优先级排序。列表中的插入位于列表中,基于元素优先级。

假设我们有以下情况。 (注意:我假设,更高的值具有更高的优先级):

Element-->2 (priority=2)  (Now in position 0)

如果需要插入另一个元素,请说Element-->3 (priority=3)具有更高的优先级。

我可以移动上一个元素Element-->2 (priority=2),并在位置0插入新的Element-->3 (priority=3),并将Element-->2 (priority=2)移至列表中的第1位。

现在列表变为,

Element-->3 (priority=3) followed by Element-->2 (priority=2)

同样,在插入的基础上,我是否必须移动列表中的所有元素?

这是对的吗?

5 个答案:

答案 0 :(得分:4)

我认为您遇到了问题,因为应该使用堆树来实现优先级队列,而不是单个链接列表。

堆使一切变得简单 - 所有操作都非常便宜:在堆中更新,删除和插入都是O(log n)。

答案 1 :(得分:4)

您不必“移动”列表,而是在插入时执行此类操作(伪代码):

if new_node.priority > list.head.priority:
    new_node.next = list.head
    list.head = new_node
else:
    previous = null
    for current = list.head:
        if current.priority < node.priority:
            previous.next = node
            node.next = current
            break loop
        previous = current

如果你的列表有一个指向结尾的指针,你可以添加一个特殊检查,优先级低于结束。

答案 2 :(得分:2)

您可以使用优先级队列。但...

链表不是一个简单的数组。

链接列表中的每个项目都有对下一个项目的引用。您可以通过更改这两个项目的引用来插入另一个项目。

+--------+
| item A |                           +--------+
+--------+     +--------+            | item C |
|ref to B|---->| item B |            +--------+
+--------+     +--------+            |  NULL  |
               |  NULL  |            +--------+
               +--------+

在A和B之间插入C通过以下方式执行:

  1. 通过NULL
  2. 更改C中的ref to B
  3. 通过ref to B
  4. 更改A中的ref to C

答案 3 :(得分:0)

好的,我不知道你为什么需要它。在C ++ STL中它可用。

但是你想要的就是你问的源代码的链接。

http://matrixsust.blogspot.com/2011/11/basic-priority-queue-in-c.html

OR

http://www.indiastudychannel.com/projects/4870-Priority-queue-using-array.aspx

希望它有所帮助。

答案 4 :(得分:0)

优先级队列是一种抽象数据类型,它基本上按照某些选定键的排序顺序(升序或降序)保存其中的项目。正如Anthony Blake所提到的,堆实现是最直接的,你使用的底层结构只是一个数组,你执行一些以数组索引为中心的操作。

如果由于某种原因你想使用单链表实现,下面是一个演示代码,以就地方式执行排序插入

void sortedInsert(struct node **headRef,int data){
struct node *newnode=(struct node *)malloc(sizeof(struct node));
assert(newnode);
newnode->value=data;
newnode->next=NULL;

if(!(*headRef) || data<(*headRef)->value){
    newnode->next=*headRef;
    *headRef=newnode;
}else{
    struct node *prev=*headRef;

    while(prev->next && prev->next->value<data)
        prev=prev->next;

    struct node *temp=prev->next;
    prev->next=newnode;
    newnode->next=temp;
}

}