資源簡介
利用哈夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發送端通過一個編碼系統對待傳輸數據預先編碼,在接收端將傳來的數據進行譯碼(復原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統。試為這樣的信息收發站設計一個基于哈夫曼編碼的通信系統。
系統應具有以下功能:
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中文版第六版
評論
共有 條評論