C語言實現堆的基本操作

2021-10-23 16:16:02 字數 2861 閱讀 5530

完整**

本文用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...