c语言实现二叉堆

生成二叉堆:

priorityqueue create(int max)
{
    priorityqueue h;
    h = (priorityqueue)malloc(sizeof(struct heap));
    h->data = (*int)malloc(sizeof(int)*(max+1));
    h->data[0] = INT_MIN;//很小的值
    h->size = 0;
    h->capacity = max;
    return h;

 } 

插入操作:

void insert(priorityqueue h,int data)
{
    //判断堆满没满
    if(h->size==h->capacity) 
    {
        printf("full!\n");
        return ;
    } 

    h->size++;
    int i;

    for(int i = h->size;h->data[i/2]>data;i/=2)
    {
        h->data[i] = h->data[i/2];

    }
    h->data[i] = data;
 }

删除操作:

int  deleted(priorityqueue h,int data)
{
    if(h->size==0) 
    {
        printf("failed\n");
        return 0 ;
    }

    int lastdata = h->data[h->size--];

    int mindata = h->data[1];

    int i,child;
    for(int i =1 ; i*2<=h->size ; i =child)
    {
        //找i节点左右子节点的最小值 
        child = 2*i;
        //存在右子节点 
        if(child!=h->size&&h->data[child]>h->data[2*i+1]){
            child++;
        } 
        if(lastdata > h->data[child])
        {
            h->data[i] =h->data[child];

        }

        else break;
    }

        h->data[i] = lastdata;

    return mindata;
} 

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<limits.h> 

typedef struct heap* priorityqueue;

struct heap{
    int *data;
    int size;//目前堆中元素 
    int capacity;//堆中最大能放多少元素 
};



priorityqueue create(int max)
{
    priorityqueue h;
    h = (priorityqueue) malloc (sizeof(struct heap));
    h->data = (int*)malloc(sizeof(int)*(max+1));
    h->data[0] = INT_MIN;//很小的值
    h->size = 0;
    h->capacity = max;
    return h; 
}
void insert(priorityqueue h,int data)
{
    //判断堆满没满
    if(h->size==h->capacity) 
    {
        printf("full!\n");
        return ;
    } 

    h->size++;
    int i;

    for(int i = h->size;h->data[i/2]>data;i/=2)
    {
        h->data[i] = h->data[i/2];

    }
    h->data[i] = data;

} 


int  deleted(priorityqueue h,int data)
{
    if(h->size==0) 
    {
        printf("failed\n");
        return 0 ;
    }

    int lastdata = h->data[h->size--];

    int mindata = h->data[1];

    int i,child;
    for(int i =1 ; i*2<=h->size ; i =child)
    {
        //找i节点左右子节点的最小值 
        child = 2*i;
        //存在右子节点 
        if(child!=h->size&&h->data[child]>h->data[2*i+1]){
            child++;
        } 
        if(lastdata > h->data[child])
        {
            h->data[i] =h->data[child];

        }

        else break;
    }

        h->data[i] = lastdata;

    return mindata;
} 

int main()
{

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言实现优先队列的经典方式是使用二叉堆数据结构。二叉堆是一种完全二叉树,同时满足堆次序的条件。在二叉堆中,每个节点的值都大于或等于其子节点的值(最大堆),或者每个节点的值都小于或等于其子节点的值(最小堆)。通过维护堆次序,可以保证堆顶元素是最大或最小的元素。 下面是C语言实现二叉堆的优先队列的一种方法: ```C #include <stdio.h> #include <stdlib.h> typedef struct { int capacity; // 队列的容量 int size; // 队列中元素的数量 int *data; // 存储队列元素的数组 } PriorityQueue; PriorityQueue* createPriorityQueue(int capacity) { PriorityQueue *queue = (PriorityQueue*)malloc(sizeof(PriorityQueue)); queue->capacity = capacity; queue->size = 0; queue->data = (int*)malloc(sizeof(int) * capacity); return queue; } void destroyPriorityQueue(PriorityQueue *queue) { free(queue->data); free(queue); } void enqueue(PriorityQueue *queue, int value) { if (queue->size >= queue->capacity) { // 队列已满,需要扩容 queue->capacity *= 2; queue->data = (int*)realloc(queue->data, sizeof(int) * queue->capacity); } // 将元素放入队列尾部 queue->data[queue->size] = value; queue->size++; // 通过向上调整操作恢复堆次序 int child = queue->size - 1; int parent = (child - 1) / 2; while (child > 0 && queue->data[child] > queue->data[parent]) { int temp = queue->data[child]; queue->data[child] = queue->data[parent]; queue->data[parent] = temp; child = parent; parent = (child - 1) / 2; } } int dequeue(PriorityQueue *queue) { int value = queue->data[0]; // 将队尾元素放到队首,并删除队尾元素 queue->data[0] = queue->data[queue->size - 1]; queue->size--; // 通过向下调整操作恢复堆次序 int parent = 0; while (parent * 2 + 1 < queue->size) { int leftChild = parent * 2 + 1; int rightChild = parent * 2 + 2; int maxChild = leftChild; if (rightChild < queue->size && queue->data[rightChild] > queue->data[leftChild]) { maxChild = rightChild; } if (queue->data[parent] >= queue->data[maxChild]) { break; } int temp = queue->data[parent]; queue->data[parent] = queue->data[maxChild]; queue->data[maxChild] = temp; parent = maxChild; } return value; } int main() { PriorityQueue *queue = createPriorityQueue(10); enqueue(queue, 5); enqueue(queue, 3); enqueue(queue, 7); printf("%d\n", dequeue(queue)); // 输出7,因为7是队列中的最大值 printf("%d\n", dequeue(queue)); // 输出5,因为5是队列中的次大值 printf("%d\n", dequeue(queue)); // 输出3,因为3是队列中的最小值 destroyPriorityQueue(queue); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值