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

如何在C语言编程中实现优先级队列?,c,data-structures,linked-list,priority-queue,C,Data Structures,Linked List,Priority Queue,我需要在C编程中使用单链表实现优先级队列 我不清楚优先级队列。我在谷歌上搜索了一下,但并不完全明白我发现了什么。我的理解是,优先级队列是其元素按优先级排序的队列。列表中的插入根据元素优先级定位在列表中 比如说,我们有以下场景。(注意:我假设值越高优先级越高): 如果需要插入另一个元素,可以说元素-->3(优先级=3),该元素具有更高的优先级 我可以移动上一个元素,元素-->2(优先级=2),并将此新的元素-->3(优先级=3)插入位置0,同时将元素-->2(优先级=2)移动到列表中的位置1 现在

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

我不清楚优先级队列。我在谷歌上搜索了一下,但并不完全明白我发现了什么。我的理解是,优先级队列是其元素按优先级排序的队列。列表中的插入根据元素优先级定位在列表中

比如说,我们有以下场景。(注意:我假设值越高优先级越高):

如果需要插入另一个元素,可以说
元素-->3(优先级=3)
,该元素具有更高的优先级

我可以移动上一个元素,
元素-->2(优先级=2)
,并将此新的
元素-->3(优先级=3)
插入位置0,同时将
元素-->2(优先级=2)
移动到列表中的位置1

现在名单变成了

Element-->3 (priority=3) followed by Element-->2 (priority=2)
类似地,在插入的基础上,是否必须移动列表中的所有元素


这是否正确?

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

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

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

if new_node.priority>list.head.priority:
new_node.next=list.head
list.head=新节点
其他:
previous=null
对于current=list.head:
如果current.priority

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

< P> OK,我不知道为什么你在C.中需要它在C++ STL中可用。 但是,正如您所希望的,这里是指向ask源代码的链接

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


希望有帮助。

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

链表不是一个简单的数组

链表中的每个项目都有对下一个项目的引用。只需更改这两个项目的引用,就可以将一个项目插入到另一个项目之后

+--------+
| item A |                           +--------+
+--------+     +--------+            | item C |
|ref to B|---->| item B |            +--------+
+--------+     +--------+            |  NULL  |
               |  NULL  |            +--------+
               +--------+
通过以下方式在A和B之间插入C:

  • 将C中的
    ref更改为B
  • 将A中的
    ref更改为B
    ref更改为C

  • 优先级队列是一种抽象数据类型,它基本上将其中的项按排序顺序(升序或降序)保存在某个选定的键上。正如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;
    }
    
    void sortedInsert(结构节点**headRef,int数据){
    结构节点*新节点=(结构节点*)malloc(sizeof(结构节点));
    断言(newnode);
    新建节点->值=数据;
    newnode->next=NULL;
    如果(!(*headRef)| |数据值){
    新建节点->下一步=*headRef;
    *headRef=newnode;
    }否则{
    结构节点*prev=*headRef;
    而(上一个->下一个&上一个->下一个->下一个值);
    结构节点*temp=prev->next;
    prev->next=newnode;
    newnode->next=temp;
    }
    

    }

    到目前为止还不错——您的实现被卡住了吗?简单地说,当它必须对列表进行操作时,它会对具有最高优先级的项进行操作……如何操作取决于您是将最高优先级的元素放在列表前面还是将其放在堆前面(如果使用heap)。。。
    http://www.indiastudychannel.com/projects/4870-Priority-queue-using-array.aspx
    
    +--------+
    | item A |                           +--------+
    +--------+     +--------+            | item C |
    |ref to B|---->| item B |            +--------+
    +--------+     +--------+            |  NULL  |
                   |  NULL  |            +--------+
                   +--------+
    
    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;
    }