堆的 語言實現

2021-09-19 09:26:28 字數 2493 閱讀 9719

這幾天學習了堆,優先順序佇列和霍夫曼壓縮演算法,準備自己動手實現一下。今天先實現了堆,以備後用的同時也加深了對堆的理解。**全部在codeblocks下測試通過。

標頭檔案:

#ifndef _data_struct_h

#define _data_struct_h

#define array_offset(a,size,offset) ((a) + (size)*(offset))

#define heap_big 0

#define heap_small 1

typedef struct _heap_node

heap_node;

typedef struct _heap

heap;

#define heap_enlarge_node_num 20

#define heap_node_i(h,i) (array_offset(h->array,h->node_size,i))

#define heap_node_parent(h,i) heap_node_i(h,(i-1)/2)

#define heap_root(h) heap_node_i(h,0)

#define heap_last(h) heap_node_i(h,h->node_num-1)

#define heap_node_pri(node) (((heap_node *)node)->pri)

#define heap_max_node_index(h) (h->node_num - 1)

#define heap_node_valid(h,i) (i < h->node_num)

#define heap_parent_node_index(i) ((i-1)/2)

heap* heap_init(int type,int node_size,int init_node_num);

void heap_print(heap *h);

void heap_insert(heap *h,void *node);

int heap_get(heap *h,void *node);

#endif

堆實現**:

#include #include #include #include #include #include "define.h"

#include "data_struct.h"

void heap_print(heap *h)

}printf("\n");

}int heap_node_pri(heap *h,int node_i)

static int heap_node_comp(heap *h,int na,int nb)

else

return pri_na < pri_nb ? na:nb;

}heap* heap_init(int type,int node_size,int init_node_num)

static void heap_enlarge(heap *h,int enlarge_node_num)

static bool heap_need_swap(int type,heap_node *node,heap_node *parent)

static void heap_swap(int node_size,void *node,void *parent)

static void heap_swap_i(heap *h,int node_i,int parent_i)

static bool heap_need_swap_i(heap *h,int node_i,int parent_i)

/* adjust heap according to priority */

static void heap_adjust_insert(heap *h)

else

break;

}return;

}void heap_insert(heap *h,void *node)

void heap_adjust_node(heap *h,int node_i)

return;

}int heap_get(heap *h,void *node)

else if(h->node_num ==1)

memcpy(node,root_node,h->node_size);

else if(h->node_num > 1)

h->node_num--;

if(h->node_num > 1)

heap_adjust_node(h,0);

return 0;

}

測試**:

typedef struct _test_heap_node

test_heap_node;

void heap_test(void)

return;

}

C語言實現堆的基本操作

完整 本文用c語言實現了堆的基本操作,包括 建立堆 判斷堆滿 空 插入 刪除。雖然在c 的stl中已經分裝好了堆資料結構,但是在不少的場合會用到自己寫的堆。用c 更加方便 c 使用堆!堆分為最大堆和最小堆,本文對最大堆進行了說明,最小堆可模仿寫出。include include define max...

c語言實現小根堆

小根堆的實現 邏輯模型是乙個完全二叉樹 儲存模型是給vector 索引下標從0開始 1 如果i 0,結點i是根結點,無父結點 否則結點i的父結點為結點 i 1 2 2 如果2i 1 n 1,則結點i無左子女 否則結點i的左子女為結點2i 1 3 如果2i 2 n 1,則結點i無右子女 否則結點i的右...

C語言實現串的堆分配儲存

heap string.h 串的堆分配儲存實現,用這種實現方法的好處是,能夠動態的給 串分配記憶體空間,而順序串不能 created on 2011 9 7 author root define elemtype char define true 1 define false 0 typedef s...