c++对堆的简单实现

#include<iostream>
using namespace std;
typedef class poinner* on;
class poinner{
	public:
		int size;//当前尺寸 
		int capacity;//容量 
		int* poin;//数组指针 
};
on create(int Maxsize){//初始化 
	on h=new poinner();
	h->size=0;
	h->capacity=Maxsize;
	h->poin=new int[Maxsize+1];//数组第一位不存放插入的数据,所以长度加一 
	h->poin[0]=10000;// 数组第一位存放一个大数,要确保这个数比之后存放的数都大,把它叫做‘哨兵’ 
	//(为了方便删除时操作,也可以不设这个大数,那么数组长度应该是Maxsize) 
	return h;
}
bool isempty(on head){//判断是否为空 
	if(!head->size)return true;
	else return false;

}
bool isfull(on head){//判断是否已满 
	if(head->size==head->capacity)return true;
	else return false;
}
void insert(on head,int val){//插入一个值val 
	int i;
	if(isfull(head)){//先判断是否堆满 
		cout<<"堆满"<<endl;
		return;
	}
	//下面for循环所做操作有:
	//1.head->size自加一 
	//2.i指向插入后堆中的最后一个位置
	//3.向下过滤结点,也就是将i的上面小于val(插入值)的结点从后往前逐个向后移,循环结束时i指向val应当插入的位置 
	for(i=++head->size;head->poin[i/2]<val;i/=2)head->poin[i]=head->poin[i/2]; 
	head->poin[i]=val;//将i插入 
}
int deletepoin(on head){//删除最大值并返回 
	if(isempty(head)){//先判断 
		cout<<"堆空"<<endl;
		return -1;//返回一个值代表堆空,这里返回-1 
	}
	int parent,child,max,temp;
	max=head->poin[1];//保存要删除的元素 
	temp=head->poin[head->size--];//使temp保存数组最后一个元素的值并使数组长度减一,变相等于删除了最后一个元素(因为不能再访问它了)
	for(parent=1;parent*2<=head->size;parent=child){//用temp(堆中最后一个元素)从上往下过滤结点 
		child=parent*2;//parent结点的儿子结点的下标分别为parent*2、parent*2+1,此时child代表左子节点 
		if((child!=head->size)&&(head->poin[child]<head->poin[child+1]))child++;//找到子节点中值较大的 
		if(head->poin[child]>temp)head->poin[parent]=head->poin[child];//此时堆的最上面相当于是空,从上往下将结点逐个与temp比较
		//如果当前结点值大于temp就向上赋值,否则就退出循环,退出循环时parent即为temp(最后一个结点值)要插入的下标 
		else break;
	}
	head->poin[parent]=temp;//插入temp 
	return max; //返回最大值 
}
int size(on head){//返回当前数组尺寸,方便测试 
	return head->size;
}
int main(){//测试 
	poinner*head=create(20);
	insert(head,5);
	insert(head,6);
	insert(head,4);
	insert(head,9);
	insert(head,200);
	insert(head,1);
	cout<<size(head)<<endl;
	deletepoin(head);
	cout<<size(head)<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值