哈弗曼编码完整版Word文件下载.docx

上传人:b****3 文档编号:17600876 上传时间:2022-12-07 格式:DOCX 页数:21 大小:44.29KB
下载 相关 举报
哈弗曼编码完整版Word文件下载.docx_第1页
第1页 / 共21页
哈弗曼编码完整版Word文件下载.docx_第2页
第2页 / 共21页
哈弗曼编码完整版Word文件下载.docx_第3页
第3页 / 共21页
哈弗曼编码完整版Word文件下载.docx_第4页
第4页 / 共21页
哈弗曼编码完整版Word文件下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

哈弗曼编码完整版Word文件下载.docx

《哈弗曼编码完整版Word文件下载.docx》由会员分享,可在线阅读,更多相关《哈弗曼编码完整版Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。

哈弗曼编码完整版Word文件下载.docx

#defineMAXSIZE150

#defineMAXSIZE2500

intt,count,num;

uintw[MAXSIZE1];

charc[MAXSIZE1],data[MAXSIZE2];

typedefstruct

{

charch;

unsignedintweight;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;

typedefchar**HuffmanCode;

/*******************************************************************/

voidStart_Screen()

{

printf("

\n\n"

);

||------------------------------------||\n"

||------------------------------------||"

\n||------------------------------------||\n||||\n||"

\005哈夫曼编译码||\n||||\n||||\n||"

\0061哈夫曼编码||\n||"

\0162显示哈夫曼编码||\n||"

\0163输入文本编译报文||\n||"

\0164输入报文编译文本||\n||"

\0165已有文本编译报文||\n||"

\0166已有报文编译文本||\n||"

\0167退出系统||\n||"

制作人:

邓俊辉||\n||"

------------------------------------||\n"

\016请输入您的选择选择:

"

scanf("

%d"

&

t);

}

//选择权值最小且parent为0的二叉树,返回其序号

intMin(HuffmanTreebt,intm)

inti,temp;

uintk;

for(i=0;

i<

m;

i++)//取k等于首个parent为0的权值

if(bt[i].parent==0)

{

k=bt[i].weight;

temp=i;

break;

}

for(i=i+1;

i++)//逐个与其他权值进行比较,并返回在parent为0下权值最小的序号

if(bt[i].weight<

k&

&

bt[i].parent==0)

{

bt[temp].parent=1;

returntemp;

//在HT[0~i]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2

voidSelect(HuffmanTreeht,intm,uint*s1,uint*s2)

(*s1)=Min(ht,m);

(*s2)=Min(ht,m);

//构造哈夫曼树

voidCreateHuffmanTree(HuffmanTree*HT,intn)

HuffmanTreep;

uints1,s2;

inti,num;

num=2*n-1;

*HT=(HuffmanTree)malloc(num*sizeof(HTNode));

p=*HT;

n;

i++)//由给定的n个权值和字符构造n棵只有一个叶子结点的二叉树;

p->

ch=c[i];

weight=w[i];

parent=0;

lchild=p->

rchild=-1;

//初始化二叉树结点,parent置为0,lchild,rchild均置为-1

p++;

for(i=n;

num;

i++)//构造n-1个空二叉树用于存储新树根结点

ch='

*'

;

i++)

Select(*HT,i,&

s1,&

s2);

(*HT)[s1].parent=(*HT)[s2].parent=i;

(*HT)[i].lchild=s1;

(*HT)[i].rchild=s2;

(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;

//从叶子节点到根节点逆向求哈弗曼编码

HuffmanCodeHuffmanCoding(HuffmanTreeHT,intn)

inti,f,top;

uintt;

HuffmanCodeHC;

char*hc;

HC=(HuffmanCode)malloc(n*sizeof(char*));

//动态申请指针存储哈夫曼编码

hc=(char*)malloc(n*sizeof(char));

//申请哈夫曼编码的工作空间

hc[n-1]='

\0'

top=n-1;

t=i;

f=HT[i].parent;

while(f!

=0)

{

if(HT[f].lchild==t)hc[--top]='

0'

elsehc[--top]='

1'

t=f;

f=HT[t].parent;

}

HC[i]=(char*)malloc((n-top)*sizeof(char));

//为已申请的指针分配一维数组存储哈夫曼编码

strcpy(HC[i],&

hc[top]);

free(hc);

returnHC;

//输出哈夫曼树

voidPrintHuffmanTree(HuffmanTreeht,intn)

inti,m;

m=2*n-1;

\t哈夫曼树及哈弗曼编码\n\n"

序号字符权值双亲左孩子右孩子\n"

printf("

%2d%c%5d"

i,ht[i].ch,ht[i].weight);

%5d%5d%5d\n"

ht[i].parent,ht[i].lchild,ht[i].rchild);

//输出哈夫曼编码

voidPrintHuffmanCode(HuffmanTreeht,HuffmanCodehc,intn)

inti;

字符\t哈弗曼编码\n"

%c%s\n"

ht->

ch,hc[i]);

ht++;

\n\n\n\n\n\n\n\n\n"

//将哈夫曼树的初始信息写入文件

voidWriteHuffmanTree()

FILE*fp;

uintwe;

charch;

请输入你需要的字符和权值,用‘#’结束输入:

\n"

if((fp=fopen("

DataFile.data"

"

w"

))==NULL)

\nErroronopen%s!

\a"

exit

(1);

\n%c"

ch);

while(ch!

='

#'

scanf("

we);

fprintf(fp,"

%c"

ch);

%5d\n"

we);

ch=getchar();

fclose(fp);

//读哈夫曼树的初始信息

voidReadHuffmanTree()

inti=0;

count=0;

r"

//表示程序非正常退出

while(!

feof(fp))

fscanf(fp,"

c[i]);

if(c[i]=='

\n'

continue;

//读到换行符,跳过,读下一行

%5d"

w[i]);

count++;

i++;

//将内容写入文件

voidWriteDataFile(char*fileName)

num=0;

if((fp=fopen(fileName,"

fileName);

num++;

//读文件内容

voidReadDataFile(char*fileName)

if(data[i]=='

)continue;

data[i]);

data[i]='

//编码,用已及建好的哈夫曼树,对所输入的文件进行编码形成报文

voidEnCoding(HuffmanCodehc)

inti=0,j;

请输入您需要进行编码的文本,以‘#’结束:

WriteDataFile("

ToBeTran.data"

ReadDataFile("

Code.txt"

'

)putchar('

for(j=0;

j<

count;

j++)

if(data[i]==c[j])

{

fprintf(fp,"

%s"

hc[j]);

printf("

break;

}

putchar('

//译码,用用已及建好的哈夫曼编码,对所输入的报文进行解译形成文本

voidDeCoding(HuffmanTreeht)

请输入您需要进行解码的代码,以‘#’结束:

CodeFile.data"

TextFile.txt"

p=&

ht[2*count-1-1];

=num;

putchar('

&

p->

lchild!

=-1)

p=&

ht[p->

lchild];

elseif(data[i]=='

rchild!

rchild];

else

fprintf(fp,"

p->

printf("

if(data[i]!

i--;

//编码,用已及建好的哈夫曼树,对已有的文件进行编码形成报文

voidAlEnCoding(HuffmanCodehc)

FILE*fp1,*fp2;

if((fp1=fopen("

feof(fp1))

data[i]=fgetc(fp1);

num=i;

fclose(fp1);

if((fp2=fopen("

{

fprintf(fp2,"

printf("

break;

}

fclose(fp2);

//译码,用用已及建好的哈夫曼编码,对已有的报文进行解译形成文本

voidAlDeCoding(HuffmanTreeht)

\a\n"

data[i-1]='

putchar('

continue;

fprintf(fp2,"

p=&

if(data[i]!

i--;

voidmain()

HuffmanTreeHT;

Start_Screen();

ReadHuffmanTree();

//读哈夫曼树原始信息

CreateHuffmanTree(&

HT,count);

//创建哈夫曼树

HC=HuffmanCoding(HT,count);

//创建哈夫曼编码

while

(1)

{

switch(t)

case1:

WriteHuffmanTree();

//更新哈夫曼树信息

ReadHuffmanTree();

//读哈夫曼树初始化信息

CreateHuffmanTree(&

HC=HuffmanCoding(HT,count);

case2:

PrintHuffmanTree(HT,count);

//输出哈夫曼树

PrintHuffmanCode(HT,HC,count);

//输出哈夫曼编码

exit(0);

//表示程序正常退出

case3:

EnCoding(HC);

//编码,对所输入的文本进行编码形成报文

case4:

DeCoding(HT);

//译码,对所输入的报文进行解译形成文本

case5:

AlEnCoding(HC);

//编码,对所已有的文本进行编码形成报文

case6:

AlDeCoding(HT);

//译码,对所已有的报文进行解译形成文本

case7:

exit(0);

default:

\a'

system("

cls"

Start_Screen();

Start_Screen();

}

七、实验结果:

运行后各文件内容如下:

DataFile.data文件

A64B13C22D32E103F21G15H47I57J1K5L32M20N57O63P15Q1R48S51T80U23V8W18X1Y16Z1‘‘138

CodeFile.data文件

111010*********00110101011000100001001001001100100010010100111110010101011010011010101111110010001111010111111101010010001101100100010001101111010100

ToBeTran.data文件

THISPROGRAMISMYFAVORITE

Code.txt文件

110100*********1111100010001010011000010010101011001011101100011111110010100011

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1