资源简介
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个基于哈夫曼编码的通信系统。
系统应具有以下功能:
1)初始化处理:建立通信系统
2)发送端信息编码
3)接受端信息译码
代码片段和文件信息
//代码由Micmia(qq:791713543)编写
#include
#include
#include
#include
#include
#include
#include
#define INFOVOL 100
#define TEMP_LIMIT 999
#define TEMPSTR_LIMIT 999
#define W_LIMIT 999
#define SN_LIMIT 100
#define ZH_INFO_LIMIT 999
#define INFOHC_LIMIT 999
#define INFO_LIMIT 999
#define SN_LIMIT 999
#define GREAT 999
#define TIME 500
typedef char *HuffmanCode;
typedef struct{
int weight;
int parentlchildrchild;
char *codechar;
HuffmanCode hc;
}HuffmanNode*HuffmanTree;
typedef struct{
char *zh_info;//中文信息
char *infochar;//信息字符
}Information;
Information infoset[INFOVOL];
//typedef char ** HuffmanCode;
int nl;//定义字符集大小即叶子节点个数n
int ms1s2;//定义哈夫曼树节点总数m
HuffmanTree ht;
//HuffmanCode hc;
void test(){
int i;
printf(“SN\tCODE\tWEIGHT\tPARENT\tLCHILD\tRCHILD\tHUFFMANCODE\n“);
for(i=0;i printf(“%d\t“i);
printf(“%s\t“ht[i].codechar);
printf(“%d\t“ht[i].weight);
printf(“%d\t“ht[i].parent);
printf(“%d\t“ht[i].lchild);
printf(“%d\t“ht[i].rchild);
// if(i if(i printf(“\n“);
}
}
void build(int _w[]char *_codechar){
int itcf;
char *tempstr;
void choose(HuffmanTree _htint _i);
m=2*n-1;
ht=(HuffmanTree)malloc(m*sizeof(HuffmanNode));
for(i=0;i ht[i].codechar=(char *)malloc(2*sizeof(char));
ht[i].weight=_w[i];
ht[i].parent=-1;
ht[i].lchild=0;
ht[i].rchild=0;
ht[i].codechar[0]=_codechar[i];
ht[i].codechar[1]=‘\0‘;
}
for(;i ht[i].codechar=(char *)malloc(2*sizeof(char));
ht[i].weight=0;
ht[i].parent=-1;
ht[i].lchild=0;
ht[i].rchild=0;
ht[i].codechar[0]=‘ ‘;
ht[i].codechar[1]=‘\0‘;
}
for(i=n;i choose(hti-1);//ht[0...i-1]中选择parent为-1且weight最小的两个节点,序号分别为s1和s2
ht[s1].parent=i;ht[s2].parent=i;
ht[i].lchild=s1;ht[i].rchild=s2;
ht[i].weight=ht[s1].weight+ht[s2].weight;
}
/* hc=(HuffmanCode)malloc(n*sizeof(char *));
tempstr=(char *)malloc(n*sizeof(char));
tempstr[n-1]=‘\0‘;
for(i=0;i t=n-1;//编码结束符位置
for(c=if=ht[i].parent;f!=-1;c=ff=ht[f].parent){
if(c==ht[f].lchild)tempstr[--t]=‘0‘;
else tempstr[--t]=‘1‘;
}
hc[i]=(char *)malloc((n-t)*sizeof(char));
strcpy(hc[i]&tempstr[t]);
}*/
//以下从叶子到根逆向求每个字符的哈夫曼编码
tempstr=(char *)malloc(n*sizeof(char));//分配求哈夫曼编码的工作空间,哈夫曼编码长度不会超过n
tempstr[n-1]=‘\0‘;
for(i=0;i t=n-1;//编码结束符位置
for(c=if=ht[i].parent;f!=-1;c=ff=ht[f].parent){//循环至根节点
if(c==ht[f].lchild)tempstr[--t]=‘0‘;//如果c(孩子节点)是f(父节点)的左孩子,则记0
else tempstr[--t]=‘1‘;//如果c(孩子节点)是f(父节点)的右孩子,则记1
}
ht[i].hc=(char *)malloc((n-t)*sizeof(char));
strcpy(ht[i].hc&tempstr[t]);
}
free(tempstr);
}
void count(char *_infocharchar *_codecharint _w[]){
int ij;
for(i=0;i for(j=0;j if(_infochar[i]==_codechar[j])_w[j]=_w[j]+1;//编码字符的对应权值加一
//printf(“\n“);for(i=0;i
- 上一篇:钱能c++程序设计教程修订版答案
- 下一篇:C++ Prime Plus中文版第六版
相关资源
- 数据结构大作业贪吃蛇和实验报告
- 医务室的模拟 c语言 数据结构
- 数据结构哈夫曼编码译码C语言版程序
- 基于数据结构c语言实现的银行叫号系
- 迷宫求解算法数据结构c语言
- C语言-哈夫曼编码实验报告
- 基于哈夫曼编码的文件压缩解压程序
- 数据结构——迷宫
- 循环队列c程序
- 史上最全经典数据结构算法c语言实现
- 老鼠走迷宫数据结构课程设计
- 哈夫曼编码译码器实验报告内
- 数据结构之迷宫求解完整代码(C语言
- 数据结构列车时刻表管理系统
- C语言:中缀算术表达式求值栈 附答案
- 数据结构算法与应用 c++语言描述(第
- (严蔚敏)数据结构视频教程C语言版
- C语言数据结构程序表达式求值 二叉树
- 中序遍历二叉排序树
- 先序后继线索二叉树
- 宿舍管理系统 数据结构课程设计 宿舍
- 数据结构课程设计----C语言航空订票系
- 一个红黑树实现c源码
- C++实现快速排序
- 一些常见的数据结构ADT定义及相关数
- 清华 严蔚敏 《数据结构》代码全部实
- Wolfe Powell 最优化方法 C++ 程序
- 最优二分搜索树动态规划
- Huffman 编码器与解码器-----数据结构课
- 教师工作量统计系统可改职工工作量
评论
共有 条评论