北京名人故居观后感:帮忙调试一下程序~~~~谢谢,在线等待

来源:百度文库 编辑:中科新闻网 时间:2024/04/28 12:19:00
下面的程序中有3个错误~~~~帮忙修改一下,
需求分析
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;
}
还有你所写的程序结构不清晰,看不出函数从哪里开始,又从哪里结束。
你的提问我暂时不作回答,先给你提点小建议。如果按要求做到的话,这个问题你自己应该可以处理的了。