我需要使用单链表在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)
同样,在插入的基础上,我是否必须移动列表中的所有元素?
这是对的吗?
答案 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通过以下方式执行:
NULL
ref to B
ref to B
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;
}
}