堆,优先队列c语言实现插入和删除

struct PriorityQueue{
    int Cap;
    int size;
    int *data;
};

void Print(PriorityQueue* H)
{
    for (int i = 0; i < H->size+1; i++)
    {
        printf("%d ", H->data[i]);
    }
    printf("\n");
}

PriorityQueue* CreateQueue(int MaxNum)
{
    PriorityQueue *H;

    H = (PriorityQueue*)malloc(sizeof(PriorityQueue));
    if (H == NULL)
    {
        printf("Malloc failed!\n");
        return NULL;
    }
    H->data = (int*)malloc(sizeof(int)*(MaxNum + 1));
    H->Cap = MaxNum;
    H->size = 0;
    H->data[0] = -1;
    return H;
}

void Insert(PriorityQueue* H, int val)
{
    if (H->size + 1 > H->Cap)
    {
        printf("FULL!\n");
        return;
    }
    int i = 0;
    H->size++;
    for (i = H->size; H->data[(int)(i / 2.0)] > val; i = (int)(i / 2.0))//令i在最外面的位置,val与i所在的根节点比较。如果根节点大于val,val需要上浮(但是先得让当前值下沉!)
    {
        H->data[i] = H->data[(int)(i / 2.0)];//下沉一个
    }//循环结束后,i的位置就是找到的根节点
    H->data[i] = val;
}

int DeleteMin(PriorityQueue* H)
{
    int min = H->data[1];//去除第一个
    int last = H->data[H->size--];//保存最后一个

    int i = 1;
    while (2 * i + 1 <= H->size)//循环结束标志
    {
        if (H->data[2 * i] >= H->data[2 * i + 1])
        {
            H->data[i] = H->data[2 * i + 1];
            i = 2 * i + 1;
        }
        else
        {
            H->data[i] = H->data[2 * i];
            i = 2 * i;
        }
    }
    H->data[i] = last;
    return min;
}

int main(int argc,char** argv)
{
    PriorityQueue *H = CreateQueue(10);
    Insert(H, 25);
    Insert(H, 15);
    Insert(H, 5);
    Insert(H, 4);
    Insert(H, 8);
    Insert(H, 1);
    Insert(H, 10);
    Insert(H, 3);
    Insert(H, 2);
    Insert(H, 30);

    Print(H);

    DeleteMin(H);
    Print(H);

    return 0;
}