第1关:统计报文中各个字符出现的次数
任务描述
本关任务: 给定一串文本,统计其中各个字符出现的次数;
测试说明
平台会对你编写的代码进行测试:
测试输入:` abcdeabcdeabcdabcdabcdabcbccc
预期输出: a 6 b 7 c 9 d 5 e 2
代码:
//第一关
//(2)统计message所指一串报文中的所有不同字符及其出现次数
Precord computeChar(char *message)
{
//补充代码
//补充代码
int i;
Precord rcd=(Precord)malloc(sizeof(struct record));
//初始化rcd
rcd->m=0;
for (i=0;i<N;i++)
{
rcd->data[i].ww=0; //初始化各字符出现的次数为0
}
//统计
for (i=0;i<strlen(message);i++)
{
for (int j=0;j<=rcd->m;j++)
{
if (rcd->data[j].ww==0)
{
rcd->data[j].ww++;
rcd->data[j].ch=message[i];
rcd->m++;
break;
}
else if (rcd->data[j].ch==message[i])
{
rcd->data[j].ww++;
break;
}
}
}
return rcd;
}
第2关:对第一关报文中的各个字符进行哈夫曼编码
任务描述
本关任务:以第一关计算得到的各个字符的出现次数作为权值,构建哈夫曼树,并对各个字符进行哈夫曼编码。输入一串字符,输出各个字符及其出现的次数,该字符在哈夫曼树中是作为左分支还是右分支、该字符的哈夫曼编码。
输入
abcdeabcdeabcdabcdabcdabcbccc
输出
字符: a 出现次数:6 左or右:0 哈夫曼编码:00
字符: b 出现次数:7 左or右:1 哈夫曼编码:01
字符: c 出现次数:9 左or右:1 哈夫曼编码:11
字符: d 出现次数:5 左or右:1 哈夫曼编码:101
字符: e 出现次数:2 左or右:0 哈夫曼编码:100
代码:
//第二关
//(3)初始化哈夫曼树
PHtTree initHuffman(Precord r)
{
//补充代码
int i;
int n=2*(r->m)-1;
PHtTree ht = (PHtTree)malloc(sizeof(struct HtTree));
ht -> htable = (struct HtNode*)malloc(sizeof(struct HtNode)*n);
ht -> m = r -> m;
for(i=0; i<n; i++){
ht->htable[i].ww = ht->htable[i].parent = ht->htable[i].llink = ht->htable[i].rlink = -1;
}
for(i=0; i<r->m; i++){
ht -> htable[i].ww = r->data[i].ww;
}
return ht;
}
// 第二关
//(4)构造哈夫曼树。 根据报文中出现的各字符及其出现次数,构造哈夫曼树
//约定:构造过程中每次选的根结点值最小的子树作为左子树,根结点值次小的子树作为右子树
void createHuffman(PHtTree ht,Precord r)
{
//补充代码
int min1, min2, s1, s2;
int i, j;
int n=r->m;
for(i=0; i<n; i++){
min1=min2 = 255;
s1=s2= -1;
for(j=0; j<n+i; j++){
if(ht->htable[j].ww < min1 && ht->htable[j].parent == -1){
min2 = min1;
s2 = s1;
min1 = ht->htable[j].ww;
s1 = j;
}
else if(ht->htable[j].ww < min2 && ht->htable[j].parent == -1){
min2 = ht->htable[j].ww;
s2=j;
}
}
if(n+i != 2*n-1){
ht -> htable[s1].parent = n+i;
ht -> htable[s2].parent = n+i;
}
ht -> htable[n+i].ww = min1+min2;
ht -> htable[n+i].llink = s1;
ht -> htable[n+i].rlink = s2;
}
ht -> root = 2*n-2;
}
// 第二关
//(5)编码
void coding(PHtTree ht,Precord r)
{
//补充代码
int i,j;
int n=r->m;
int p, q;
char str[5];
for(i=0; i<n; i++){
p = i;
q = 0;
while(ht->htable[p].parent != -1){
if(ht->htable[ht->htable[p].parent].llink == p){
str[q] = '0';
q++;
}
else{
str[q] = '1';
q++;
}
p = ht->htable[p].parent;
}
str[q] = '\0';
if(ht->htable[ht->htable[i].parent].llink == i)
r->data[i].branch_code = '0';
else
r->data[i].branch_code = '1';
p=q-1;
for(j=0; j<q; j++){
r->data[i].codes[j]=str[p];
p--;
}
}
}
第3关:哈夫曼译码
任务描述
本关任务:对第二关的字符串所得到的二进制编码串进行译码,输出译码后的原文。
输入:
00011110110000011110110000011110100011110100011110100011101111111
输出:
abcdeabcdeabcdabcdabcdabcbccc
代码:
// 第三关
//(6)译码
void decoding(char *codes,char *codesToMessage,PHtTree ht,Precord r)
{
//补充代码
int i=0,j=0;
int p=0;
int n=r->m;
while(codes[j] != '\0'){
p=2*n-2;
while(ht->htable[p].llink != -1 && ht->htable[p].rlink != -1){
if(codes[j] == '0')
p = ht -> htable[p].llink;
else
p = ht -> htable[p].rlink;
j++;
}
codesToMessage[i] = r->data[p].ch;
i++;
}
codesToMessage[i] = '\0';
}
文章来源地址https://www.toymoban.com/news/detail-735817.html文章来源:https://www.toymoban.com/news/detail-735817.html
到了这里,关于数据结构与算法--哈夫曼树应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!