数据结构分析:堆的C语言实现
堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。在堆中,父节点总是与其子节点有一个确定的顺序关系。常见的堆有最大堆和最小堆。在最大堆中,父节点的值总是大于或等于其子节点的值,而在最小堆中,父节点的值总是小于或等于其子节点的值。
下面是一个简单的最大堆的C语言实现,包括插入和删除功能:
#include <stdio.h>
#define MAX_SIZE 100
typedef struct {
int size;
int data[MAX_SIZE];
} MaxHeap;
// 交换两个元素
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 向上调整堆
void heapifyUp(MaxHeap *heap, int index) {
if (index && heap->data[(index - 1) / 2] < heap->data[index]) {
swap(&heap->data[(index - 1) / 2], &heap->data[index]);
heapifyUp(heap, (index - 1) / 2);
}
}
// 插入元素到堆
void insert(MaxHeap *heap, int value) {
if (heap->size >= MAX_SIZE) {
printf("Heap overflow!\n");
return;
}
heap->data[heap->size] = value;
heapifyUp(heap, heap->size);
heap->size++;
}
// 向下调整堆
void heapifyDown(MaxHeap *heap, int index) {
int largest = index;
int left = 2 * index + 1;
int right = 2 * index + 2;
if (left < heap->size && heap->data[left] > heap->data[largest])
largest = left;
if (right < heap->size && heap->data[right] > heap->data[largest])
largest = right;
if (largest != index) {
swap(&heap->data[index], &heap->data[largest]);
heapifyDown(heap, largest);
}
}
// 从堆中删除最大元素
int extractMax(MaxHeap *heap) {
if (heap->size <= 0) {
printf("Heap underflow!\n");
return -1;
}
int root = heap->data[0];
heap->data[0] = heap->data[--heap->size];
heapifyDown(heap, 0);
return root;
}
// 打印堆中的元素
void printHeap(MaxHeap *heap) {
for (int i = 0; i < heap->size; i++)
printf("%d ", heap->data[i]);
printf("\n");
}
int main() {
MaxHeap heap;
heap.size = 0;
insert(&heap, 10);
insert(&heap, 20);
insert(&heap, 5);
insert(&heap, 30);
insert(&heap, 15);
printf("Heap elements: ");
printHeap(&heap);
printf("Extracted max: %d\n", extractMax(&heap));
printf("Heap elements after extraction: ");
printHeap(&heap);
return 0;
}
代码详解:
结构定义:
MaxHeap
结构体表示堆,包括一个存储元素的数组和一个表示当前堆大小的变量。
辅助函数:
swap
用于交换两个整数,辅助堆调整操作。heapifyUp
从堆底向上调整,使堆保持最大堆性质。heapifyDown
从堆顶向下调整,也是为了维持堆的最大性质。
核心操作:
insert
插入一个新元素,并调用heapifyUp
维持堆的性质。extractMax
移除并返回堆中的最大元素,然后调用heapifyDown
整理堆。
打印函数:
printHeap
用于输出当前堆的所有元素。
这个实现展示了如何用C语言创建一个简单的最大堆,并实现基本操作。如果需要最小堆,只需要调整比较条件即可。