堆的基本操作
1、建立堆
2、調整堆(向下調整)
3、插入
4、移除堆頂元素
5、返回堆元素個數
6、判斷是不是空堆
7、返回堆頂元素
8、向上調整堆
9、交換兩個數
10、判斷堆是否已滿,如果滿了,就增容;如果沒有滿,就返回
11、銷毀堆
12、小於比較
13、大於比較
14、標頭檔案**
15、測試**
void createheap(heap *hp, hpdatatype* arr, int size, compare com)
//拷貝元素
memcpy (hp->_hp, arr, size*sizeof (hpdatatype));
hp->size = size;
hp->capacity = size;
hp->_com = com;
//調整成堆
cur = ((size-1-1)>>1); //size-1為最大下標,再減一除二為最後乙個節點的雙親節點
for (; cur>=0; cur--)
}
void adjustdown (heap* hp, int parent)//parent 為開始調整的節點
} if (hp->_com(hp->_hp[parent], hp->_hp[child]))
else
parent = child;
child = (parent<<1) + 1;
}}
void insertheap (heap* hp, hpdatatype data) //插入元素
//移除元素,(把堆頂元素和最後乙個元素交換,size--就把堆頂元素刪除了,最後在調整一下堆頂元素)
void removeheap (heap* hp)
int sizeheap (heap* hp) //返回堆元素個數
int isheapempty (heap* hp) //判斷是不是空堆,空堆返回1,非空返回0
hpdatatype heaptop (heap* hp) //返回堆頂元素
void adjustup (heap* hp, int child)
child = parent;
parent = (child - 1)/2;
}}
void swap (hpdatatype*p, hpdatatype* q)
void cheakheap (heap* hp) //判斷堆是否已滿,如果滿了,就增容;如果沒有滿,就返回
//如果堆已滿,增容
newcapacity = 2 * (hp->capacity)+3;
temp = (hpdatatype*)malloc (newcapacity * sizeof (hpdatatype)); //開闢新空間
if (temp == null)
//拷貝元素
for (; isize; ++i)
//釋放原空間
free (hp->_hp);
hp->_hp = null;
//讓原空間指向新開闢的空間
hp->_hp = temp;
hp->capacity = newcapacity;
}
void destroyheap (heap* hp)
//less 和 greater兩個函式用來比較兩個數的大小,在建堆時用函式指標的形式呼叫,用來分別建大堆小堆
int less (hpdatatype pleft, hpdatatype pright) //小於比較
else
}
int greater (hpdatatype pleft, hpdatatype pright) //大於比較
else
}
#ifndef __heap_h__
#define __heap_h__
#include #include #include #include //堆:是乙個陣列,其中的元素是按照二叉樹的順序在陣列中存放的
//任意乙個節點的資料都比其左右孩子都小---小堆
//任意乙個節點的資料都比它的左右孩子大---大堆
typedef int hpdatatype;
typedef int (*compare) (hpdatatype pleft, hpdatatype pright);
typedef struct heap
heap;
void createheap(heap *hp, hpdatatype* arr, int size, compare com); //建立堆
void adjustdown (heap* hp, int parent); //調整堆(向下調整)
void insertheap (heap* hp, hpdatatype data); //插入
void removeheap (heap* hp); //移除元素,(把堆頂元素和最後乙個元素交換,size--就把堆頂元素刪除了,最後在調整一下堆頂元素)
int sizeheap (heap* hp); //返回堆元素個數
int isheapempty (heap* hp); //判斷是不是空堆
hpdatatype heaptop (heap* hp); //返回堆頂元素
void adjustup (heap* hp, int child); //向上調整堆
void swap (hpdatatype* p, hpdatatype*q); //交換兩個數
void cheakheap (heap* hp); //判斷堆是否已滿,如果滿了,就增容;如果沒有滿,就返回
void destroyheap (heap* hp); //銷毀堆
int less (hpdatatype pleft, hpdatatype pright); //小於比較
int greater (hpdatatype pleft, hpdatatype pright); //大於比較
#endif
#include "heap.h"
void test_heap()
; heap hp;
createheap (&hp, arr, sizeof(arr)/sizeof(arr[0]), less);
//test_sizeemptytopheap
ret = sizeheap(&hp);
printf ("堆的大小為:%d\n", ret);
ret = isheapempty(&hp);
if (ret == 1)
else
top = heaptop(&hp);
printf ("堆頂元素是:%d\n", top);
//test_insertheap
insertheap(&hp, 5);
//test_removeheap
removeheap(&hp);
destroyheap (&hp);
}int main ()
C語言實現堆的基本操作
完整 本文用c語言實現了堆的基本操作,包括 建立堆 判斷堆滿 空 插入 刪除。雖然在c 的stl中已經分裝好了堆資料結構,但是在不少的場合會用到自己寫的堆。用c 更加方便 c 使用堆!堆分為最大堆和最小堆,本文對最大堆進行了說明,最小堆可模仿寫出。include include define max...
C語言資料結構堆的基本操作實現
目錄 void adjustdown datetype a,int n,int parent if a parent a child else 注意 if裡面的條件語句 child 1 void adjustup datetype a int child else 注意 while裡面的條件語句是不...
堆的基本操作
堆的基本概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 如下圖 分別為小堆和大堆 堆的操作具體 如下 測試環境 vs201...