,完成电文编码的实现。

电文编码一般采用哈夫曼编码,即将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,以达到压缩数据的目的。

实现步骤:

  1. 构建哈夫曼树。

  2. 遍历哈夫曼树,生成编码。从根节点出发,若向左走,则编码为0,向右走,则编码为1,直到叶子节点,记录下该叶子节点对应的字符以及其编码。

代码实现:

//生成编码,从根节点遍历到叶子节点,记录下该叶子节点对应的字符以及其编码 void getCode(HFTree *T, int idx, char **code, char *tmp){ if(T->data[idx].left == -1 && T->data[idx].right == -1){//到达叶子节点 tmp[strlen(tmp)] = '\0';//加上字符串结束符 (*code)[idx] = (char )malloc(sizeof(char)(strlen(tmp)+1));//为该字符分配空间 strcpy((*code)[idx], tmp);//将编码赋值给该字符对应的编码 return; } tmp[strlen(tmp)] = '0'; getCode(T, T->data[idx].left, code, tmp);//向左走 tmp[strlen(tmp)-1] = '1'; getCode(T, T->data[idx].right, code, tmp);//向右走 tmp[strlen(tmp)-1] = '\0'; }

int main(){ int weight[] = {3,4,3,1,2}; char *charList = "WILNE";//字符列表 int charNum = strlen(charList);//字符数 //申明一个只具有树初始状态的模型 HFTree *T = InitTree(weight,5); //构建哈夫曼树 CreateTree(T); //生成编码 char **code = (char **)malloc(sizeof(char *)*charNum); for(int i=0;i<charNum;i++){ code[i] = NULL; } char *tmp = (char )malloc(sizeof(char)(charNum+1)); tmp[0] = '\0'; getCode(T, T->length-1, &code, tmp); //输出编码 printf("编码:\n"); for(int i=0;i<charNum;i++){ printf("%c: %s\n", charList[i], code[i]); } return 0;

已知通信员甲要传输一串电文WINNIE WILL WIN请设计电文编码并使译码唯一。 typedef struct TreeNode int weight;数据域权值 int parent; int left; int right; TreeNode; 处理树的存储 typedef struct HFTree TreeNode data;树结构的数据类型

原文地址: https://www.cveoy.top/t/topic/flG6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录