• 优先队列的实现


    优先队列的声明

    #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;
    }
  • 相关阅读:
    开发环境搭建
    添加约束设置方式
    ubuntu和windows双系统启动顺序的修改
    函数指针,指针函数,数组指针,指针数组 区分
    boost
    centos7 64位如何配置网络
    MySQL数据库(主键、索引、外键、触发器...)
    几种常见字符集与字符编码
    ODBC、OLEDB应用详解
    C#事件以及EventHandler、EventArgs
  • 原文地址:https://www.cnblogs.com/y3w3l/p/6369628.html
Copyright © 2020-2023  润新知