宿迁游艇驾驶员:C语言编程遇难?在线求救..............

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/30 05:18:13
有个小问题啊 ,运行顺利,但为何对01代码进行译码的时候老是出问题呢?问题是:比如你输入字符串ABCDEF译出01代码后,用01代码输入进行反编译的时候输出的就不是ABCDEF了 只是输出了重复的一个字符AAAAAA或BBBBBB或... 在线等代你的答复先谢了!

需求分析
1编制一个可进行传数据编码及接受数据译码的编/译系统
2用Huffman树给出Huffman编码
3测试数据
用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。
(以下是程序内容)

#include<stdio.h>
#include <string.h>
#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<m1)
{
m2=m1;
r=l;
m1=ht[k].weight;
l=k;
}
else if(ht[k].weight<m2)
{
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
这是字符和相对的频度表

好复杂

好复杂