#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");
    }
}
 

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()