构建哈夫曼树及输出哈夫曼代码及算法思想

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

哈夫曼树描述文档

一、思路

通过一个argv[]数组存储从test文件中读取字母,然后利用ascal 码循环计算每个字母的权值,利用weight[]是否为零,确定叶子节点,节点个数为count,传入到构建哈夫曼树的子程序中,然后利用cd[]数组存储每一个叶子节点的哈夫曼代码.输出代码时,通过与argv[]数组的比对,扫描ht数组,进而读出所有的数据。

二、截图

三、代码

#include

#include

#include

typedef struct

{

char data;

int weight;

int parent;

int lchild;

int rchild;

}HTNode;

typedef struct

{

char cd[50];

int start;

}HCode;

using namespace std;

int enter(char argv[])//进行读入操作

{

fstream in;

ofstream out;

char c;

int number=0;//字母个数置为0

in.open("test.txt",ios::in); //打开文件test.txt

out.open ("code.txt",ios::trunc); //打开文件code.txt,如果不存在就新建一个,如果存在就清空

if(!in.eof()) in>>c; //从test.txt中读取一个字符存入c

printf("原文本是:\n");

while(! in.eof()){ //文件不为空,循环读取一个字符

cout<

argv[number]=c;//存储c的值到数组

number++;

out<

in>>c; //从test.txt中读取一个字符存入c

}

argv[number]='\0';

printf("\n");

in.close; out.close; //使用完关闭文件

return(number);//返回叶子节点数目

}

void CreateHT(HTNode ht[],int n)

{

int i,j,k,lnode,rnode;

double min1,min2;

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

ht[i].parent=ht[i].lchild=ht[i].rchild=-1;//置初值

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

{

min1=min2=32167;

lnode=rnode=-1;

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

if(ht[k].parent==-1)

{

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[i].weight=ht[lnode].weight+ht[rnode].weight;

ht[i].lchild=lnode;ht[i].rchild=rnode;//双亲

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

}

}

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!=-1)

{

if(ht[f].lchild==c)

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

else

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

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

}

hc.start++;

hcd[i]=hc;

}

}

int main()

{

int enter(char argv[]);

void CreateHT(HTNode ht[],int n);//创建哈夫曼树

void CreateHcode(HTNode ht[],HCode hcd[],int n);//哈夫曼编码char argv[500];

int n,i,j,k;

char zimu='A';

n=enter(argv);

HTNode ht[100];//创建结点

HCode hcd[200];

int weicount[58];//频度计数

int count;

for(i=0;i<58;i++)//对58个字母求频度

{

count=0;

for(j=0;j

{

if(zimu==argv[j])

count++;

}

zimu++;//跳到第二个字母

weicount[i]=count;

}

zimu='A';

for(i=0;i<58;i++)

{

printf("The %c 's weight is: %d\n",zimu,weicount[i]);

zimu++;

}

zimu='A';

count=0;//计算叶子个数

for(i=0;i<56;i++)

{

if(weicount[i]!=0)

{

ht[count].data=zimu;

ht[count].weight=weicount[i];

count++;

}

zimu++;

}

CreateHT(ht,count);

CreateHcode(ht,hcd,count);

printf("\n");

printf("哈夫曼编码是:\n");

for(i=0;i

for(j=0;j

{

if(argv[i]==ht[j].data)

{

相关文档
最新文档