堆的定义与操作(C语言)
生活随笔
收集整理的這篇文章主要介紹了
堆的定义与操作(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼如下:
typedef struct HNode *Heap; /* 堆的類型定義 */ struct HNode {ElementType *Data; /* 存儲元素的數組 */int Size; /* 堆中當前元素個數 */int Capacity; /* 堆的最大容量 */ }; typedef Heap MaxHeap; /* 最大堆 */ typedef Heap MinHeap; /* 最小堆 */#define MAXDATA 1000 /* 該值應根據具體情況定義為大于堆中所有可能元素的值 */MaxHeap CreateHeap( int MaxSize ) { /* 創建容量為MaxSize的空的最大堆 */MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));H->Data = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));H->Size = 0;H->Capacity = MaxSize;H->Data[0] = MAXDATA; /* 定義"哨兵"為大于堆中所有可能元素的值*/return H; }bool IsFull( MaxHeap H ) {return (H->Size == H->Capacity); }bool Insert( MaxHeap H, ElementType X ) { /* 將元素X插入最大堆H,其中H->Data[0]已經定義為哨兵 */int i;if ( IsFull(H) ) { printf("最大堆已滿");return false;}i = ++H->Size; /* i指向插入后堆中的最后一個元素的位置 */for ( ; H->Data[i/2] < X; i/=2 )H->Data[i] = H->Data[i/2]; /* 上濾X */H->Data[i] = X; /* 將X插入 */return true; }#define ERROR -1 /* 錯誤標識應根據具體情況定義為堆中不可能出現的元素值 */bool IsEmpty( MaxHeap H ) {return (H->Size == 0); }ElementType DeleteMax( MaxHeap H ) { /* 從最大堆H中取出鍵值為最大的元素,并刪除一個結點 */int Parent, Child;ElementType MaxItem, X;if ( IsEmpty(H) ) {printf("最大堆已為空");return ERROR;}MaxItem = H->Data[1]; /* 取出根結點存放的最大值 *//* 用最大堆中最后一個元素從根結點開始向上過濾下層結點 */X = H->Data[H->Size--]; /* 注意當前堆的規模要減小 */for( Parent=1; Parent*2<=H->Size; Parent=Child ) {Child = Parent * 2;if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )Child++; /* Child指向左右子結點的較大者 */if( X >= H->Data[Child] ) break; /* 找到了合適位置 */else /* 下濾X */H->Data[Parent] = H->Data[Child];}H->Data[Parent] = X;return MaxItem; } /*----------- 建造最大堆 -----------*/ void PercDown( MaxHeap H, int p ) { /* 下濾:將H中以H->Data[p]為根的子堆調整為最大堆 */int Parent, Child;ElementType X;X = H->Data[p]; /* 取出根結點存放的值 */for( Parent=p; Parent*2<=H->Size; Parent=Child ) {Child = Parent * 2;if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )Child++; /* Child指向左右子結點的較大者 */if( X >= H->Data[Child] ) break; /* 找到了合適位置 */else /* 下濾X */H->Data[Parent] = H->Data[Child];}H->Data[Parent] = X; }void BuildHeap( MaxHeap H ) { /* 調整H->Data[]中的元素,使滿足最大堆的有序性 *//* 這里假設所有H->Size個元素已經存在H->Data[]中 */int i;/* 從最后一個結點的父節點開始,到根結點1 */for( i = H->Size/2; i>0; i-- )PercDown( H, i ); }總結
以上是生活随笔為你收集整理的堆的定义与操作(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AVL树的旋转与插入(C语言)
- 下一篇: 《赛博朋克 2077:终极版》实体游戏封