#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
void print(int list[], int n);
void insert(int list[], int key, int n);
void bottomUp(int list[], int n);
void topDown(int list[], int n);
int deleteMax(int list[], int n);
int main()
{
char manual[] = "menu:\n1.insert\n2.deleteMax\n3.print(just reference)\n4.exit\n\nop:";
int op;
int key;
int list[MAX_SIZE];
int n = 0;
while(1){
printf("%s", manual);
scanf("%d", &op);
switch(op){
case 1:
printf("\ninsert value:");
scanf("%d", &key);
insert(list, key, n++);
break;
case 2:
printf("Max value = %d\n", deleteMax(list, n--));
break;
case 3:
print(list, n);
break;
case 4:
exit(0);
}
}
return 0;
}
void insert(int list[], int key, int n)
{
n++;
if(n == 1){
list[1] = key;
return;
}
list[n] = key;
bottomUp(list, n);
}
void bottomUp(int list[], int n)
{
int value = list[n];
int parent = n/2;
int tmp = n;
while(tmp>1){
if(value <= list[parent])
break;
list[tmp] = list[parent];
tmp = parent;
parent/=2;
}
list[tmp] = value;
}
int deleteMax(int list[], int n)
{
if(n < 1){
printf("Heap is empty!\n\n");
return -1;
}
int minValue = list[1];
topDown(list, n);
n--;
return minValue;
}
void topDown(int list[], int n)
{
int child = 2;
int key = list[n];
while(child <= n){
if(child+1 <= n && list[child] < list[child + 1])
child ++;
if(key >= list[child])
break;
list[child/2] = list[child];
child *= 2;
}
list[child/2] = key;
}
void print(int list[], int n)
{
if(n<1){
printf("Heap is empty\n\n");
return;
}
for(int i = 1, level = 0; i<=n; i*=2, level++){
int j = i;
for(int k = 20-2*level; k>0; k--)
printf("_");
for(int j = 0; j<i && i+j <= n; j++){
for(int k = 10-2*level; k>0; k--)
printf("_");
printf("%d", list[i+j]);
}
printf("\n");
}
}