数据结构哈夫曼树和代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#define N 50 //叶?子哩?结á点?数簓

#define M 2*N-1 //树骸?中D结á点?总哩?数簓

typedef struct

{

char data; //结á点?值μ

int weight; //权ü?重?

int parent; //双?亲×结á点?

int lchild; //左哩?孩¢子哩?结á点?

int rchild; //右 ?孩¢子哩?结á点?

} HTNode;

typedef struct

{

char cd[N]; //存?放?哈t夫え?曼û码?

int start;

} HCode;

HTNode ht[M];

HCode hcd[N];

int n;

void CreateHT(HTNode ht[],int n)

{

int i,k,lnode,rnode;

int min1,min2;

for (i=0;i<2*n-1;i++) //所ù有瓺结á点?的?相à关?域 ?置?初?值μ0 ht[i].parent=ht[i].lchild=ht[i].rchild=0;

printf("哈t夫え?曼û树骸?初?态?为a:\n");

printf("data weight parent lchild rchild\n");

for (i=0;i<2*n-1;i++)

{

printf("%-6c %-6d %-6d %-6d %-6d\n",ht[i].data,ht[i].weight,ht[i].parent,ht[i].lchild, ht[i].rchild);

}

for (i=n;i<2*n-1;i++) //构1造ì哈t夫え?曼û树骸?

{

min1=min2=32767; //lnode和írnode为a最?小?权ü?重?的?两?个?结á点?位?置?

lnode=rnode=0;

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

if (ht[k].parent==0) //只?在ú尚 未′构1造ì二t叉?树骸?的?结á点?中D 查é找î

{

if (ht[k].weight

{

min2=min1;rnode=lnode;

min1=ht[k].weight;lnode=k;

}

else if (ht[k].weight

{

min2=ht[k].weight;rnode=k;

}

}

ht[lnode].parent=i;ht[rnode].parent=i;

ht[i].weight=ht[lnode].weight+ht[rnode].weight;

ht[i].lchild=lnode;ht[i].rchild=rnode;

}

printf("\n哈t夫え?曼û树骸?终?态?为a:\n");

printf("data weight parent lchild rchild\n");

for (i=0;i<2*n-1;i++)

{

printf("%-6c %-6d %-6d %-6d %-6d\n",ht[i].data,ht[i].weight,ht[i].parent,ht[i].lchild, ht[i].rchild);

}

printf("\n");

}

void CreateHCode(HTNode ht[],HCode hcd[],int n)

{

int i,f,c;

HCode hc;

for (i=0;i

{

hc.start=n;c=i;

f=ht[i].parent;

while (f!=0) //循-序î直±到?树骸?根ù结á点?

{

if (ht[f].lchild==c) //处鋦理え?左哩?结á点?

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

else//处鋦理え?右 ?结á点?

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

c=f;f=ht[f].parent;

}

hc.start++; //start指?向î哈t夫え?曼û编括?码?最?开a始?字?符?

hcd[i]=hc;

}

}

void DispHCode(HTNode ht[],HCode hcd[],int n) //输?出?哈t夫え?曼û编括?码?

{

int i,k;

int j;

printf("输?出?哈t夫え?曼û编括?码?:\n");

for (i=0;i

{

j=0;

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

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

{

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

j++;

}

printf("\n");

}

}

void funsr()

{

//字?符?串?

/*int i=0;

char str[100];

printf("请?输?入?字?符?串?:");

scanf("%s",str);

int n=0;

for (int j=0;str[j]!='\0';j++)

相关文档
最新文档