淮海工学院 数据结构 第4次实验.docx
- 文档编号:7923965
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:10
- 大小:87.21KB
淮海工学院 数据结构 第4次实验.docx
《淮海工学院 数据结构 第4次实验.docx》由会员分享,可在线阅读,更多相关《淮海工学院 数据结构 第4次实验.docx(10页珍藏版)》请在冰豆网上搜索。
淮海工学院数据结构第4次实验
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
树型数据结构实验
班级:
学号:
姓名:
树型数据结构实验报告要求
1目的与要求:
1)熟练掌握Huffman树的创建算法与编程实现;
2)熟练掌握Huffman编码算法的实现与编程应用;
3)创建较为实用的通信报文Huffman编码系统和译码系统;
4)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果);
5)认真书写实验报告,并按时提交。
2实验内容或题目
实验四:
树型数据结构实验——创建通信报文编码与译码系统
构造通信报文编码和译码系统(要求Huffman编码与译码)。
条件:
1、使用英文报文实施加密通信。
设组成报文的字符集为26个英文字母(不分大小写)和两个标点符号字符“,”、“.”和一个空格字符(共29个字符)。
2、字符集中每个字符(含字母和两个标点符号)的使用概率自己根据英文行文合理给出(可以在网上查询)。
3、以字符集中各个字符为叶结点、字符的使用频率为权重构造Huffman树,并求得各个字符的Huffman编码(参考教材P152-153教材算法6.16)。
同时,输出构造的Huffman树和字符编码结果。
4、在上述通信报文编码和译码系统中实现:
输入一报文原文(即使用英文书写的一段文字或一两句话,称为明文),给出要发送的报文编码(密文);再输入一密文(0、1序列),输出其对应的译码报文(明文)。
其中报文原文或编码序列自己设定,尽量是一句话或一段文字的对应编码序列,这样可以验证输出结果的正确性。
5、本次实验程序给出创建哈弗曼和哈弗曼编码的源程序,调试运行并实验本次实验的全部功能。
3实验步骤与源程序
#include
#include
#include
typedefchar*HuffmanCode;/*动态分配数组,存储哈夫曼编码*/
typedefstruct
{
unsignedintweight;/*用来存放各个结点的权值*/
unsignedintparent,LChild,RChild;/*指向双亲、孩子结点的指针*/
}HTNode,*HuffmanTree;/*动态分配数组,存储哈夫曼树*/
voidselect(HuffmanTree*ht,intn,int*s1,int*s2)
{
inti;
intmin;
for(i=1;i<=n;i++)
{
if((*ht)[i].parent==0)
{
min=i;
i=n+1;
}
}
for(i=1;i<=n;i++)
{
if((*ht)[i].parent==0)
{
if((*ht)[i].weight<(*ht)[min].weight)
min=i;
}
}
*s1=min;
for(i=1;i<=n;i++)
{
if((*ht)[i].parent==0&&i!
=(*s1))
{
min=i;
i=n+1;
}
}
for(i=1;i<=n;i++)
{
if((*ht)[i].parent==0&&i!
=(*s1))
{
if((*ht)[i].weight<(*ht)[min].weight)
min=i;
}
}
*s2=min;
}
voidCrtHuffmanTree(HuffmanTree*ht,int*w,intn)
{/*w存放已知的n个权值,构造哈夫曼树ht*/
intm,i;
ints1,s2;
m=2*n-1;
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));/*0号单元未使用*/
for(i=1;i<=n;i++)
{/*1-n号放叶子结点,初始化*/
(*ht)[i].weight=w[i];
(*ht)[i].LChild=0;
(*ht)[i].parent=0;
(*ht)[i].RChild=0;
}
for(i=n+1;i<=m;i++)
{
(*ht)[i].weight=0;
(*ht)[i].LChild=0;
(*ht)[i].parent=0;
(*ht)[i].RChild=0;
}/*非叶子结点初始化*/
/*------------初始化完毕!
对应算法步骤1---------*/
for(i=n+1;i<=m;i++)/*创建非叶子结点,建哈夫曼树*/
{/*在(*ht)[1]~(*ht)[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给s1、s2返回*/
select(ht,i-1,&s1,&s2);
(*ht)[s1].parent=i;
(*ht)[s2].parent=i;
(*ht)[i].LChild=s1;
(*ht)[i].RChild=s2;
(*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;
}
}/*哈夫曼树建立完毕*/
voidoutputHuffman(HuffmanTreeHT,intm)
{
if(m!
=0)
{
printf("%d",HT[m].weight);
outputHuffman(HT,HT[m].LChild);
outputHuffman(HT,HT[m].RChild);
}
}
voidCrtHuffmanCode(HuffmanTree*ht,HuffmanCode*hc,intn)
/*从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码*/
{
char*cd;
inti;
unsignedintc;
intstart;
intp;
hc=(HuffmanCode*)malloc((n+1)*sizeof(char*));/*分配n个编码的头指针*/
cd=(char*)malloc(n*sizeof(char));/*分配求当前编码的工作空间*/
cd[n-1]='\0';/*从右向左逐位存放编码,首先存放编码结束符*/
for(i=1;i<=n;i++)/*求n个叶子结点对应的哈夫曼编码*/
{
start=n-1;/*初始化编码起始指针*/
for(c=i,p=(*ht)[i].parent;p!
=0;c=p,p=(*ht)[p].parent)/*从叶子到根结点求编码*/
if((*ht)[p].LChild==c)
cd[--start]='0';/*左分支标0*/
else
cd[--start]='1';/*右分支标1*/
hc[i]=(char*)malloc((n-start)*sizeof(char));/*为第i个编码分配空间*/
strcpy(hc[i],&cd[start]);
}
free(cd);
}
char*mingma(HuffmanTreeHT,intm,char*ch,char*code)
{
char*result=newchar[100];
for(inti=0,j=0;ch[j]!
=0;j++)
{
intn=m;
while(HT[n].LChild!
=0&&HT[n].RChild!
=0)
{
if(code[i]=='0')
n=HT[n].LChild;
else
n=HT[n].RChild;
i++;
}
result[j]=ch[n-1];}
result[j]=0;
returnresult;
}
char*miwen(HuffmanTreeHT,intm,char*ch,char*c,HuffmanCode*code)
{
char*result=newchar[100];
result[0]=0;
inti,j,n=0;
for(i=0;ch[i]!
='\0';i++)
{
for(j=0;j { if(c[j]==ch[i]) { strcat(result,code[j+1]); break; } } } returnresult; } char*CrtHuffmanCode(HuffmanTree*ht,HuffmanCode*hc,intn,char*ch) { char*cd; inti; intc; intstart; intp; hc=(HuffmanCode*)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; for(i=1;i<=n;i++) { start=n-1; for(c=i,p=(*ht)[i].parent;p! =0;c=p,p=(*ht)[p].parent) if((*ht)[p].LChild==c) cd[--start]='0'; else cd[--start]='1'; hc[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(hc[i],&cd[start]); } free(cd); for(i=1;i<=n;i++) printf("%c编码为%s\n",ch[i-1],hc[i]); charmm[100]; printf("输入明码: \n"); gets(mm); char*miwen(HuffmanTreeHT,intm,char*ch,char*c,HuffmanCode*code); printf("对应密文: \n%s\n",miwen(*ht,29,mm,ch,hc)); return0; } voidmain() { HuffmanTreeHT; HuffmanCodeHC; intn=29; ints=0; intm; charzi[29]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',',','.',''}; intw[29]={8,2,4,3,1,18,24,30,7,19,11,54,30,66,71,31,19,73,75,69,36,10,12,22,17,25,72,40,12}; printf("thetotalnumberoftheHuffmanTree: "); CrtHuffmanTree(&HT,w,n); m=2*n-1; outputHuffman(HT,m); printf("\n"); char*hc=CrtHuffmanCode(&HT,&HC,n,zi); printf("输入密文\n"); chart_[100]; scanf("%s",t_); printf("对应明文: \n%s\n",mingma(HT,2*n-1,zi,t_)); } 4测试数据与实验结果(可以抓图粘贴) 5结果分析与实验体会 开始没有什么头绪后来老师提示一些方法,在根据老师给的代码做了出来,遇到的麻烦是忘了C语言输出格式,%s和%c的区别,开始用%c,后来才想起这是单个字符的输出,%s才是串的输出。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 淮海工学院 数据结构 第4次实验 淮海 工学院 实验