C语言实现堆的基本操作

文章目录

  • 前言
  • 基本的操作
    • 一、头文件及定义堆
    • 二、创建最大堆
    • 三、判断堆满/空
    • 四、插入操作
    • 五、删除操作
  • 完整代码


前言

本文用C语言实现了堆的基本操作,包括:创建堆、判断堆满/空、插入、删除。虽然在C++的STL中已经分装好了堆数据结构,但是在不少的场合会用到自己写的堆。
用C++更加方便:C++使用堆!


 

基本的操作

堆分为最大堆和最小堆,本文对最大堆进行了说明,最小堆可模仿写出。

 

一、头文件及定义堆

代码:

#include 
#include 

#define MaxData INT_MAX;//定义最大值

typedef int DataType;

typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
     
	DataType *data;//定义数组
	int size;//堆当前元素个数 
	int capacity;//堆的最大容量 
};

 

二、创建最大堆

//创建最大堆
MaxHeap Creat(int MaxSize){
     
	MaxHeap H=malloc(sizeof(struct HeapStruct));
	//第一个位置不作为堆的元素 
	H->data=malloc((MaxSize+1)*sizeof(DataType));
	H->size=0;
	H->capacity=MaxSize;
	//第一个元素作为标记元素 
	H->data[0]=MaxData;
	return H;
}

 

三、判断堆满/空

//判断堆栈是否满 
int IsFull(MaxHeap H){
     
	if(H->size==H->capacity)return 1;
	return 0;
}

//判断堆栈是否为空
int IsEmpty(MaxHeap H){
     
	if(H->size==0)return 1;
	return 0;
} 

 

四、插入操作

数组中 i/2 的位置是父结点的位置,如果比父结点大,就向前移动

//插入元素
void Insert(MaxHeap H,DataType item){
     
	int i;
	if(IsFull(H)){
     
		printf("最大堆已满!");
		return;
	}
	i=++H->size;
	for(;H->data[i/2]<item;i/=2)
		H->data[i]=H->data[i/2];
	H->data[i]=item;
}

 

五、删除操作

//删除最大值
//用最后一个元素代替第一个元素,然后调整为最大堆 
DataType DeleteMax(MaxHeap H){
     
	int parent,child;
	DataType MaxItem,temp;
	if(IsEmpty(H)){
     
		printf("最大堆为空,不存在最大值!");
		return;
	}
	MaxItem=H->data[1];
	//用最大堆中的最后一个元素,从根结点开始向下寻找合适的位置 
	temp=H->data[H->size--];//最后一个元素赋值给temp,然后大小-1 
	
	for(parent=1;parent*2<=H->size;parent=child){
     
		child=parent*2;
		//寻找儿子结点中最大的 
		if((child!=H->size)&&(H->data[child]<H->data[child])){
     
			child++;
		}
		//如果temp比两个儿子结点都大,说明找到了合适位置 
		if(temp>=H->data[child])break;
		else
			//temp小于儿子结点中的最大值,那么较大的儿子结点作为parent,返回继续循环 
			H->data[parent]=H->data[child]; 
	}
	//找到合适位置 
	H->data[parent]=temp;
	return MaxItem;
} 

完整代码

#include 
#include 

#define MaxData INT_MAX;

typedef int DataType;

typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
     
	DataType *data;
	int size;//堆当前元素个数 
	int capacity;//堆的最大容量 
};

//创建最大堆
MaxHeap Creat(int MaxSize){
     
	MaxHeap H=malloc(sizeof(struct HeapStruct));
	//第一个不作为堆的元素 
	H->data=malloc((MaxSize+1)*sizeof(DataType));
	H->size=0;
	H->capacity=MaxSize;
	//第一个元素作为标记元素 
	H->data[0]=MaxData;
	return H;
}

//判断堆栈是否满 
int IsFull(MaxHeap H){
     
	if(H->size==H->capacity)return 1;
	return 0;
}

//判断堆栈是否为空
int IsEmpty(MaxHeap H){
     
	if(H->size==0)return 1;
	return 0;
} 

//插入元素
void Insert(MaxHeap H,DataType item){
     
	int i;
	if(IsFull(H)){
     
		printf("最大堆已满!");
		return;
	}
	i=++H->size;
	for(;H->data[i/2]<item;i/=2)
		H->data[i]=H->data[i/2];
	H->data[i]=item;
}

//删除最大值
//用最后一个元素代替第一个元素,然后调整为最大堆 
DataType DeleteMax(MaxHeap H){
     
	int parent,child;
	DataType MaxItem,temp;
	if(IsEmpty(H)){
     
		printf("最大堆为空,不存在最大值!");
		return;
	}
	MaxItem=H->data[1];
	//用最大堆中的最后一个元素,从根结点开始向下寻找合适的位置 
	temp=H->data[H->size--];//最后一个元素赋值给temp,然后大小-1 
	
	for(parent=1;parent*2<=H->size;parent=child){
     
		child=parent*2;
		//寻找儿子结点中最大的 
		if((child!=H->size)&&(H->data[child]<H->data[child])){
     
			child++;
		}
		//如果temp比两个儿子结点都大,说明找到了合适位置 
		if(temp>=H->data[child])break;
		else
			//temp小于儿子结点中的最大值,那么较大的儿子结点作为parent,返回继续循环 
			H->data[parent]=H->data[child]; 
	}
	//找到合适位置 
	H->data[parent]=temp;
	return MaxItem;
} 


int main(int argc, char *argv[]) {
     
	MaxHeap H;
	H=Creat(10);
	
	Insert(H,2);
	Insert(H,5);
	Insert(H,1);
	Insert(H,3);
	Insert(H,6);
	
	int i;
	printf("堆中的元素:");
	for(i=1;i<=H->size;i++){
     
		printf("%d ",H->data[i]);
	}
	printf("\n");
	
	
	printf("删除最大值:");
	DeleteMax(H);
	for(i=1;i<=H->size;i++){
     
		printf("%d ",H->data[i]);
	}
	
	return 0;
}

C语言实现堆的基本操作_第1张图片

你可能感兴趣的:(算法和数据结构)