数据结构哈弗曼编码译码器.docx

上传人:b****3 文档编号:24725657 上传时间:2023-05-31 格式:DOCX 页数:19 大小:85.93KB
下载 相关 举报
数据结构哈弗曼编码译码器.docx_第1页
第1页 / 共19页
数据结构哈弗曼编码译码器.docx_第2页
第2页 / 共19页
数据结构哈弗曼编码译码器.docx_第3页
第3页 / 共19页
数据结构哈弗曼编码译码器.docx_第4页
第4页 / 共19页
数据结构哈弗曼编码译码器.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构哈弗曼编码译码器.docx

《数据结构哈弗曼编码译码器.docx》由会员分享,可在线阅读,更多相关《数据结构哈弗曼编码译码器.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构哈弗曼编码译码器.docx

数据结构哈弗曼编码译码器

 

软件学院

课程设计报告书

 

课程名称数据结构

设计题目哈弗曼编码译码器

专业班级软件09-5班

学号0920010508

姓名康文强

指导教师孙宁

 

2010年12月

1设计时间2

2设计目的2

3设计任务2

4设计内容3

4.11程序所要实现的功能3

4.12输入形式和输入值的范围3

4.13输出形式3

4.14测试数据3

4.2总体设计5

4.21抽象数据类型5

4.22主程序流程6

4.23各程序模块之间层次(调用)关系6

4.3详细介绍7

4.31数据类型的实现7

4.32主程序和其他主要函数的伪码7

4.33各函数之间的调用关系7

4.4测试与分析12

4.41测试12

4.42时间和空间复杂度分析和改进设想13

4.5附录(原代码及必要注释)13

5总结与展望18

参考文献20

成绩评定20

 

1设计时间

2010年12月27日到2010年12月31日

2设计目的

要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。

这对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。

3设计任务

从键盘输入一串电文字符能输出对应的哈夫曼编码。

同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。

设计要求:

(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树及哈夫曼编码。

(2)利用已经建好的哈夫曼树,对输入的字符串进行编码,输出编码序列。

(3)利用已建好的哈夫曼树对输入的二进制编码进行译码,并输出结果。

4设计内容

4.11程序所要实现的功能

从键盘输入一串电文字符能输出对应的哈夫曼编码。

同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。

4.12输入形式和输入值的范围

输入形式及范围为a到z的字符和整型的常量。

4.13输出形式

输出形式为二进制形式的字符串。

4.14测试数据

正确的测试结果

错误的测试结果

4.2总体设计

4.21抽象数据类型

ADTHfmantree{

数据对象:

存储具有相同类型的数据

数据关系:

每个结点除了更结点外都有一个前驱和后继,最后的结成为叶子节点,没有去、后继。

基本操作create(h);创建一颗赫夫曼树

}

4.22主程序流程

①输需要编码的字符串

②键入每个字符的权值,并构建一颗赫夫曼树

③对输入的对应相应权值的字符进行编码

④对应编码再进行译码

4.23各程序模块之间层次(调用)关系

①voidSelect(HfmantreeHT,intn,int*s1,int*s2)

②intHuffmancoding(Hfmantree*HT,HuffmanCode*HC,int*w,intn,char*z)

③voidtranslate(HfmantreeHT,intn)

main

退出

4.3详细介绍

4.31数据类型的实现

构建赫夫曼树的结点

typedefstruct

{

charmail;

intweight;

intparent,lchild,rchild;

}HTnode,*Hfmantree;

typedefchar**HuffmanCode;

4.32主程序和其他主要函数的伪码

4.33各函数之间的调用关系

超找两个权值最小的结点

voidSelect(HfmantreeHT,intn,int*s1,int*s2)

{

inti,j;

for(i=1;i<=n;i++)

if(!

HT[i].parent){*s1=i;break;}

for(j=i+1;j<=n;j++)

if(!

HT[j].parent){*s2=j;break;}

for(i=1;i<=n;i++)

if((HT[*s1].weight>HT[i].weight)&&(!

HT[i].parent)&&(s2!

=&i))*s1=i;

for(j=1;j<=n;j++)

if((HT[*s2].weight>HT[j].weight)&&(!

HT[j].parent)&&(*s1!

=j))*s2=j;

}

对存在的一个赫夫曼树进行编码

Huffmancoding(Hfmantree*HT,HuffmanCode*HC,int*w,intn,char*z)

{

intm,i,s1,s2,c,start;

charf,*cd;

if(n<=1)return0;

m=2*n-1;

*HT=(Hfmantree)malloc((m+1)*sizeof(HTnode));

for(i=1;i<=n;i++)

{

(*HT)[i].weight=w[i-1];

(*HT)[i].mail=z[i-1];

(*HT)[i].parent=0;

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

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

}

for(i=n+1;i<=m;i++)

{

(*HT)[i].weight=0;

(*HT)[i].parent=0;

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

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

}

for(i=n+1;i<=m;++i)

{

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;

}

*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,f=(*HT)[i].parent;f!

=0;c=f,f=(*HT)[f].parent)

{if((*HT)[f].lchild==c)cd[--start]='0';

elsecd[--start]='1';

}

printf("%s\n",&cd[start]);

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

strcpy((*HC)[i],&cd[start]);

}

free(cd);

}

对赫夫曼树进行译码

translate(HfmantreeHT,intn)

{

intm,p,j;

int*q;

p=2*n-1;

/*for(i=0;i<=p;i++)

{

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

{

s=i;

break;

}

}*/

printf("请输入想要输入数字的个数:

\n");

scanf("%d",&m);

q=(int*)malloc(m*sizeof(int));

printf("现在输入以01为内容的一串数:

\n");

for(j=0;j

scanf("%d",&q[j]);

for(j=0;j

while(HT[p].lchild&&HT[p].rchild&&j

{if(q[j])p=HT[p].rchild;

elsep=HT[p].lchild;

j++;}

if(HT[p].lchild==0||HT[p].rchild==0)

printf("%c",HT[p].mail);

elseprintf("error");

p=2*n-1;

printf("\n");

}

}

 

4.4测试与分析

4.41测试

正确的测试

错误的测试:

4.42时间和空间复杂度分析和改进设想

4.5附录(原代码及必要注释)

#include"string.h"

#include"malloc.h"

#include"stdio.h"

#include

typedefstruct

{

charmail;

intweight;

intparent,lchild,rchild;

}HTnode,*Hfmantree;

typedefchar**HuffmanCode;

voidSelect(HfmantreeHT,intn,int*s1,int*s2)

{

inti,j;

for(i=1;i<=n;i++)

if(!

HT[i].parent){*s1=i;break;}

for(j=i+1;j<=n;j++)

if(!

HT[j].parent){*s2=j;break;}

for(i=1;i<=n;i++)

if((HT[*s1].weight>HT[i].weight)&&(!

HT[i].parent)&&(s2!

=&i))*s1=i;

for(j=1;j<=n;j++)

if((HT[*s2].weight>HT[j].weight)&&(!

HT[j].parent)&&(*s1!

=j))*s2=j;

}

intHuffmancoding(Hfmantree*HT,HuffmanCode*HC,int*w,intn,char*z)

{

intm,i,s1,s2,c,start;

charf,*cd;

if(n<=1)return0;

m=2*n-1;

*HT=(Hfmantree)malloc((m+1)*sizeof(HTnode));

for(i=1;i<=n;i++)

{

(*HT)[i].weight=w[i-1];

(*HT)[i].mail=z[i-1];

(*HT)[i].parent=0;

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

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

}

for(i=n+1;i<=m;i++)

{

(*HT)[i].weight=0;

(*HT)[i].parent=0;

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

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

}

for(i=n+1;i<=m;++i)

{

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;

}

*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,f=(*HT)[i].parent;f!

=0;c=f,f=(*HT)[f].parent)

{if((*HT)[f].lchild==c)cd[--start]='0';

elsecd[--start]='1';

}

printf("%s\n",&cd[start]);

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

strcpy((*HC)[i],&cd[start]);

}

free(cd);

}

voidtranslate(HfmantreeHT,intn)

{

intm,p,j;

int*q;

p=2*n-1;

/*for(i=0;i<=p;i++)

{

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

{

s=i;

break;

}

}*/

printf("请输入想要输入数字的个数:

\n");

scanf("%d",&m);

q=(int*)malloc(m*sizeof(int));

printf("现在输入以01为内容的一串数:

\n");

for(j=0;j

scanf("%d",&q[j]);

for(j=0;j

while(HT[p].lchild&&HT[p].rchild&&j

{if(q[j])p=HT[p].rchild;

elsep=HT[p].lchild;

j++;}

if(HT[p].lchild==0||HT[p].rchild==0)

printf("%c",HT[p].mail);

elseprintf("error");

p=2*n-1;

J--;

printf("\n");

}

}

voidmain()

{

inti,n,*w;

char*z;

HuffmanCodeHC;

HfmantreeHT;

printf("请输入节点的个数n的值:

\n");

scanf("%d",&n);

w=(int*)malloc(n*sizeof(int));

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

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

printf("请依次输入字符输入和它的权值:

\n");

printf("现在请输入字符:

\n");

for(i=0;i

scanf("%s",&z[i]);

printf("请依次对应的输入%d个结点的权值\n",n);

for(i=0;i

scanf("%d",&w[i]);

Huffmancoding(&HT,&HC,w,n,z);

printf("现在输出各个字符的哈弗曼编码:

\n");

for(i=1;i<=n;i++)

printf("%c%s\n",z[i-1],HC[i]);

translate(HT,n);

}

5总结与展望

通过这次课程设计我深刻的理解了赫夫曼编码的算法,同时理解了数据结构中思想的严谨性和准确性,在这次设计过程中让我找到了自己在设计过程中的缺点,我意识到自己当时学明白并不代表自己就真正的会,自己在看书是看明白了不一定就能在计算机上运行,例如当输入为%c时候如果一个一个的输入程序会把回车也当做一个字符所以应该用%s进行输入。

在这就是在每次程序中出现的老问题,在函数调用时如果传值和传址弄混那么在函数调用过程中就会出现传不回地址或者传回的值为乱码。

在以后的每个程序中我一定会尽自己最大努力,在每个程序中我都细心地去敲入每个字符,函数调用过程中先想明白在往上面写。

我一定会继续努力,不辜负父母和老师对我的期望!

 

参考文献

[1]严蔚敏,吴伟民,清华大学计算机系列教材,《数据结构(C语言版)》,清华大学出版社,2007;

[2]谭浩强,C程序设计—3版,清华大学出版社,2005(2007重印);

[3]

成绩评定

成绩教师签字

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

当前位置:首页 > IT计算机

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

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