1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VALUE 1
typedef char** huffman_code;
typedef struct {
double weight;
int parent, lchild, rchild;
} HTNode, *huffman_tree;
typedef struct {
int s1;
int s2;
} min_code;
huffman_code Huffman_coding(huffman_tree HT, huffman_code HC, double *x, int n);
min_code select_min(huffman_tree HT, int n);
int main() {
huffman_tree HT = NULL;
huffman_code HC = NULL;
int i, n;
printf("请输入信源符号个数:");
scanf("%d", &n);
double *x = malloc((n+1) * sizeof(double));
x[0] = 0;
printf("请输入各符号的概率:");
for (i = 1; i <= n; i++) {
printf("X[%d]= ", i);
scanf("%lf", &x[i]);
}
HC = Huffman_coding(HT, HC, x, n);
printf("\nhuffman_code:\n");
printf("Number Weight Code\n");
for (i = 1; i <= n; i++) printf("%-6d %-6lf %-4s\n", i, x[i], HC[i]);
}
huffman_code Huffman_coding(huffman_tree HT, huffman_code HC, double *x, int n) {
int i, s1 = 0, s2 = 0;
char *code;
int f, c, start, m;
huffman_tree p;
min_code min;
if (n <= 1) return;
m = 2*n - 1;
HT = malloc((m+1) * sizeof(HTNode));
for (p = HT, i = 0; i <= n; i++, p++, x++) {
p->weight = *x;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (; i <= m; i++, p++) {
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (i = n+1; i <= m; i++) {
min = select_min(HT, i-1);
s1 = min.s1;
s2 = min.s2;
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
printf("HT List:\n");
printf("%8s %8s %8s %8s %8s\n", "Number", "weight", "parent", "lchild", "rchild");
for (i = 1; i <= m; i++) {
printf("%8d %8lf %8d %8d %8d\n",
i, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild);
}
HC = malloc((n+1) * sizeof(char *));
code = malloc(n * sizeof(char *));
code[n-1] = '\0';
for (i = 1; i <= n; i++) {
start = n-1;
for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent) {
if (HT[f].lchild == c) code[--start] = '0';
else code[--start] = '1';
}
HC[i] = malloc((n-start) * sizeof(char *));
strcpy(HC[i], &code[start]);
}
free(code);
return HC;
}
min_code select_min(huffman_tree HT, int n) {
min_code code;
int s1, s2;
double m1, m2;
int i;
s1 = s2 = 1;
m1 = m2 = MAX_VALUE;
for (i = 1; i <= n; i++) {
if (HT[i].parent == 0) {
if (HT[i].weight < m1) {
m2 = m1;
s2 = s1;
m1 = HT[i].weight;
s1 = i;
} else if (HT[i]. weight < m2) {
m2 = HT[i].weight;
s2 = i;
}
}
}
code.s1 = s1;
code.s2 = s2;
return code;
}
|