当前位置: 首页 > news >正文

堆的实现--数据结构

目录

主程序(test.c)

头文件(heap.h)

调用函数(heap.c)


主程序(test.c)

#define _CRT_SECURE_NO_WARNINGS 1#include "heap.h"int main()
{//大堆Heap heap;//初始化HeapInit(&heap);//堆的插入HeapPush(&heap, 5);HeapPush(&heap, 1);HeapPush(&heap, 7);HeapPush(&heap, 10);HeapPush(&heap, 6);HeapPush(&heap, 8);HeapPush(&heap, 12);//堆的删除HeapPop(&heap);HeapPush(&heap, 48);//取堆顶数据HPDataType n = HeapTop(&heap);printf("堆顶的数据为:%d\n", n);HeapPop(&heap);n = HeapTop(&heap);printf("堆顶数据为%d\n", n);HeapPop(&heap);n = HeapTop(&heap);printf("堆顶的数据为:%d\n", n);HeapPop(&heap);HeapPop(&heap);HeapPop(&heap);printf("堆的数据个数为:%d\n", HeapSize(&heap));//判空int a = HeapSize(&heap);if (a == 0){printf("堆为空 \n");}elseprintf("堆不为空 \n");//销毁堆HeapDestory(&heap);return 0;
}

头文件(heap.h)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}Heap;//堆初始化
void HeapInit(Heap* php);
// 堆的销毁
void HeapDestory(Heap* php);
// 堆的插入
void HeapPush(Heap* php, HPDataType x);
// 堆的删除
void HeapPop(Heap* php);
// 取堆顶的数据
HPDataType HeapTop(Heap* php);
// 堆的数据个数
int HeapSize(Heap* php);
// 堆的判空
int HeapEmpty(Heap* php);
//向下调整
void Adjust_down(HPDataType* a, int father, int n);
//向上调整
void Adjust_up(HPDataType* a, int child);

调用函数(heap.c)

#define _CRT_SECURE_NO_WARNINGS 1
#include "heap.h"//堆初始化
void HeapInit(Heap* php)
{assert(php);php->capacity = 4;HPDataType* ph = (HPDataType*)malloc(sizeof(HPDataType)* php->capacity );if (ph == NULL){perror("malloc file:");return;}php->a = ph;php->size = 0;
}// 堆的销毁
void HeapDestory(Heap* php)
{assert(php);free(php->a);php->capacity = php->size = 0;
}void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}//向上调整
void Adjust_up(HPDataType* a, int child)
{assert(a);int father = (child - 1) / 2;while (child > 0){if (a[child] > a[father]){swap(&a[child], &a[father]);child = father;father = (child - 1) / 2;//当child = 0 时,father = 0;father是整形}else{break;}}
}//向下调整
void Adjust_down(HPDataType* a, int father,int n)
{assert(a);int child = father * 2 + 1;while (child < n ){if (child + 1 < n && a[child + 1] > a[child]){child = child + 1;}if (a[child] > a[father]){swap(&a[child], &a[father]);father = child;child = father * 2 + 1;}else{break;}}
}// 堆的插入
void HeapPush(Heap* php, HPDataType x)
{assert(php);//向上调整if (php->size == php->capacity){php->capacity *= 2;HPDataType* new = (HPDataType*)realloc(php->a, sizeof(HPDataType) * php->capacity);if (new == NULL){perror("realloc file:");return;}php->a = new;}php->a[php->size] = x;php->size++;//向上调整Adjust_up(php->a, php->size-1);
}// 堆的删除
void HeapPop(Heap* php)
{assert(php);if (php->size == 0){return;}//删除数据的逻辑是,先把头和尾交换位置,再向下调整swap(&php->a[0], &php->a[php->size - 1]);php->size--;Adjust_down(php->a, 0, php->size);
}
// 取堆顶的数据
HPDataType HeapTop(Heap* php)
{assert(php);if (php->size == 0){return NULL;}return php->a[0];
}
// 堆的数据个数
int HeapSize(Heap* php)
{assert(php);return php->size;
}
// 堆的判空
int HeapEmpty(Heap* php)
{assert(php);if (php->size > 0){return 1;}elsereturn 0;
}

http://www.mrgr.cn/news/64352.html

相关文章:

  • 4.2.4 根据DTS完成timer初始化
  • mysql8 window 免安装
  • 【CSS】——基础入门常见操作
  • 代理IPv6知识分享课堂二
  • 安宝特分享 | AR技术引领:跨国工业远程协作创新模式
  • GPTSearch 它来了
  • 重装linux系统
  • 网页自动化测试和爬虫:Selenium库入门与进阶
  • C语言中的希尔排序
  • 大厂面试真题-如果使用guava limiter实现实例级别的缓存
  • JSP ft06 问题几个求解思路整理
  • 我国在AI领域的发展趋势
  • 【springcloud】服务之间调用失败的重试机制
  • 微服务架构面试内容整理-微服务架构的定义及优势
  • C++ --- 多线程的使用
  • 《程序内存需求估算:职场中的“暗礁”与“灯塔”》
  • 网络通信与并发编程(九)asyncio
  • 【ReactPress】一款基于React的开源博客CMS内容管理平台—ReactPress
  • Python Turtle模块详解与使用教程
  • ITK-膨胀
  • ‌频率和波长之间存在反比关系‌
  • 算法妙妙屋-------1.递归的深邃回响:C++ 算法世界的优雅之旅
  • (八)JavaWeb后端开发——Tomcat
  • 超好用的视频剪辑软件分享:10款剪辑软件推荐
  • UE5 猎户座漂浮小岛 06 角色
  • opengl学习-2vao和vbo(通义千问的例子)