實現可以控制大堆小堆的程式

2021-09-23 15:27:30 字數 3820 閱讀 3631

使用函式指標做函式引數,讓使用者把想要判斷大小的函式傳進 函式裡面

函式指標

函式指標做函式引數

標頭檔案

#pragma once

#include

#include

#include

typedef

int hpdatatype;

//寫乙個函式指標,用來與使用者互動

typedef

int(

*pcom)

(hpdatatype, hpdatatype)

;int

less

(hpdatatype left, hpdatatype right)

;int

greater

(hpdatatype left, hpdatatype right)

;typedef

struct heap

heap;

//擴容函式

void

checkcapacity

(heap* hp)

;//交換函式

void

swap

(hpdatatype* left, hpdatatype* right)

;//向下排序

void

adjustdown

(hpdatatype* array,

int size,

int parent)

;//向上排序

void

adjustup

(hpdatatype* array,

int size,

int child)

;// 用陣列初始化堆

void

initheap

(heap* hp, hpdatatype* array,

int size)

;// 初始化乙個空堆

void

initemptyheap

(heap* hp,

int capacity)

;// 在堆中插入值為data的元素

void

insertheap

(heap* hp, hpdatatype data)

;// 刪除堆頂元素

void

eraseheap

(heap* hp)

;// 獲取堆中有效元素個數

intheapsize

(heap* hp)

;// 檢測堆是否為空堆

intheapempty

(heap* hp)

;// 獲取堆頂元素

hpdatatype heaptop

(heap* hp)

;// 銷毀堆

void

destroyheap

(heap* hp)

;

實現**

#include

"bs.h"

intless

(hpdatatype left, hpdatatype right)

intgreater

(hpdatatype left, hpdatatype right)

//交換函式

void

swap

(hpdatatype* left, hpdatatype* right)

//向下排序

void

adjustdown

(hpdatatype* array,

int size,

int parent,pcom compare)

//用最小的孩子和根節點進行比較,如果小於根節點,交換兩個節點if(

compare

(array[child]

, array[parent]))

else}}

//向上排序

void

adjustup

(hpdatatype* array,

int size,

int child,pcom compare)

else}}

//擴容函式

void

checkcapacity

(heap* hp)

//把舊堆元素,轉移到新堆

for(

int i =

0; i < hp->_size;

++i)

//釋放舊堆

free

(hp->_array)

;//指標指向新堆

hp->_array = newarray;

//改變堆的容量

hp->_capacity = newcapacity;}}

// 用陣列初始化堆

void

initheap

(heap* hp, hpdatatype* array,

int size,pcom compare)

//把陣列中的元素,全部轉移到堆的陣列中

hp->_capacity = size;

for(

int i =

0; i < size;

++i)

hp->_size = size;

hp->compare = compare;

//對這個陣列進行調整,使其成為乙個堆

int root =

((size -2)

>>1)

;for

(; root >=0;

--root)

}// 初始化乙個空堆

void

initemptyheap

(heap* hp,

int capacity,pcom compare)

hp->_size =0;

hp->_capacity = capacity;

hp->compare = compare;

}// 在堆中插入值為data的元素

void

insertheap

(heap* hp, hpdatatype data)

// 刪除堆頂元素

void

eraseheap

(heap* hp)

// 獲取堆中有效元素個數

intheapsize

(heap* hp)

// 檢測堆是否為空堆

intheapempty

(heap* hp)

// 獲取堆頂元素

hpdatatype heaptop

(heap* hp)

// 銷毀堆

void

destroyheap

(heap* hp)

free

(hp->_array)

; hp->_array =

null

; hp->_size =0;

hp->_capacity =0;

}

測試**

#include

"bs.h"

#include

intmain()

;initheap

(&hp, arr,

10,less)

;printf

("%d\n"

,heapsize

(&hp));

printf

("%d\n"

,heaptop

(&hp));

system

("pause");

return0;

}

大堆和小堆的實現

堆的概念 如果有乙個關鍵碼的集合,將這個集合中的所有元素按照完全二叉樹的順序儲存在乙個一維陣列中,並滿足最小堆或最大堆的性質。最小堆 任一結點的關鍵碼均小於等於它的左右孩子的關鍵碼,其中堆頂的元素最小。任一路徑中的元素降序排列 最大堆 任一結點的關鍵碼均大於等於它的左右孩子的關鍵碼,其中堆頂的元素最...

最大堆最小堆陣列實現

假設堆中節點從下標0開始,那麼從最後乙個非葉子節點開始,從右向左,從下向上調整堆,每次比較父節點和他的左右兩個子節點,若大於他們,則和較小的子節點交換。實現 public class test i child 建立堆 public static void heap intnum,int len pu...

最小堆 最大堆的實現 c

最小堆 templateclass minheap int size const t min minheap insert const t x minheap deletemin t x void initialize t a,int size,int arraysize void deactiva...