c语言监控电脑是否在线,C语言编程遇到困难?在线求救..............

本文探讨了一位用户在C语言中使用Huffman编码进行数据编码和译码时遇到的问题。用户在尝试将字符串译回原始输入时,输出出现了错误,总是得到重复的字符。程序中包含了构建Huffman树、编码和解码的步骤,并给出了字符频度表。问题可能在于解码过程中从编码到字符的转换环节。
摘要由CSDN通过智能技术生成

C语言编程遇难?在线求救..............

悬赏分:30 - 离问题结束还有 14 天 19 小时

有个小问题啊 ,运行顺利,但为何对01代码进行译码的时候老是出问题呢?问题是:比如你输入字符串ABCDEF译出01代码后,用01代码输入进行反编译的时候输出的就不是ABCDEF了 只是输出了重复的一个字符AAAAAA或BBBBBB或... 在线等代你的答复先谢了!

需求分析

1编制一个可进行传数据编码及接受数据译码的编/译系统

2用Huffman树给出Huffman编码

3测试数据

用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。

(以下是程序内容)

#include

#include

#define MAX 80

typedef struct{

char data;

int weight;

int parent;

int left;

int right;

} huffnode;

typedef struct {

char cd[MAX];

int start;

}huffcode;

void main()

{

huffnode ht[2*MAX]; //定义变量

huffcode hcd[MAX],d;

char s[100];

char datacode[1000];

char *p;

int i,k,f,l,r,n,m,c,m1,m2,count,t,sum;

printf("元素个数: "); //输入结点信息

scanf("%d",&n);

m=2*n-1;

for(i=1;i<=n;i++)

{

getchar();

printf("第%d个元素 =>\t 结点值: ",i);

scanf("%c",&ht[i].data);

printf("\t 权重: ");

scanf("%d",&ht[i].weight);

}

for(i=1;i<=2*n-1;i++) //初始化

ht[i].parent=ht[i].left=ht[i].right=0;

for(i=n+1;i<=2*n-1;i++) // 构造Huffmantree

{

m1=998;m2=999; //选择权值最小的两个结点

l=r=0;

for (k=1;k<=i-1;k++)

if(ht[k].parent==0)

if(ht[k].weight

{

m2=m1;

r=l;

m1=ht[k].weight;

l=k;

}

else if(ht[k].weight

{

m2=ht[k].weight;

r=k;

}

ht[l].parent=i;

ht[r].parent=i;

ht[i].weight=ht[l].weight+ht[r].weight;

ht[i].left=l;

ht[i].right=r;

}

for (i=1;i<=n;i++) //根据HuffmanTree,进行编码

{

d.start=n+1;

c=i;

f=ht[i].parent; //逐个字符求编码

while(f!=0)

{

if(ht[f].left==c)

d.cd[--d.start]='0';

else

d.cd[--d.start]='1';

c=f;

f=ht[f].parent;

}

hcd[i]=d;

}

printf("输出哈夫曼编码 :\n");//输出字符的Huffman编码

for(i=1;i<=n;i++)

{

printf("%c : ",ht[i].data);

for(k=hcd[i].start;k<=n;k++)

printf("%c",hcd[i].cd[k]);

printf(" ");

}

printf("请输入:\n"); //对输入的字符串编码

scanf("%s",&s);

count=0;t=0;

char code[MAX];//这里加入这一句就可以了.

for(p=s;*p!='\0';p++)

{

for(i=1;i<=n;i++)

{

if(*p==ht[i].data)

{

for(k=hcd[i].start;k<=n;k++)

{ printf("%c",hcd[i].cd[k]);

code[++count]=hcd[i].cd[k];}

}

}

}

int g;

printf(" \n" );

printf("**********************************************\n" );

printf("输入编码:\n"); //对输入的编码进行译码

scanf("%d",&g);

sum=0;

while(count>sum)

{

f=m; //从根到叶子结点译码

while(f>n)

{

if(datacode[++sum]=='0')

f=ht[f].left;

else f=ht[f].right;

}

printf("%c",ht[f].data);

}

printf("\n");

printf("*******************************************\n");

} //程序结束 字符 A B C D E F G H

频度186 64 13 22 32 103 21 15 47

字符 I J K L M N O P Q

频度 57 1 5 32 20 57 63 15 1

字符 R S T U V W X Y Z

频度 48 51 80 23 8 18 1 16 1

这是给定的字符和相对应的频度表

不会的话不要在这里瞎掺糊~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值