优先队列的实现

优先队列的声明

#ifmdef _BinHeap_H

struct HeapStruct;
typedef struct HeapStruct *PriorityQueue;

PriorityQueue Initialize(int MaxElement);
void Destory(PriorityQueue H);
void MakwEmpty(PriorityQueue H)
void Insert(ElementType X,PriorityQueue H);
ElementType DeleteMin(PriorityQueue H);
ElementType FindMin(PriorityQueue H);
int IsEmpty(PriorityQueue H);
int IsFull(PriorityQueue H);

#endif

struct HeapStruct
{
	int Capacity;
	int Size;
	ElementType *Elements;
}

优先队列的初始化

PriorityQueue Initialize(int MaxElements)
{
	PriorityQueue H;
	if(MaxElement < MinPQSize)
		Error("Priority queue size is too small");
	H = malloc(sizeof(struct HeapStruct));
	if(H == NULL)
		FatalError("Out of space!!!");
	H->Elements = malloc((MaxElements + 1)*sizeof(ElementType));
	if(H->Elements == NULL)
		FatalError("Out of space!!!");
	H->Capacity = MaxElements;
	H->Size = 0;
	H->Elements[0] = MinData;
	
	return H;
}

插入一个元素到二叉树中

void Insert(ElementType X,PriorityQueue H)
{
	int i;
	if(IsFull(H))
	{
		Error("Priority queue is full");
		return 0;
	}
	for(i = ++H->Size;H->Elements[i/2] > X;i /= 2)
		H->Elements[i] = H->Elements[i/2];
	H->Elements[i] = X;
}

在二叉树中执行DeleteMin函数

ElementType DeleteMin(PriorityQueue H)
{
	int i,Child;
	ElementType MinElement,LastElement;
	
	if(IsEmpty(H))
	{
		Error("Priority queue is empty");
		return H->Elements[0];
	}
	MinElement = H->Elements[1];
	LastElement = H->Elements[H->Size--];
	for(i = 1;i*2 <= H->Size;i = Child)
	{
		Child = i*2;
		if(Child != H->Size && H->Elements[Child + 1] < H->Elements[Child])
			Child ++;
		if(LastElement > H->Elements[Child])
			H->Elements[i] = H->Elements[Child];
		else
			break;
	}
	H->Elements[i] = LastElement;
	return MinElement;
}
posted @ 2017-02-06 11:17  梁月唯  阅读(237)  评论(0编辑  收藏  举报