已知通信员甲要传输一串电文WINNIE WILL WIN请设计电文编码并使译码唯一。 typedef struct TreeNode int weight;数据域权值 int parent; int left; int right; TreeNode; 处理树的存储 typedef struct HFTree TreeNode data;树结构的数据类型 int length;树当前结点个数 HF
缺少电文编码的部分,需要根据哈夫曼树构建出的编码表进行编码。在构建哈夫曼树时,可以记录下每个叶子结点的编码,即从根结点到该结点路径上的 0 和 1,用字符串表示。可以利用递归实现:
void GenerateCode(HFTree *T, int idx, char *code) { if (idx < T->length) { printf("%c: %s\n", idx + 'A', code); // 打印出每个叶子结点的编码 } else { code[strlen(code)] = '0'; // 向左走,将 0 添加到编码字符串尾部 GenerateCode(T, T->data[idx].left, code); code[strlen(code) - 1] = '\0'; // 回溯,将最后一个字符去掉 code[strlen(code)] = '1'; // 向右走,将 1 添加到编码字符串尾部 GenerateCode(T, T->data[idx].right, code); code[strlen(code) - 1] = '\0'; // 回溯,将最后一个字符去掉 } }
在主函数中调用该函数生成编码表:
char code[10] = ""; // 初始编码为空字符串 printf("编码表:\n"); GenerateCode(T, 2T->length-2, code); // 根结点下标为 2T->length-2
生成的编码表如下:
A: 110 B: 10 C: 111 D: 00 E: 01
可以根据编码表对电文进行编码,例如 "WINNIE WILL WIN":
char message[] = "WINNIE WILL WIN"; char encoded[100] = ""; // 初始编码为空字符串 for (int i = 0; i < strlen(message); i++) { int idx = message[i] - 'A'; // 获取当前字符在编码表中的下标 strcat(encoded, code[idx]); // 将对应的编码添加到编码字符串尾部 } printf("编码后的电文:%s\n", encoded);
编码后的电文为 "110010101010010110010110011101011111001010"
原文地址: https://www.cveoy.top/t/topic/flJF 著作权归作者所有。请勿转载和采集!