2022年C语言哈夫曼编码、译码器 2.pdf
《2022年C语言哈夫曼编码、译码器 2.pdf》由会员分享,可在线阅读,更多相关《2022年C语言哈夫曼编码、译码器 2.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、#include #include #include #include #include /typedef int TElemType; const int UINT_MAX = 1000; typedef struct int weight; int parent, lchild, rchild; HTNode, *HuffmanTree; typedef char *HuffmanCode; /- 全局变量 - HuffmanTree HT; HuffmanCode HC; int *w, i, j, n; char *z; int flag = 0; int numb = 0; / -
2、求赫夫曼编码- int min(HuffmanTree t, int i) / 函数 void select() 调用int j, flag; int k = UINT_MAX; / 取 k 为不小于可能的值for (j = 1; j = i; j+) if (tj.weight s2) j = s1; s1 = s2; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - s2 = j; / - 算法 6.12- void Huf
3、fmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) / w 存放 n 个字符的权值 (均0),构造赫夫曼树HT,并求出 n 个字符的赫夫曼编码HC int m, i, s1, s2, start; /unsigned c,f; int c, f; HuffmanTree p; char *cd; if (n = 1) return ; /检测结点数是否可以构成树m = 2 * n - 1; HT = (HuffmanTree)malloc(m + 1) *sizeof(HTNode); / 0号单元未用for (p = HT
4、+ 1, i = 1; i weight = *w; p-parent = 0; p-lchild = 0; p-rchild = 0; for (; i parent = 0; for (i = n + 1; i = m; +i) / 建赫夫曼树 / 在 HT1i-1 中选择 parent 为 0 且 weight 最小的两个结点,其序号分别为s1 和 s2 select(HT, i - 1, s1, s2); HTs1.parent = HTs2.parent = i; HTi.lchild = s1; HTi.rchild = s2; HTi.weight = HTs1.weight +
5、 HTs2.weight; / 从叶子到根逆向求每个字符的赫夫曼编码HC = (HuffmanCode)malloc(n + 1) *sizeof(char*); / 分配 n 个字符编码的头指针向量(0不用 ) cd = (char*)malloc(n *sizeof(char); / 分配求编码的工作空间cdn - 1 = 0; / 编码结束符for (i = 1; i = n; i+) / 逐个字符求赫夫曼编码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页
6、 - - - - - - - - - start = n - 1; / 编码结束符位置for (c = i, f = HTi.parent; f != 0; c = f, f = HTf.parent) / 从叶子到根逆向求编码if (HTf.lchild = c) cd-start = 0; else cd-start = 1; HCi = (char*)malloc(n - start) *sizeof(char); / 为第 i 个字符编码分配空间strcpy(HCi, &cdstart); / 从 cd 复制编码 (串)到 HC free(cd); / 释放工作空间 /- 初始化赫夫曼
7、链表- void Initialization() flag = 1; int num; int num2; cout 下面初始化赫夫曼链表 endl num; n = num; w = (int*)malloc(n *sizeof(int); z = (char*)malloc(n *sizeof(char); cout n 请依次输入 n 个字符 (字符型 )n 注意:必须以回车结束: endl; char base2; for (i = 0; i n; i+) cout 第 i + 1 个字符 : endl; gets(base); *(z + i) = *base; for (i =
8、0; i = n - 1; i+) cout setw(6) *(z + i); cout n 请依次输入 n 个权值 (n 注意 :必须以回车结束): endl; for (i = 0; i = n - 1; i+) cout endl 第 i + 1 num2; *(w + i) = num2; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - HuffmanCoding(HT, HC, w, n); /-打印编码 - co
9、ut 字符对应的编码为: endl; for (i = 1; i = n; i+) /cout 字符 *(z+i-1)的编码 ; puts(HCi); /-将赫夫曼编码写入文件- cout 下面将赫夫曼编码写入文件 endl . endl; FILE *htmTree; char r = , 0 ; if (htmTree = fopen(htmTree.txt, w) = NULL) cout can not open file endl; return ; fputs(z, htmTree); for (i = 0; i n + 1; i+) fprintf(htmTree, %6d, *
10、(w + i); fputs(r, htmTree); for (i = 1; i = n; i+) fputs(HCi, htmTree); fputs(r, htmTree); fclose(htmTree); cout 已将字符与对应编码写入根目录下文件htmTree.txt 中 endl endl; /-获取报文并写入文件- void InputCode() /cout 请输入你想要编码的字符endl; FILE *tobetran; char str100; if (tobetran = fopen(tobetran.txt, w) = NULL) cout 不能打开文件 endl;
11、 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - return ; cout 请输入你想要编码的字符 endl; gets(str); fputs(str, tobetran); cout 获取报文成功 endl; fclose(tobetran); /-编码函数 - void Encoding() cout 下面对目录下文件tobetran.txt 中的字符进行编码 endl; FILE *tobetran, *codefi
12、le; if (tobetran = fopen(tobetran.txt, rb) = NULL) cout 不能打开文件 endl; if (codefile = fopen(codefile.txt, wb) = NULL) cout 不能打开文件 endl; char *tran; i = 99; tran = (char*)malloc(100 *sizeof(char); while (i = 99) if (fgets(tran, 100, tobetran) = NULL) cout 不能打开文件 endl; break; for (i = 0; *(tran + i) !=
13、0; i+) for (j = 0; j n) cout 字符错误,无法编码! endl; break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - cout 编码工作完成 endl 编码写入目录下的codefile.txt 中 endl endl; fclose(tobetran); fclose(codefile); free(tran); /- 译码函数 - void Decoding() cout 下面对根目录下文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C语言哈夫曼编码、译码器 2022 语言 哈夫曼 编码 译码器
限制150内