第六周作业(利用哈夫曼编码字母表)
1 #include<iostream>
2 #include<string>
3 #include<malloc.h>
4 using namespace std;
5 typedef struct{
6 char charname;
7 double weight;
8 int parent, lchild, rchild;
9 }HTNode, *HuffmanTree;
10 typedef char **HuffmanCode;
11 int n;
12 char *a;
13 double *b;
14 void TestNum()
15 {
16 n = 27;
17 a = new char[27];
18 b = new double[n];
19
20 char *Code[27] = {"space", "e", "t", "a", "o", "i", "n", "s", "h",
21 "r", "d", "l", "c", "u", "m", "w", "f", "g",
22 "y", "p", "b", "v", "k", "j", "x", "q", "z"};
23
24
25 for (int i = 0; i < n; i++)
26 {
27 a[i] = *Code[i];
28 }
29
30
31 double WeightNum[27] = {18.3, 10.2, 7.7, 6.8, 5.9, 5.8, 5.5, 5.1, 4.9,
32 4.8, 3.5, 3.4, 2.6, 2.4, 2.1, 1.9, 1.8, 1.7, 1.6,
33 1.6, 1.3, 0.9, 0.6, 0.2, 0.2, 0.1, 0.1};
34
35
36 for(int i = 0; i < n; i++)
37 {
38 b[i] = WeightNum[i];
39 }
40
41 }
42 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *a,double *b,int n)
43 {
44 if(n<=1)
45 {
46 return;
47 }
48 int m = 2 * n - 1;
49 HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
50 int i;
51 for(i = 1; i <= n; ++i)
52 {
53 HT[i].charname = a[i-1];
54 HT[i].weight = b[i-1];
55 HT[i].parent = HT[i].lchild = HT[i].rchild = 0;
56 }
57 for(; i <= m; ++i)
58 {
59 HT[i].charname = '0';
60 HT[i].weight = 0;
61 HT[i].parent = HT[i].lchild=HT[i].rchild = 0;
62 }
63 for(i = n + 1; i <= m; ++i)
64 {
65 int s1 = 0;
66 int s2 = 0;
67 for(s1 = 1; HT[s1].parent != 0;)
68 {
69 s1++;
70 }
71
72 for (int j = s1; j <= i - 1; j++)
73 {
74 if(HT[j].parent != 0)
75 {
76 continue;
77 }
78 s1 = HT[j].weight<HT[s1].weight?j:s1;
79 }
80
81 HT[s1].parent = i;
82 HT[i].lchild = s1;
83
84 for(s2 = 1; HT[s2].parent != 0;)
85 {
86 s2++;
87 }
88
89 for (int j = s2; j <= i - 1; j++)
90 {
91 if(HT[j].parent != 0)
92 {
93 continue;
94 }
95 s2 = HT[j].weight<HT[s2].weight?j:s2;
96 }
97 HT[s2].parent = i;
98 HT[i].rchild = s2;
99 HT[i].weight = HT[s1].weight+HT[s2].weight;
100 }
101 HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
102 char *cd = (char*)malloc(n*sizeof(char));
103 cd[n-1] = '\0';
104 for (i = 1; i <= n; ++i)
105 {
106 int start = n-1, c, f;
107 for (c=i, f=HT[i].parent; f != 0; c = f, f = HT[f].parent)
108 {
109 if(HT[f].lchild==c)
110 {
111 cd[--start]='0';
112 }
113 else if(HT[f].rchild==c)
114 {
115 cd[--start]='1';
116 }
117 }
118 HC[i] = (char*)malloc((n-start) * sizeof(char));
119 f=n-start;
120 for(int d = 0; d < f; d++, start++)
121 {
122 HC[i][d]=cd[start];
123 }
124 }
125
126 }
127 void coutHC(HuffmanTree &HT,HuffmanCode &HC,int n, char* a)
128 {
129 for (int i = 1; i <= n; i++)
130 {
131
132 // cout<<"ok";
133 cout<<a[i]<<"的编码为:";
134
135 for(int d = 0; HC[i][d] != '\0'; d++)
136 {
137 cout<<HC[i][d];
138 }
139 cout<<endl;
140 }
141 }
142
143 void main()
144 {
145 HuffmanTree HT;
146 HuffmanCode HC;
147 TestNum();
148 HuffmanCoding(HT, HC, a, b, n);
149 coutHC(HT, HC, n, a);
150 }