Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a161e06

Browse files
committed
Heap: add heap source codes. such as leftist, binomial, fibonacci, skewheap and twoCha.
1 parent dc3fa81 commit a161e06

34 files changed

+7614
-0
lines changed

source/heap/binomial/c/binomial_heap.c

Lines changed: 477 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#ifndef _BINOMIAL_HEAP_H_
2+
#define _BINOMIAL_HEAP_H_
3+
4+
typedef int Type;
5+
6+
typedef struct _BinomialNode{
7+
Type key; // 关键字(键值)
8+
int degree; // 度数
9+
struct _BinomialNode *child; // 左孩子
10+
struct _BinomialNode *parent; // 父节点
11+
struct _BinomialNode *next; // 兄弟
12+
}BinomialNode, *BinomialHeap;
13+
14+
// 新建key对应的节点,并将其插入到二项堆中。
15+
BinomialNode* binomial_insert(BinomialHeap heap, Type key);
16+
// 删除节点:删除键值为key的节点,并返回删除节点后的二项树
17+
BinomialNode* binomial_delete(BinomialHeap heap, Type key);
18+
// 将二项堆heap的键值oldkey更新为newkey
19+
void binomial_update(BinomialHeap heap, Type oldkey, Type newkey);
20+
21+
// 合并二项堆:将h1, h2合并成一个堆,并返回合并后的堆
22+
BinomialNode* binomial_union(BinomialHeap h1, BinomialHeap h2) ;
23+
24+
// 查找:在二项堆中查找键值为key的节点
25+
BinomialNode* binomial_search(BinomialHeap heap, Type key);
26+
// 获取二项堆中的最小节点
27+
BinomialNode* binomial_minimum(BinomialHeap heap) ;
28+
// 移除最小节点,并返回移除节点后的二项堆
29+
BinomialNode* binomial_extract_minimum(BinomialHeap heap);
30+
31+
// 打印"二项堆"
32+
void binomial_print(BinomialHeap heap);
33+
34+
#endif

source/heap/binomial/c/main.c

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/**
2+
* C语言实现的二项堆
3+
*
4+
* @author skywang
5+
* @date 2014/04/01
6+
*/
7+
8+
#include <stdio.h>
9+
#include "binomial_heap.h"
10+
11+
#define DEBUG 1
12+
13+
#if DEBUG
14+
#define log(x, ...) printf(x, __VA_ARGS__)
15+
#else
16+
#define log(x, ...)
17+
#endif
18+
19+
#define LENGTH(a) ( (sizeof(a)) / (sizeof(a[0])) )
20+
21+
// 共7个 = 1+2+4
22+
int a[] = {12, 7, 25, 15, 28,
23+
33, 41};
24+
// 共13个 = 1+4+8
25+
int b[] = {18, 35, 20, 42, 9,
26+
31, 23, 6, 48, 11,
27+
24, 52, 13 };
28+
// 验证"二项堆的插入操作"
29+
void test_insert()
30+
{
31+
int i;
32+
int alen=LENGTH(a);
33+
BinomialHeap ha=NULL;
34+
35+
// 二项堆ha
36+
printf("== 二项堆(ha)中依次添加: ");
37+
for(i=0; i<alen; i++)
38+
{
39+
printf("%d ", a[i]);
40+
ha = binomial_insert(ha, a[i]);
41+
}
42+
printf("\n");
43+
// 打印二项堆ha
44+
printf("== 二项堆(ha)的详细信息: \n");
45+
binomial_print(ha);
46+
}
47+
48+
// 验证"二项堆的合并操作"
49+
void test_union()
50+
{
51+
int i;
52+
int alen=LENGTH(a);
53+
int blen=LENGTH(b);
54+
BinomialHeap ha,hb;
55+
56+
ha=hb=NULL;
57+
58+
// 二项堆ha
59+
printf("== 二项堆(ha)中依次添加: ");
60+
for(i=0; i<alen; i++)
61+
{
62+
printf("%d ", a[i]);
63+
ha = binomial_insert(ha, a[i]);
64+
}
65+
printf("\n");
66+
printf("== 二项堆(ha)的详细信息: \n");
67+
binomial_print(ha); // 打印二项堆ha
68+
69+
// 二项堆hb
70+
printf("== 二项堆(hb)中依次添加: ");
71+
for(i=0; i<blen; i++)
72+
{
73+
printf("%d ", b[i]);
74+
hb = binomial_insert(hb, b[i]);
75+
}
76+
printf("\n");
77+
printf("== 二项堆(hb)的详细信息: \n");
78+
binomial_print(hb); // 打印二项堆hb
79+
80+
// 将"二项堆hb"合并到"二项堆ha"中。
81+
ha = binomial_union(ha, hb);
82+
printf("== 合并ha和hb后的详细信息:\n");
83+
binomial_print(ha); // 打印二项堆ha的详细信息
84+
}
85+
86+
// 验证"二项堆的删除操作"
87+
void test_delete()
88+
{
89+
int i;
90+
int blen=LENGTH(b);
91+
BinomialHeap hb=NULL;
92+
93+
// 二项堆hb
94+
printf("== 二项堆(hb)中依次添加: ");
95+
for(i=0; i<blen; i++)
96+
{
97+
printf("%d ", b[i]);
98+
hb = binomial_insert(hb, b[i]);
99+
}
100+
printf("\n");
101+
printf("== 二项堆(hb)的详细信息: \n");
102+
binomial_print(hb); // 打印二项堆hb
103+
104+
// 删除二项堆hb中的节点
105+
i = 20;
106+
hb = binomial_delete(hb, i);
107+
printf("== 删除节点%d后的详细信息: \n", i);
108+
binomial_print(hb); // 打印二项堆hb
109+
}
110+
111+
// 验证"二项堆的更新(减少)操作"
112+
void test_decrease()
113+
{
114+
int i;
115+
int blen=LENGTH(b);
116+
BinomialHeap hb=NULL;
117+
118+
// 二项堆hb
119+
printf("== 二项堆(hb)中依次添加: ");
120+
for(i=0; i<blen; i++)
121+
{
122+
printf("%d ", b[i]);
123+
hb = binomial_insert(hb, b[i]);
124+
}
125+
printf("\n");
126+
printf("== 二项堆(hb)的详细信息: \n");
127+
binomial_print(hb); // 打印二项堆hb
128+
129+
// 将节点20更新为2
130+
binomial_update(hb, 20, 2);
131+
printf("== 更新节点20->2后的详细信息: \n");
132+
binomial_print(hb); // 打印二项堆hb
133+
}
134+
135+
// 验证"二项堆的更新(增加)操作"
136+
void test_increase()
137+
{
138+
int i;
139+
int blen=LENGTH(b);
140+
BinomialHeap hb=NULL;
141+
142+
// 二项堆hb
143+
printf("== 二项堆(hb)中依次添加: ");
144+
for(i=0; i<blen; i++)
145+
{
146+
printf("%d ", b[i]);
147+
hb = binomial_insert(hb, b[i]);
148+
}
149+
printf("\n");
150+
printf("== 二项堆(hb)的详细信息: \n");
151+
binomial_print(hb); // 打印二项堆hb
152+
153+
// 将节点6更新为20
154+
binomial_update(hb, 6, 60);
155+
printf("== 更新节点6->60后的详细信息: \n");
156+
binomial_print(hb); // 打印二项堆hb
157+
}
158+
159+
160+
void main()
161+
{
162+
// 1. 验证"二项堆的插入操作"
163+
test_insert();
164+
// 2. 验证"二项堆的合并操作"
165+
//test_union();
166+
// 3. 验证"二项堆的删除操作"
167+
//test_delete();
168+
// 4. 验证"二项堆的更新(减少)操作"
169+
//test_decrease();
170+
// 5. 验证"二项堆的更新(增加)操作"
171+
//test_increase();
172+
}

0 commit comments

Comments
 (0)