哈夫曼编码报告Word文档格式.docx

上传人:b****5 文档编号:17453414 上传时间:2022-12-01 格式:DOCX 页数:8 大小:45.10KB
下载 相关 举报
哈夫曼编码报告Word文档格式.docx_第1页
第1页 / 共8页
哈夫曼编码报告Word文档格式.docx_第2页
第2页 / 共8页
哈夫曼编码报告Word文档格式.docx_第3页
第3页 / 共8页
哈夫曼编码报告Word文档格式.docx_第4页
第4页 / 共8页
哈夫曼编码报告Word文档格式.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

哈夫曼编码报告Word文档格式.docx

《哈夫曼编码报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码报告Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。

哈夫曼编码报告Word文档格式.docx

完成程序的主框架设计,进行调试,验证其正确性;

第2次:

详细设计,进行调试,验证其正确性;

第3次:

进行整体调试,运行程序,对运行结果进行分析,完成实验报告。

#include<

stdio.h>

string.h>

malloc.h>

#defineMAXWORD100

typedefstruct

{unsignedintweight;

chardata;

unsignedintparent,llchild,rrchild;

}HTNode,*HuffmanTree;

//动态分配数组存储哈夫曼树

typedefchar**HuffmanCode;

//动态分配数组存储哈夫曼编码表

typedefstructtnode

{charch;

//字符

intcount;

//出现次数

structtnode*lchild,*rchild;

}BTree,*BT;

inta=0,b=0;

ints[MAXWORD];

charstr[MAXWORD];

voidmain()

{intn;

inti=0;

HuffmanTreeHT;

HuffmanCodeHC;

voidHuffmanCoding(HuffmanTree&

HT,HuffmanCode&

HC,intn);

voidDispHCode(HuffmanTreeHT,HuffmanCodeHC,intn);

voidCreatree(BT&

p,charc);

//Creatree()和InOrderTraverse()

voidInOrderTraverse(BTp);

//利用二叉树统计出现的字符及个数

voidTTranChar(HuffmanTreeHT,HuffmanCodeHC,intn);

voidTran(HuffmanTreeHT,intn);

printf("

请输入要用几种字符:

"

);

scanf("

%d"

&

n);

BTroot=NULL;

\n"

请输入字符串:

%s"

str);

while(str[i]!

='

\0'

{Creatree(root,str[i]);

i++;

}

字符及出现次数:

InOrderTraverse(root);

HuffmanCoding(HT,HC,n);

DispHCode(HT,HC,n);

Tran(HT,n);

TTranChar(HT,HC,n);

voidHuffmanCoding(HuffmanTree&

HC,intn)

{//w放n个权值,构造赫夫曼树HT,n个字符编码HC

voidselect(HuffmanTreet,inti,int&

s1,int&

s2);

intm,i,s1,s2,start;

char*cd;

unsignedc,f;

HuffmanTreep;

if(n<

=1)return;

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

for(p=HT+1,i=1;

i<

=n;

++i,++p)

{(*p).parent=0;

(*p).llchild=0;

(*p).rrchild=0;

}

for(p=HT+1,i=0;

n;

{(*p).data=str[i];

(*p).weight=s[i];

for(;

=m;

(*p).parent=0;

for(i=n+1;

++i)//建赫夫曼树

{//在HT[1~i-1]中选择parent为0且weight最小的两个,分别s1、s2

select(HT,i-1,s1,s2);

HT[s1].parent=HT[s2].parent=i;

HT[i].llchild=s1;

HT[i].rrchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

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

//([0]不用)

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

cd[n-1]='

;

//编码结束符

for(i=1;

i++)

{start=n-1;

//编码结束符位置

for(c=i,f=HT[i].parent;

f!

=0;

c=f,f=HT[f].parent)

if(HT[f].llchild==c)

cd[--start]='

0'

else

1'

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

strcpy(HC[i],&

cd[start]);

//复制

free(cd);

voidselect(HuffmanTreet,inti,int&

s2)//s1为较小

{intmin(HuffmanTreet,inti);

intj;

s1=min(t,i);

s2=min(t,i);

if(s1>

s2)

{j=s1;

s1=s2;

s2=j;

intmin(HuffmanTreet,inti)//函数voidselect()调用

{

intj,flag;

unsignedintk=100;

//取k比任何权值都大

for(j=1;

j<

=i;

j++)

if(t[j].weight<

k&

&

t[j].parent==0)

k=t[j].weight,flag=j;

t[flag].parent=1;

returnflag;

voidCreatree(BT&

p,charc)//采用递归方式构造一棵二叉排序树

{if(p==NULL)//p为NULL,则建立一个新结点

{p=(BTree*)malloc(sizeof(BTree));

p->

ch=c;

count=1;

lchild=p->

rchild=NULL;

else

if(c==p->

ch)p->

count++;

if(c<

ch)Creatree(p->

lchild,c);

elseCreatree(p->

rchild,c);

voidInOrderTraverse(BTp)//中序遍历

{

if(p!

=NULL)

{InOrderTraverse(p->

lchild);

{printf("

%c的个数为:

%d\n"

p->

ch,p->

count);

s[b]=p->

count;

b++;

str[a]=p->

ch;

a++;

InOrderTraverse(p->

rchild);

voidDispHCode(HuffmanTreeHT,HuffmanCodeHC,intn)//显示0、1编码

{inti;

输出哈夫曼编码:

{printf("

%c:

\t"

HT[i].data);

puts(HC[i]);

voidTran(HuffmanTreeHT,intn)//将含0、1的编码翻译成字符

inti,j=0;

charcc[MAXWORD];

i=2*n-1;

输入发送的(0、1)编码(以'

#'

为结束标志):

cc);

译码后的字符为"

while(cc[j]!

{

if(cc[j]=='

i=HT[i].llchild;

i=HT[i].rrchild;

if(HT[i].llchild==0)

%c"

i=2*n-1;

j++;

voidTTranChar(HuffmanTreeHT,HuffmanCodeHC,intn)

{

charss[50];

inti,j;

//将字符串翻译成0、1代码

输入字符串:

ss);

i=0;

while(ss[i]!

j=1;

while((HT[j].data!

=ss[i])&

(j<

=n))

{j++;

HC[j]);

i++;

6.实验结果与总结:

总结:

在实现哈夫曼树编码的过程中,首先构建哈夫曼树,并用动态分配数组存储,也用动态分配数组存储哈夫曼编码表。

程序书上虽然有一部分可借鉴的代码,自己只需要编写几个函数即可,但在编写程序时也遇到一些问题,开始统计字符串中出现的各种字符及其次数时,将字母存放数组中,但是考虑到字母出现的不同,完全初始化再统计其出现的个数,不仅占用空间并且时间复杂度高。

后来采用二叉树统计出现的字母及个数,实现了输入字母种类的灵活性。

通过此次实验,明白了了解数据存储的具体方式的重要性,在这次实验中要实现两个互译码程序,就需要对数据的存储了解,编写时就容易了然于心。

总的来说,数据结构实验对我们的编程能力还是有很大的帮助,锻炼我们的逻辑思维、使我们更熟练地使用c语言编程、锻炼我们处理异常的能力。

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

当前位置:首页 > 幼儿教育 > 育儿知识

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

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