北京名人故居观后感:帮忙调试一下程序~~~~谢谢,在线等待
需求分析
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;
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");
} //程序结束
char code[MAX];//这里加入这一句就可以了.
以下是完整内容:
#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");
} //程序结束
朋友,你上传的代码要让人看得懂,或者更容易看懂。
你就应该在你写的每一个子函数后加上功能注释。
自己定义的变量,别人是很难知道它是什么意思,什么作用。你应该把环境变量和控制变量分开来,并注明哪些是环境变量,哪些控制变量。最好写明它们的生存周期。
比如:
int swap(int a,int b)//a、b两个数相互交换
{
int temp;//环境变量,只在此函数中起作用。
temp=a;
a=b;
b=temp;
}
还有你所写的程序结构不清晰,看不出函数从哪里开始,又从哪里结束。
你的提问我暂时不作回答,先给你提点小建议。如果按要求做到的话,这个问题你自己应该可以处理的了。