struct HeapStruct;
typedef struct HeapStruct *PriorityQueue;
struct HeapStruct{
int Capacity;
int Size;
ElementType *Element;
}
PriorityQueue
Initialize(int MaxElements){
PriorityQueue H;
if(MaxElements < MinPQSize){
Error("queue is too small");
}
H = malloc(sizeof(struct HeapStruct));
if(H == NULL){
FatalError("out of space");
}
H->Elements = malloc((MaxElements + 1) * sizeof(ElementType));
if(H->Elements == NULL){
FatalError("out of space");
}
H->Capacity = MaxElements;
H->Size = 0;
H->Elements[0] = MinData;
return H;
}
void
Inserti(Element X, PriorityQueue H){
int i;
if(IsFull(H)){
Error("Priority queue is full");
return;
}
for(i = ++H->Size; H->Element[i/2] > X; i = i / 2){
H->Elements[i] = H->Emelemts[i/2];
}
H->Elements[i] = X;
}
ElementType
DeleteMin(PriorityQueue H){
int i, Chid;
ElementType MinElement, LastElement;
if(IsEmpty(H)){
return H->Element[0];
}
MinElement = H->Elements[1];
LastElement = H->Element[H->Size--];
for(i = 1; i*2 < H->Size; i = Chid){
Chid = i * 2;
if(Chid != H->Size && H->Elements[Chid+1] < H->Elements[Chid])
Chid++;
if(LastElement > H->Elements[Chid])
H->Elements[i] = H->Elements[Chid];
else
break;
}
H->Elements[i] = LastElement;
return MinELement;
}
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int ElementType;
typedef struct HeadStruct *PriorityQueue;
#define MinPQSize 10
#define MinData 0
struct HeadStruct{
int Capacity;
int size;
ElementType *Elements;
};
// 优先队列的初始化
PriorityQueue Initialze(int MaxElements){
PriorityQueue H;
if(MaxElements < MinPQSize){
printf("Priority QUeue is too small\n");
}
H = new HeadStruct();
H->Elements = new ElementType[MaxElements + 1];
H->Capacity = MaxElements;
H->size = 0;
H->Elements[0] = MinData;
return H;
}
//优先队列插入元素
void insert(ElementType x, PriorityQueue H){
int i;
if(H == NULL){
printf("Priority queue is Full \n");
return;
}
for(i=++H->size; H->Elements[i/2]>x; i/=2){
H->Elements[i] = H->Elements[i/2];
}
H->Elements[i] = x;
}
//优先队列删除最小元
ElementType DeletMin(PriorityQueue H){
int i, child;
ElementType MinElement, LastElement;
if(H == NULL){
printf("PriorityQueue is null\n");
return H->Elements[0];
}
MinElement = H->Elements[1];
LastElement = H->Elements[H->size--];
for(i=1; 2*i<=H->size; i=child){
child = i*2;
if(child != H->size && H->Elements[child +1] < H->Elements[child]){
child++;
}
if(LastElement > H->Elements[child]){
H->Elements[i] = H->Elements[child];
}else{
break;
}
}
H->Elements[i] = LastElement;
return MinElement;
}
void printfPriorityQueue(PriorityQueue H){
for(int i=1; i<=H->size; i++){
printf("%d ", H->Elements[i]);
}
}
int main(){
PriorityQueue H = Initialze(50);
int list[10] = {13,21,16,24,31,19,68,65,26,32};
for(int i=0; i<10; i++){
insert(list[i], H);
}
insert(14, H);
printfPriorityQueue(H);
int min = DeletMin(H);
printf("min: %d\n", min);
printfPriorityQueue(H);
}
struct TreeNode;
typedef struct TreeNode *PriorityQueue;
struct TreeNode{
ElementType Element;
PriorityQueue Left;
PriorityQueue Right;
int Npl;
}
PriorityQueue
Merge(PriorityQueue H1, PriorityQueue H2){
if(H1 == NULL)
return H2;
if(H2 == NULL)
return H1;
if(H1->Element < H2->Element)
Merge1(H1, H2);
else
Merge1(H2, H1);
}
static PriorityQueue
Merge1(PriorityQueue H1, PriorityQueue H2){
if(H1->Left == NULL)
H1->Left = H2;
else{
H1->Right = Merge(H1->Right, H2);
if(H1->Left->Npl < H1->Right->Npl)
SwapChildren(H1);
H1->Npl = H1->Right->Npl + 1;
}
return H1;
}
PriorityQueue
Insert1(ElementType X, PriorityQueue H){
PriorityQueue SingleNode;
SingleNode = malloc(sizeof(struct TreeNode));
if(SingNode == NULL){
FatalError("out of space");
}else{
SingleNode->Element = X;
SingleNode->Npl = 0;
SingleNode->Left = SingleNode->Right = NULL;
H = Merge(SingleNode, H);
}
return H;
}
PriorityQueue
DeleteMin1(PriorityQueue H){
PriorityQueue LeftHeap, RightHeap;
if(IsEmpty(H)){
Error("empty");
return H;
}
LeftHeap = H->Left;
RRightHeap = H->Right;
free(H);
return Merge(LeftHeap, RightHeap);
}


来源:https://www.cnblogs.com/baby-lily/p/12215692.html




