提示信息

数据结构分析:堆的C语言实现

没有 已关注

堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。在堆中,父节点总是与其子节点有一个确定的顺序关系。常见的堆有最大堆和最小堆。在最大堆中,父节点的值总是大于或等于其子节点的值,而在最小堆中,父节点的值总是小于或等于其子节点的值。

下面是一个简单的最大堆的C语言实现,包括插入和删除功能:

  1. #include <stdio.h>
  2. #define MAX_SIZE 100
  3. typedef struct {
  4. int size;
  5. int data[MAX_SIZE];
  6. } MaxHeap;
  7. // 交换两个元素
  8. void swap(int *a, int *b) {
  9. int temp = *a;
  10. *a = *b;
  11. *b = temp;
  12. }
  13. // 向上调整堆
  14. void heapifyUp(MaxHeap *heap, int index) {
  15. if (index && heap->data[(index - 1) / 2] < heap->data[index]) {
  16. swap(&heap->data[(index - 1) / 2], &heap->data[index]);
  17. heapifyUp(heap, (index - 1) / 2);
  18. }
  19. }
  20. // 插入元素到堆
  21. void insert(MaxHeap *heap, int value) {
  22. if (heap->size >= MAX_SIZE) {
  23. printf("Heap overflow!\n");
  24. return;
  25. }
  26. heap->data[heap->size] = value;
  27. heapifyUp(heap, heap->size);
  28. heap->size++;
  29. }
  30. // 向下调整堆
  31. void heapifyDown(MaxHeap *heap, int index) {
  32. int largest = index;
  33. int left = 2 * index + 1;
  34. int right = 2 * index + 2;
  35. if (left < heap->size && heap->data[left] > heap->data[largest])
  36. largest = left;
  37. if (right < heap->size && heap->data[right] > heap->data[largest])
  38. largest = right;
  39. if (largest != index) {
  40. swap(&heap->data[index], &heap->data[largest]);
  41. heapifyDown(heap, largest);
  42. }
  43. }
  44. // 从堆中删除最大元素
  45. int extractMax(MaxHeap *heap) {
  46. if (heap->size <= 0) {
  47. printf("Heap underflow!\n");
  48. return -1;
  49. }
  50. int root = heap->data[0];
  51. heap->data[0] = heap->data[--heap->size];
  52. heapifyDown(heap, 0);
  53. return root;
  54. }
  55. // 打印堆中的元素
  56. void printHeap(MaxHeap *heap) {
  57. for (int i = 0; i < heap->size; i++)
  58. printf("%d ", heap->data[i]);
  59. printf("\n");
  60. }
  61. int main() {
  62. MaxHeap heap;
  63. heap.size = 0;
  64. insert(&heap, 10);
  65. insert(&heap, 20);
  66. insert(&heap, 5);
  67. insert(&heap, 30);
  68. insert(&heap, 15);
  69. printf("Heap elements: ");
  70. printHeap(&heap);
  71. printf("Extracted max: %d\n", extractMax(&heap));
  72. printf("Heap elements after extraction: ");
  73. printHeap(&heap);
  74. return 0;
  75. }

代码详解:

  1. 结构定义

    • MaxHeap 结构体表示堆,包括一个存储元素的数组和一个表示当前堆大小的变量。
  2. 辅助函数

    • swap 用于交换两个整数,辅助堆调整操作。
    • heapifyUp 从堆底向上调整,使堆保持最大堆性质。
    • heapifyDown 从堆顶向下调整,也是为了维持堆的最大性质。
  3. 核心操作

    • insert 插入一个新元素,并调用 heapifyUp 维持堆的性质。
    • extractMax 移除并返回堆中的最大元素,然后调用 heapifyDown 整理堆。
  4. 打印函数

    • printHeap 用于输出当前堆的所有元素。

这个实现展示了如何用C语言创建一个简单的最大堆,并实现基本操作。如果需要最小堆,只需要调整比较条件即可。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
没有 关注 已关注

最近一次登录:2024-11-20 20:41:00   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图