1、s2) 找出每次最小的两个权值最小的权值。Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)构造赫夫曼树并构造每个字母的赫夫曼编码。void PrintHT(HuffmanTree HT, int n)输出赫夫曼树的存储结构。3. 详细设计 int min(HuffmanTree HT, int i)int j, flag = 1; unsigned int k = 10000; for(j = 1; j = i; j+) if(HTj.weight s2) j = s1; s1 = s2; s2 = j;
2、 int s1, s2, i, start, f; char *cd; HuffmanTree p = NULL;/p是工作指针,指向赫夫曼树中的结点 if(n 待构造的赫夫曼树共有2 %d - 1 = %d个结点n, n, m); if(!(HT = (HuffmanTree)malloc(m + 1) * sizeof(HTNode)/申请赫夫曼树结点占用的内存空间,0号单元不用 exit(OVERFLOW);赫夫曼树共分配了%d个结点空间,其中包含一个不用的0号单元n, m + 1); /printf(初始化所有叶子节点的权值,父亲和孩子:n); for(p = HT + 1, i =
3、1; i weight = *w;parent = 0;/双亲初始值为0,表示此结点还没有被选择最小的算法选择过lchild = 0;/左右孩子初始化为0,表示空rchild = 0; for(;= m; i+, p+)weight = 0; for(i = n + 1; +i) Select(HT, i - 1, s1, s2); HTs1.parent = i;/选出的两个权值最小的结点的双亲就是即将生成的结点 HTs2.parent = i; HTi.lchild = s1;/即将生成的结点左孩子是s1,右孩子是s2, HTi.rchild = s2;/因为s1比s2先选,因此s1总是小
4、于等于s2 HTi.weight = HTs1.weight + HTs2.weight;/即将生成结点的权值就是两个权值最小的结点的权值之和(HC = (HuffmanCode)malloc(n + 1) * sizeof(char *)(cd = (char *)malloc(n * sizeof(char) cdn-1 = 0; for(int i = 1; start = n - 1; for(int c = i, f = HTi.parent; f != 0; c = f, f = HTf.parent) if(HTf.lchild = c) cd-start = 0 else /叶
5、子结点根结点的右孩子1 /else(HCi = (char *)malloc(n - start) * sizeof(char) strcpy(HCi, &cdstart);叶子节点%d的赫夫曼编码为:%sn, i, HCi); free(cd); return OK;/HuffmanCodingn+-+n| 赫夫曼树HT的存储结构 |n+-+-+-+-+-+n| 结点编号 | weight | parent | leftchild | rightchild |n i+)| %4d | %4d | %4d | %4d | %4d |n, i, HTi.weight, HTi.parent, H
6、Ti.lchild, HTi.rchild);for(int i = 0; len; if(stri = A) a65+; else if(stri = B a66+;C a67+;D a68+;E a69+;F a70+;else if(stri = G a71+;H a72+;I a73+;J a74+;K a75+;L a76+;M a77+;N a78+/部分统计字母代码主程序首先随机输入一篇英文文章,再统计各字母个数,再调用HuffmanCoding(HT, HC, w, n)函数,此函数又会调用void Select(HuffmanTree HT, int i, int &s2)函
7、数,而此函数又会调用int min(HuffmanTree HT, int i)函数,构造完成后便调用PrintHT(HT,n)函数输出赫夫曼树的存储结构。 调用输入界面:输出界面:4. 调试分析 (a)调试过程中未设计多种不合理输入的对应输出结果,后加上。(b)算法的时间复杂度为O(n3), Status HuffmanCoding(HuffmanTree &HC, int *w, int n)函数中的一重for循环调用了select函数,而select函数又调用了min函数,故共有三重for循环,故时间复杂度为O(n3)。(c) 经过这次课程设计,让我受益匪浅,使我掌握了二叉树的的存储结构
8、和赫夫曼编码的基本思想。程序中有多处运用了三重循环,这里很多地方能够优化以达到减小时间和空间复杂度。在此次课程设计的最大收获就是让我明白一个道理:无论你做的是多么小的一个程序或软件,都要使用模块化设计,这样使程序实现的功能更清晰明了。5. 用户使用说明 直接输入一篇英文文章即可。6. 测试结果 a. 正确输入:ThereisnodoubtthatInternethaschangedourlifegreatlyItmakestheworldsmallerPeoplecangettoknowtheworldinashorttimeandmakefriendsfromallovertheworldW
9、hileontheotherhandthemuchattentionontheInternetisolatesthedistanceandreducesfacetofacecommunicationManyyearsagobeforethepopularityofcomputerpeoplegottoknowtheworldbylisteningtotheradioorreadingnewspaperButnowadayspeoplecanjustreadtheinstantnewsontheInternetandgetthefirsthandinformationimmediatelyThe
10、fastwaytomasterinformationmakesthemfeelkeepingintouchwiththeworldTheworldseemssoneartothem 结果:b错误的输入7. 测试情况: 测试情况如设计的一致,首先输出各字母及在文章出现的次数,再输出各字母的赫夫曼编码,最后输出ASCLL码与赫夫曼编码的差异。附程序源代码:#include stdlib.hstring.h#define OVERFLOW -2#define OK 1#define ERROR 0typedef int Status; /动态分配数组存储赫夫曼树 /动态分配数组存储赫夫曼编码表 in
11、t j, flag = 1;int main() HuffmanTree HT; HuffmanCode HC; int *w; char str10005; int a150,b60; memset(a,0,sizeof(int)*150);请随机输入英文文章: scanf(%s,str); int len = strlen(str); for(int i = 0; a78+;O a79+;P a80+;Q a81+;R a82+;S a83+;T a84+;U a85+;V a86+;W a87+;X a88+;Y a89+;Z a90+;a a97+;b a98+;c a99+;d a100+;e a101+;f a102+;g a103+;h a104+;i a105+; else if(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1