急!跪问这个程序主函数第二行:huffcode hcd[MAX],d; 是什么意思?请哪位高人指点,小弟不胜感激!
#include<stdio.h>#include<string.h>#defineMAX80typedefstruct{chardata;intweight;intpa...
#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");
} //程序结束 展开
#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");
} //程序结束 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询