C语言—实现优先队列的基本操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档