(c语言)堆的操作集源码(包含测试用例)

本实验取材于浙江大学《数据结构》mooc。
本次实验在mooc课后源码里有,但是要将其联系成线,需要课下花时间,下面给出源码分析。
听课的速度不代表你吃透知识的速度,相信大家一直坚信功夫在课外!

#include<stdio.h>
#include<stdlib.h>
#define MaxData 1001
typedef struct HeapStruct *MaxHeap;
typedef int ElementType;
typedef int Boolean;
struct HeapStruct{
	ElementType *Elements; //存储堆元素的数组
	int Size; //堆的当前元素个数
	int Capacity;//堆的最大容量
};

MaxHeap Create(int MaxSize);//创建一个空的最大堆
Boolean IsFull(MaxHeap H);//判断最大堆H是否已满.
void Insert(MaxHeap H,ElementType item);//将元素item插入最大堆H
Boolean IsEmpty(MaxHeap H);//判断最大堆是否为空
ElementType DeleteMax(MaxHeap H);//返回H中最大元素(高优先级)
MaxHeap Create(int MaxSize)
{
	//创建容量为MaxSize的空的最大堆
	MaxHeap H = (MaxHeap )malloc(sizeof(struct HeapStruct));
	H->Elements = (int *)malloc((MaxSize + 1)*sizeof(ElementType));
	H->Size = 0;
	H->Capacity = MaxSize;
	H->Elements[0]=MaxData;
	///定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作
	return H;
}
Boolean IsFull(MaxHeap H)
{
	return (H->Size==H->Capacity);
}
Boolean IsEmpty(MaxHeap H)
{
	return (H->Size == 0 );
}
//将新增结点插入到从其父结点到根结点的有序序列中
void Insert(MaxHeap H,ElementType item)
{//将元素item插入最大堆H,其中H->ElementType[0]已经定义为哨兵
	int i;
	if(IsFull(H)){
		printf("Heap is full!\n");
		return ;
	}
	i = ++H->Size;//i指向插入后堆中的最后一个元素的位置
	for(;H->Elements[i/2]<item;i/=2){
		H->Elements[i]=H->Elements[i/2];//向下过滤结点
		
	}
	H->Elements[i]=item;//进行插入
} 
ElementType DeleteMax(MaxHeap H){
	//从最大堆H中取出键值为最大的元素,并删除一个结点*/
	int Parent,Child;
	ElementType MaxItem,temp;
	if(IsFull(H)){
		printf("Heap is full!\n");
		return -1;
	}
	MaxItem = H->Elements[1];//取出根节点最大值
	temp = H->Elements[H->Size--];
	//用最大堆中最后一个元素从根结点开始向上过滤下层结点
	for(Parent=1;Parent*2<=H->Size;Parent=Child){
		Child = Parent * 2;
		if((Child != H->Size) && (H->Elements[Child] < H->Elements[Child+1]))
			Child++;//child指向左右子节点的较大值
		if(temp>=H->Elements[Child]) break;
		else //移动temp元素到下一层
			H->Elements[Parent] = H->Elements[Child];
			
	}
	H->Elements[Parent] = temp;
	return MaxItem;
}
int main()
{
	MaxHeap H = Create(10);
	Insert(H,1);
	Insert(H,5);
	Insert(H,7);
	Insert(H,6);
	int m = DeleteMax(H);
	printf("Delete Elements:%d",m);
	return 0;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值