c語言實現最大堆的基本功能

2021-08-26 09:26:54 字數 1778 閱讀 7595

最大堆的宣告:

typedef structheap,*maxheap;
注意:(1).用乙個陣列存放最大堆,用int *data宣告陣列

(2).size表示當前容量,capacity表示最大容量

最大堆的建立:

maxheap create(int maxsize)
注意:(1).data陣列是用指標宣告的,所以需要分配記憶體空間,因為還要有乙個哨兵,所以(maxsize+1)*sizeof(int)就是總位元組數,最後轉換為int *

(2).一開始沒資料,size為0,哨兵不算,哨兵存放在索引為0的位置

最大堆的插入:

void insert(maxheap h,int x)

i=++h->size;

for(;h->data[i/2]data[i]=h->data[i/2];

} h->data[i]=x;

}

注意:(1).i=++h->size是先加再用值(++i),i++是先用值再加

(2).for迴圈退出來的條件是h->data[0]>x,因為哨兵是乙個很大的數

(3).如果i/2的數比i小,就把小的放在下面,大的先不用放(因為大的位置要一直比較才能確定,用i表示大的數暫時的位置(i/=2)),最後確定好即是迴圈跳出之時(h->data[i]=x)

最大堆的刪除:

int delete(maxheap h)

int temp=h->data[h->size--];

int max=h->data[1];

for(parent=1;parent*2<=h->size;parent=child)

if(temp>=h->data[child])else

} h->data[parent]=temp;

return max;

}

注意:(1).刪除首先把最頂部的元素挪走,然後假設把最後乙個元素放上去(這樣就保留了完全二叉樹的結構),然後再調整每乙個元素的位置

(2).parent是最後乙個元素的暫時位置,首先迴圈的條件是有兒子,才可以進行調動(parent*2<=h->size),然後取其兒子中最大的乙個(有右兒子的前提是child!=h->size),然後temp比兒子們都大,證明parent假設temp的位置是正確的,如果比兒子們小,就把兒子放上去,自己暫時不能放,因為位置還不確定,然後parent=child表示修改temp暫時的位置,最後迴圈跳出的條件是沒有兒子,此時再確定temp位置才是準確的

最大堆的調整:

void percdown(maxheap h,int i)

if(x>=h->data[child])else

} h->data[parent]=x;

}void buildheap(maxheap h)

}

注意:(1).怎麼把散亂的完全二叉樹調整成最大堆呢?首先要從最後乙個元素的父節點開始調整,依次i--進行調整,第乙個元素也要調整(所以i>0)

(2).怎麼調整呢?首先x是父元素(即索引為i的元素),如果父元素比兒子們大,就不用調整,如果兒子們大,就把大的兒子放上去,自己暫時不能放下去(因為位置還不確定,要一直比較),parent表示父元素暫時的位置,直到父元素比兒子們大或者父元素沒有兒子,就跳出迴圈,此時位置也確定了,就把往該位置插入元素

c語言實現鏈佇列的基本功能

鏈佇列,實際上是乙個帶有頭指標和尾指標的單鏈表,頭指標指向頭節點 不存放資料 尾指標指向隊尾節點,雖然用頭指標可以確定乙個單鏈表,但是插入操作是在隊尾進行,如果沒有尾指標,會變得複雜 初始化 void init pqueue pq 注意 1 為頭指標和尾指標申請記憶體 入隊 void enqueue...

C語言實現鏈式佇列的基本功能

rear指向隊尾部元素,front指向隊頭元素的前乙個 鏈式佇列相當與鍊錶很相似,有著頭指標和頭節點,傳引數也都是傳的指標,但是不同的是這裡的指標是結構體指標,可以看成二級指標 所以在列印等函式中需要有個中間變數,否則會改變front和rear的指向 include include struct b...

C語言實現順序佇列的基本功能

front指向佇列的隊頭元素,rear指向隊尾元素的下乙個。因為鏈式佇列有頭節點,順序佇列沒得頭節點 為了判斷是否未滿,最後乙個空間不放元素 include include define max 100 struct book typedef struct node sqqueue intis em...