优先队列的简单实现

来源:互联网 发布:出租车司机滴滴软件 编辑:程序博客网 时间:2024/03/29 19:32
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define MAXSIZE 100#define MinPQSize 1typedef int ElementType;struct HeadStruct{int Capacity;int Size;ElementType *Elements;};typedef struct HeadStruct *PriorityQueue;//是否为空int IsEmpty(PriorityQueue H){return H->Size == 0 ? 1 : 0;}//是否为满int IsFull(PriorityQueue H){return H->Size == H->Capacity ? 1 : 0;}//初始化PriorityQueue Initialize(int MaxElements){PriorityQueue H;if(MaxElements < MinPQSize){printf("Priority queue is too small");exit(0);}H = (PriorityQueue)malloc(sizeof(struct HeadStruct));if(H == NULL){printf("out of space");exit(0);}H->Elements = (ElementType*)malloc((MaxElements + 1) * sizeof(ElementType));if(H->Elements == NULL){printf("out of space");exit(0);}H->Capacity = MaxElements;H->Size = 0;H->Elements[0] = 0;return H;}//删除void Destroy(PriorityQueue H){free(H->Elements);free(H);}//清空void MakeEmpty(PriorityQueue H){H->Size = 0;}//插入void Insert(ElementType x, PriorityQueue H){int i;if(IsFull(H)){printf("priority queue is full");return;}for(i = ++H->Size; H->Elements[i/2] > x; i /= 2)H->Elements[i] = H->Elements[i/2];H->Elements[i] = x;}//删除ElementType DeleteMin(PriorityQueue H){int i, Child;ElementType MinElement, LastElement;if(IsEmpty(H)){printf("Priority queue is empty");return H->Elements[0];}MinElement = H->Elements[1];LastElement = H->Elements[H->Size--];for(i = 1; i * 2 <= 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];elsebreak;}H->Elements[i] = LastElement;return MinElement;}//寻找最小ElementType FindMin(PriorityQueue H){return H->Elements[1];}//显示void display(PriorityQueue H){for(int i = 1; i <= H->Size; i++)printf("%-5d", H->Elements[i]);printf("\n");}int main(){PriorityQueue H = Initialize(20);Insert(10, H);Insert(15, H);Insert(5, H);Insert(40, H);Insert(34, H);Insert(9, H);display(H);DeleteMin(H);display(H);DeleteMin(H);display(H);system("pause");return 0;}