具体代码实现如下:
#include <stdio.h> #include <stdlib.h> #define MAX 100 typedef struct ElemType { int lever; int num; }ElemType; typedef struct Heap { ElemType data[MAX]; int len; }Heap,*LHeap; void Init(LHeap H) { H->len = 0; } bool IsEmpty(LHeap H) { return (H->len == 0); } bool IsFull(LHeap H) { return (H->len == MAX - 1); } void Insert(LHeap H,ElemType x) { int i; if (!IsFull(H)) { i = H->len + 1; while ((i!=1)&&(x.lever < H->data[i/2].lever)) { H->data[i] = H->data[i/2]; i/=2; } H->data[i].lever = x.lever; H->data[i].num = x.num; H->len++; } } void DeleteMax(LHeap H,ElemType* x) { int parent = 1,child = 2; ElemType tmp; if (!IsEmpty(H)) { x->lever = H->data[1].lever; x->num = H->data[1].num; tmp = H->data[H->len--]; while (child <= H->len) { if ((child < H->len) && (H->data[child].lever > H->data[child+1].lever)) { child++; } if (tmp.lever <= H->data[child].lever) { break; } H->data[parent] = H->data[child]; parent = child; child*=2; } H->data[parent] = tmp; } } int main() { Heap H; FILE *fp; int i = 1; ElemType task; if ((fp = fopen("task.dat","r")) == NULL) { printf("不能打开文件task.dat!"); exit(0); } Init(&H); while (!feof(fp)) { fscanf(fp,"%d %d",&task.num,&task.lever); Insert(&H,task); } printf("序号\t任务号\t优先级\t\n"); while (!IsEmpty(&H)) { DeleteMax(&H,&task); printf("%d\t",i); printf("%d\t",task.num); printf("%d\t\n",task.lever); i++; } system("pause"); return 0; }