這幾天學習了堆,優先順序佇列和霍夫曼壓縮演算法,準備自己動手實現一下。今天先實現了堆,以備後用的同時也加深了對堆的理解。**全部在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...