C語言 深入解讀資料結構之堆的實現

2022-09-21 21:51:15 字數 1780 閱讀 3772

概念:如果有乙個關鍵碼的集合k=,把它的所有元素按完全二叉樹的順序儲存方式儲存 在乙個一維陣列中,並滿足k i<=k 2*i+1且ki<=k 2程式設計客棧*i+2(k i>=k 2*i+1且ki>=k 2*i+2) i = 0,1,2...,則稱為小堆(或大堆)。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

1.大堆

2.小堆

堆的介面:

#pragma once

#include

#include

#include

#include

typedef int hpdatatype;

typedef struct heap

hp;

//堆的建立www.cppcns.com

void heapinit(hp*hp);

//堆的銷毀

void heapdestroy(hp*hp);

//交換數值

void swap(hpdatatype *px, hpdatatype *py);

//向上調整

void adjustup(int *a,int child);

//向下調整

void adjustdown(int *a, int n, int parent);

//堆的插入

void heappush(hp*hp,hpdatatype x);

//堆的刪除

void heappop(hp*hp);

//取堆頂的資料

hpdatatype heaptop(hp*hp);

//列印堆

void heapprint(hp*hp);

//堆的判空

bool heapempty(hp*hp);

//堆的資料個數

int heapsize(hp*hp);

堆的建立:

void heapinit(hp*hp)

堆的銷毀:

void heapdestroy(hp*hp)

交換數值:

void swap(hpdatatype*px, hpdatatype*py)

向上調整:

void adjustup(int*a, int child)

else}}

堆得插入:

void heappush(hp*hp,hpdatatype x)

hp->a=tmp;

hp->capacity=newcapacity;

}hp->a[hp->size-1]=x;

hp->size++;

//向上調整

adjusiup(hp->a,hp->size-1);

}向下調整:

void adjustdown(int *a,int n,int parent)

if(a[child]>a[parent])

else}}

堆的判空:

bool heapempty(hp*hp)

堆的刪除:

void heappop(hp*hp)

取堆頂的資料:

hpdatatype heaptop(hp*hp)

列印堆:

void heapprint(hp*hp)

printf("\n");

}堆的資料個數:

int heapsize(hp*hp)

以上就是對堆的講解與操作實現。

感謝老鐵看到這裡,如果文章對你有用的話請給我乙個贊支援一下,感激不盡!

在下才疏學淺,一點淺薄之見,歡迎各位大佬指點。

深入解讀Khash h之資料結構

閱讀此文前,推薦先看klib之khash學習筆記 c語言標準庫並沒有字典 map 和集合 set 這種資料結構,因此如果想需要在c語言使用這種資料結構,要麼自己根據不同資料型別都寫一種函式,或者就是用別人寫好的資料結構來用。khash.h提供了一種基於開放定址法的泛型的雜湊表,這裡的開放定址法是一種...

讀資料結構(C語言版)

資料 資料是對現實世界物質的符號表示,在計算機中的意思是能輸入到計算機中進行計算處理的符號為資料 實現是客觀世界在計算機中的表示方式,是程式加工的原材料。資料可以是聲音,文件 資料元素 組成資料的基本構成單位,通常以結構化的形式出現,比如一本書的書目資訊,包含作者,書名,出版刊號,出版社這些資料項,...

讀《資料結構(C語言版)》(4)

從本節開始討論線性表,這次先討論線性表的順序實現。一提到線性表,我們腦子很可能會出現陣列 鍊錶這樣的概念。沒錯,陣列和鍊錶都是線性表,但它們只是線性表的兩種實現,強調的是線性表的物理結構。我們研究乙個資料結構時,一般先從它的邏輯結構入手,等研究清楚了邏輯結構再考慮具體的物理實現。在寫程式時,思路也是...