C语言—实现优先队列的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 二叉堆实现(最小)优先队列的基本操作
//优先队列的基本操作包括创建一个空的优先队列、返回具有最小优先权的元素、将元素插入队列中和从队列中删除一个元素
#include
#include
#define MINDATA -32767
// 构造二叉堆
typedef struct HeapStruct
{
int capacity; // 最大堆容量
int size; // 当前堆大小
int * elements; // 节点指针
} * PriQueue;
// 初始化
PriQueue initPriQueue(int capacity){
PriQueue h = (PriQueue)malloc(sizeof (struct HeapStruct));
h->elements = (int *)malloc((capacity + 1) * sizeof (int));
h->capacity = capacity;
h->size = 0;
// 将堆的顶端存入最小值
h->elements[0] = MINDA TA;
return h;
}
// 入队
int inPriQueue(PriQueue h,int e){
int i;
//判断队列是否为空
if (h->size == h->capacity){
printf("队满, 入队失败!\n");
return 0;
}
for (i = ++h->size; h->elements[i / 2] > e; i = i / 2)
h->elements[i] = h->elements[i / 2];
h->elements[i] = e;
return 1;
// 出队
int outPriQueue(PriQueue h){
int i; // 索引
int child; // 子元素
int min; // 最小值
int last; // 队尾元素
//判断队列是否为空
if (h->size == 0){
printf("队空, 出队失败\n");
return 0;
}
min = h->elements[1]; // 要出队的元素
last = h->elements[h->size];
h->size--;
//删除一个元素后重新排序
for (i = 1; 2 * i <= h->size; i = child){
// 让child指向左子树
// 对于任意一个结点i,若2i小于或等于结点总个数,则左孩子的编号为2i
child = 2 * i;
// 如果i的右子树小于左子树, 则使child指向右子树
if (child != h->size && h->elements[child + 1] < h->elements[child]){
child++;
}
// 如果队尾元素大于当前节点的最小子树, 则把子树赋给当前节点
// 否则退出循环
if (last > h->elements[child])
h->elements[i] = h->elements[child];
else
break;
}
// 将last存入当前节点
h->elements[i] = last;
return min;
}
//返回最小优先权的元素
int minPriority(PriQueue h){
int min;
if (h->size == 0){
printf("队空, 出队失败\n");
return 0;
}
min=h->elements[1];
return min;
}
//主函数
void main(void){
int count,element; // count用于存储输入到队列的元素个数,element用于存储输入的元素
int i,cycle=0; // i用作数组循环变量,cycle用于while中的循环变量
int n,size; // n用于switch中表示case的值,size用于存储队列的元素的长度
int funvalue; // funvalue用于存储函数的返回值
PriQueue h = initPriQueue(30);
printf("请输入入队的个数:");
scanf("%d",&count);
printf("请输入入队的元素:");
for(i=0;i scanf("%d",&element); inPriQueue(h,element); } while(cycle!=(-1)){ printf("********************************************\n"); printf(" ☆插入一个元素到队列中....请按:1\n"); printf(" ☆从队列中删除一个元素....请按:2\n"); printf(" ☆查看优先权最小的元素....请按:3\n"); printf(" ☆遍历队列中所有元素......请按:4\n"); printf(" ☆退出....................请按:5\n"); printf("********************************************\n"); printf("请输入要执行的操作:"); scanf("%d",&n); switch(n){ case 1: printf("请输入要插入的元素:"); scanf("%d",&element); funvalue=inPriQueue(h,element);