完整**
本文用c語言實現了堆的基本操作,包括:建立堆、判斷堆滿/空、插入、刪除。雖然在c++的stl中已經分裝好了堆資料結構,但是在不少的場合會用到自己寫的堆。
用c++更加方便:c++使用堆!
堆分為最大堆和最小堆,本文對最大堆進行了說明,最小堆可模仿寫出。
**:
#include
#include
#define maxdata int_max;
//定義最大值
typedef
int datatype;
typedef
struct heapstruct *maxheap;
struct heapstruct
;
//建立最大堆
maxheap creat
(int maxsize)
//判斷堆疊是否滿
intisfull
(maxheap h)
//判斷堆疊是否為空
intisempty
(maxheap h)
陣列中 i/2 的位置是父結點的位置,如果比父結點大,就向前移動
//插入元素
void
insert
(maxheap h,datatype item)
i=++h->size;
for(
;h->data[i/2]
) h->data[i]
=h->data[i/2]
; h->data[i]
=item;
}
//刪除最大值
//用最後乙個元素代替第乙個元素,然後調整為最大堆
datatype deletemax
(maxheap h)
maxitem=h->data[1]
;//用最大堆中的最後乙個元素,從根結點開始向下尋找合適的位置
temp=h->data[h->size--];
//最後乙個元素賦值給temp,然後大小-1
for(parent=
1;parent*
2<=h->size;parent=child)
//如果temp比兩個兒子結點都大,說明找到了合適位置
if(temp>=h->data[child]
)break
;else
//temp小於兒子結點中的最大值,那麼較大的兒子結點作為parent,返回繼續迴圈
h->data[parent]
=h->data[child];}
//找到合適位置
h->data[parent]
=temp;
return maxitem;
}
#include
#include
#define maxdata int_max;
typedef
int datatype;
typedef
struct heapstruct *maxheap;
struct heapstruct
;//建立最大堆
maxheap creat
(int maxsize)
//判斷堆疊是否滿
intisfull
(maxheap h)
//判斷堆疊是否為空
intisempty
(maxheap h)
//插入元素
void
insert
(maxheap h,datatype item)
i=++h->size;
for(
;h->data[i/2]
) h->data[i]
=h->data[i/2]
; h->data[i]
=item;
}//刪除最大值
//用最後乙個元素代替第乙個元素,然後調整為最大堆
datatype deletemax
(maxheap h)
maxitem=h->data[1]
;//用最大堆中的最後乙個元素,從根結點開始向下尋找合適的位置
temp=h->data[h->size--];
//最後乙個元素賦值給temp,然後大小-1
for(parent=
1;parent*
2<=h->size;parent=child)
//如果temp比兩個兒子結點都大,說明找到了合適位置
if(temp>=h->data[child]
)break
;else
//temp小於兒子結點中的最大值,那麼較大的兒子結點作為parent,返回繼續迴圈
h->data[parent]
=h->data[child];}
//找到合適位置
h->data[parent]
=temp;
return maxitem;
}int
main
(int argc,
char
*ar**)
printf
("\n");
printf
("刪除最大值:");
堆的 語言實現
這幾天學習了堆,優先順序佇列和霍夫曼壓縮演算法,準備自己動手實現一下。今天先實現了堆,以備後用的同時也加深了對堆的理解。全部在codeblocks下測試通過。標頭檔案 ifndef data struct h define data struct h define array offset a,si...
C語言 堆的基本操作
堆的基本操作 1 建立堆 2 調整堆 向下調整 3 插入 4 移除堆頂元素 5 返回堆元素個數 6 判斷是不是空堆 7 返回堆頂元素 8 向上調整堆 9 交換兩個數 10 判斷堆是否已滿,如果滿了,就增容 如果沒有滿,就返回 11 銷毀堆 12 小於比較 13 大於比較 14 標頭檔案 15 測試 ...
C語言實現鍊錶基本操作
之前說過順序表的基本操作。顯然,順序表有乙個很大的缺點,就是做插入刪除操作的時候,往往要做很大量的元素移動的操作。這裡我們討論另外一種線性表的表示方法 鏈式儲存結構。由於它不需要邏輯上的相鄰的元素在物理位置上也相鄰,因此它沒有順序儲存結構所具有的弱點,但是同時也失去了順序表的可隨機訪問的有點。inc...