【问题标题】:How to implement priority queue in C programming?C语言中如何实现优先级队列?
【发布时间】:2011-11-24 08:11:21
【问题描述】:

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

我对优先级队列没有一个清晰的概念。我用谷歌搜索但没有完全理解我发现了什么。我的理解是优先级队列是一个队列,其元素按优先级排序。插入到列表中的内容根据元素的优先级在列表中进行定位。

可以说,我们有以下场景。 (注意:我假设,更高的价值与更高的优先级):

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

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

我可以移动前一个元素Element-->2 (priority=2),并将这个新的Element-->3 (priority=3) 插入到位置0,同时Element-->2 (priority=2) 移动到列表中的位置1。

现在列表变成了,

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

同理,在插入的基础上,是不是要把列表中的所有元素都移位?

这对吗?

【问题讨论】:

  • 到目前为止一切顺利——您的实施是否陷入困境?
  • 简单地说,当它必须对列表进行操作时,它需要对具有最高优先级的项目进行操作......你如何做到这一点取决于你是否将最高优先级的元素放在列表前面或者你把它放在堆的前面(如果你使用堆)...

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


【解决方案1】:

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

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】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      在 A 和 B 之间插入 C 的操作是:

      1. 将 C 中的 NULL 更改为 ref to B
      2. 将 A 中的 ref to B 更改为 ref to C

      【讨论】:

        【解决方案4】:

        优先级队列是一种抽象数据类型,它基本上按某个选定键的排序顺序(升序或降序)将项目保存在其中。正如 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;
        }
        

        }

        【讨论】:

          【解决方案5】:

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

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

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

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

          希望对你有帮助。

          【讨论】:

          • 第二个链接指向明显无效的 C 代码。至少initpque 将某些内容写入以前未分配的指针中。不仅如此,就算法而言,实现也是错误的:加法是 O(n²)!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 2012-11-26
          • 2014-01-19
          • 2011-12-06
          • 1970-01-01
          相关资源
          最近更新 更多