分享
分销 收藏 举报 申诉 / 17
播放页_导航下方通栏广告

类型哈夫曼树课程设计样本.doc

  • 上传人:精***
  • 文档编号:4638763
  • 上传时间:2024-10-08
  • 格式:DOC
  • 页数:17
  • 大小:143.50KB
  • 下载积分:8 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    哈夫曼树 课程设计 样本
    资源描述:
    资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。 中南林业科技大学 课程设计报告 设计名称: 数据结构课程设计 姓 名: 王昆 学 号: 4282 专业班级: 级软件工程 系 ( 院) : 计算机与信息工程学院 设计时间: ~ 第二学期 设计地点: 电子信息楼 机房 成绩: 指导教师评语: 签名: 年 月 日 1.课程设计目的 1、 训练学生灵活应用所学数据结构知识, 独立完成问题分析, 结合数据结构理论知识, 编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、 系统设计、 程序编码、 测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发, 巩固、 深化学生的理论知识, 提高编程水平, 并在此过程中培养她们严谨的科学态度和良好的工作作风。 2.课程设计任务与要求: 任务 . 哈夫曼树应用 功能: (1) 从终端读入字符集大小n, 以及n个字符和n个权值, 建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树 以直观的方式( 比如树) 显示在终端上; (2) 利用已经建好的哈夫曼树( 如不在内存, 则从文件htmTree中读入) , 对文件ToBeTran中的正文进行编码, 然后将结果存 入文件Cod eFile中, 并输出结果, 将文件CodeFile以紧凑格式先是在终端上, 每行50个代码。同时将此字符形式的 编码文件写入文件CodePrint中。 (3) 利用已建好的哈夫曼树将文件CodeFile中的代码进行译码, 结果存入文件TextFile中, 并输出结果。 分步实施: 1) 初步完成总体设计, 搭好框架, 确定人机对话的界面, 确定函数个数; 2) 完成最低要求: 完成功能1; 3) 进一步要求: 完成功能2和3。有兴趣的同学能够自己扩充系统功能。 要求: 1、 在处理每个题目时, 要求从分析题目的需求入手, 按设计抽象数据类型、 构思算法、 经过设计实现抽象数据类型、 编制上机程序和上机调试等若干步骤完成题目, 最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数, 加大代码的重用率。 2、 设计的题目要求达到一定工作量( 300行以上代码) , 并具有一定的深度和难度。 3、 程序设计语言推荐使用C/C++, 程序书写规范, 源程序需加必要的注释; 4、 每位同学需提交可独立运行的程序; 5 、 每位同学需独立提交设计报告书( 每人一份) , 要求编排格式统一、 规范、 内容充实, 不少于10页( 代码不算) ; 6、 课程设计实践作为培养学生动手能力的一种手段, 单独考核 3.课程设计说明书 一 需求分析 要求用到数据结构课上学到的线性表的知识, 因此就要充分而清晰的理解关于线性表的知识。 要求实现的基本功能很简单, 只有删除和插入, 增加功能也不过是加上修改。这些在数据结构课上已经讲过, 只要能够理解关于线性表的几个相关的基本算法就能够了。 问题是将输入的信息保存入文件和从文件输出。这里基本是自学的内容, 而且要考虑到是否要自行选择保存的磁盘。 综上, 做这个课题, 要具备的知识就是线性表的基本算法, 文件的保存和读取算法, 必要的C或者C++知识( 本次我将使用C实现) , 以及丰富的程序调适经验。 。 二 概要设计 程序流程图 图 1 三 详细设计 1、 哈夫曼树结点结构定义 struct hfmnode { char nValue;//节点值 int weight;//权值 int pnIndex;//父结点下标 int lchildIndex,rchildIndex;//左右孩子的结点下标 }; 哈夫曼树类定义 class huffmanTree{ public: void code(char nvalue[],int w[],int n); //对叶子结点编码 void decode(char nvalue[],char hfmcode[],int n);//对叶子结点译码 void Output(huffmanTree ht,int n);//输出哈夫曼树 //private: hfmnode hfmNode[ ];//用数组存储哈夫曼结点 void creatHfmTree(char nvalue[],int w[],int n);//创立哈夫曼树 void select(int pos,int &nodeOne,int &nodeTwo);//查询最小的两个结点 }; 2、 主要函数及相关功能 1 在数组hfmNode中从O开始到pos位置, 查找哈夫曼树外的权值最小的两个结点的位置 void huffmanTree::select(int pos,int &nodeOne,int &nodeTwo) 2 创立哈夫曼树, nvalue是结点值, w是权值, n是叶子结点的个数 void huffmanTree::creatHfmTree(char nvalue[],int w[],int n) 3 求哈夫曼树的编码 nvalue是结点值数组, w是权值数组 n是叶子结点的个数 void huffmanTree::code(char nvalue[],int w[],int n) 4 哈夫曼译码 nvalue为结点值数组 hfmcode为哈夫曼编码, n个叶子结点 void huffmanTree::decode(char nvalue[],char hfmcode[],int n) 5 检查输入的字符值是否合法 bool isChar(const string& str) 6 输出哈夫曼树, 字符, 权值, 以及它对应的编码 void huffmanTree::Output(huffmanTree ht,int n) 3、 源程序 #include<iostream> using namespace std; struct hfmnode//哈夫曼树结点结构定义 { char nValue;//节点值 int weight;//权值 int pnIndex;//父结点下标 int lchildIndex,rchildIndex;//左右孩子的结点下标 }; class huffmanTree//哈夫曼树类定义 { public: void code(char nvalue[],int w[],int n); //对叶子结点编码 void decode(char nvalue[],char hfmcode[],int n);//对叶子结点译码 void Output(huffmanTree ht,int n);//输出哈夫曼树 //private: hfmnode hfmNode[ ];//用数组存储哈夫曼结点 void creatHfmTree(char nvalue[],int w[],int n);//创立哈夫曼树 void select(int pos,int &nodeOne,int &nodeTwo);//查询最小的两个结点 }; //在数组hfmNode中从O开始到pos位置, 查找哈夫曼树外的权值最小的两个结点的位置 void huffmanTree::select(int pos,int &nodeOne,int &nodeTwo) { long w1,w2; w1=w2=88888; for(int i=0;i<=pos;i++) { if(hfmNode[i].pnIndex==0) if(hfmNode[i].weight<w1) { w1=hfmNode[i].weight; nodeOne=i; } } for(int j=0;j<=pos;j++) { if(hfmNode[j].pnIndex==0) if(hfmNode[j].weight<w2&&nodeOne!=j) { w2=hfmNode[j].weight; nodeTwo=j; } } } //创立哈夫曼树, nvalue是结点值, w是权值, n是叶子结点的个数 void huffmanTree::creatHfmTree(char nvalue[],int w[],int n) { int pos; for(pos=1;pos<=n;pos++) { hfmNode[pos].nValue=nvalue[pos-1];//结点值 hfmNode[pos].weight=w[pos-1];//权值 hfmNode[pos].pnIndex=hfmNode[pos].lchildIndex=hfmNode[pos].rchildIndex=0; } //设置数组hfmNode中的其它结点 for(pos=n+1;pos<=2*n-1;pos++) { int nodeOne,nodeTwo; select(pos-1,nodeOne,nodeTwo); hfmNode[nodeOne].pnIndex=hfmNode[nodeTwo].pnIndex=pos;//把hfmNode[nodeOne]和hfmNode[nodeTwo]两个结点加入哈夫曼树, 设置她们的父结点位置为pos hfmNode[pos].lchildIndex=nodeOne;//设置pos结点的左孩子为nodeOne hfmNode[pos].rchildIndex=nodeTwo;//设置pos结点的右孩子为nodeTwo hfmNode[pos].weight=hfmNode[nodeOne].weight+hfmNode[nodeTwo].weight;//设置pos结点的权值为左右孩子权值的和 hfmNode[pos].pnIndex=0; //pos父结点为0 } } //求哈夫曼树的编码 nvalue是结点值数组, w是权值数组 n是叶子结点的个数 void huffmanTree::code(char nvalue[],int w[],int n) { creatHfmTree(nvalue,w,n); int i,j,c,f; int start; char *cd; cd=new char[n];//用于存储哈夫曼编码的动态空间 cd[n-1]='\0';//编码结束符 cout<<" 结点值 编码"<<endl; for(i=1;i<=n;i++)//逐个字符求哈夫曼编码 { start=n-1; //编码结束符位置 for(c=i,f=hfmNode[i].pnIndex;f!=0;c=f,f=hfmNode[f].pnIndex)//从叶子到根逆向求编码 { if(hfmNode[f].lchildIndex==c) cd[--start]='0'; else cd[--start]='1'; } cout<<" "<<nvalue[i-1]<<" "; for(j=start;j<n;j++) cout<<cd[j]; cout<<endl; } delete []cd;//释放空间 } ///哈夫曼译码 nvalue为结点值数组 hfmcode为哈夫曼编码, n个叶子结点 void huffmanTree::decode(char nvalue[],char hfmcode[],int n) { int i,f; char c; for(i=0;i<strlen(hfmcode);)//从根节点往下走的叶子结点 { //左0右1 for(f=2*n-1;hfmNode[f].lchildIndex!=0&&hfmNode[f].rchildIndex!=0;) { c=hfmcode[i]; if(c=='1') { f=hfmNode[f].rchildIndex; i++; } else { f=hfmNode[f].lchildIndex; i++; } } cout<<hfmNode[f].nValue;//输出找到的叶子结点 } cout<<endl;//换行 } ////////检查输入的字符值是否合法 bool isChar(const string& str) { int i ; for(i = 0; i != str.length(); i++) { if(!isdigit(str[i])) { continue; } else return false; } return true; } /////////////////////////////////OUTPUT ***********OUTPUT output***************** void huffmanTree::Output(huffmanTree ht,int n) //输出哈夫曼树, { cout<<"哈夫曼树储存结构模拟: "<<endl; cout<<"hfmNode weight pnIndex lchildIndex rchildIndex"<<endl; for(int i=1;i<=2*n-1;i++) // cout<<i<<" "<<hfmNode[i].weight<<" "<<hfmNode[i].pnIndex<<" "<<hfmNode[i].lchildIndex<<" "<<hfmNode[i].rchildIndex<<endl; printf("%4d%12d%10d%14d%16d\n",i,hfmNode[i].weight,hfmNode[i].pnIndex,hfmNode[i].lchildIndex,hfmNode[i].rchildIndex); } //*************---Main---*************// //**************---======************// void main() { // int i=1; // while(i=1) { cout<<" "<<endl; cout<<" *****************--构造哈夫曼树--******************"<<endl; int n=5;//字符和权值个数 cout<<"请输入字符集大小n: "<<endl; cin>>n; char str['n']; // str[n-1]='\0'; char g; char str2[ ];//存储哈夫曼编码 int w[26]; huffmanTree obj; cout<<"请输入"<<n<<"个字符值: "<<endl<<endl; cin>>str; //输入字符不合法 while(isChar(str)==0||strlen(str)!=n) { cout<<endl; cout<<"输入错误, 请重新输入"<<endl; cin>>str; } //////////////////////////////////////////// // Output(); ////////////////////////////////////////////// // int n=strlen(str); cout<<endl; gocd: cout<<"输入对应权值: "<<endl; for(int i=0;i<n;i++) cin>>w[i]; cout<<endl; int m; while(1) { cout<<"请选择输入0或1: "<<endl; cout<<"***0、 模拟输出哈夫曼树***"<<endl; cout<<"***1、 进行编码***********"<<endl; cout<<"***2、 进行译码***********"<<endl; cin>>m; switch(m) { case 0: { obj.creatHfmTree(str,w,n); obj.Output(obj,n);///////////////////////////////////////////OUTput cout<<endl; }break; case 1: { cout<<"各节点编码如下: "<<endl; obj.code(str,w,n); cout<<endl; }break; case 2: break; default:cout<<"很抱歉, 输入错误! 请重新输入: "<<endl; } if(m==2) break; } godc: cout<<endl<<"请输入要译码的二进制0、 1串: "<<endl<<endl; cin>>str2; cout<<endl; cout<<"译码结果如下: "<<endl<<endl; obj.decode(str,str2,n); cout<<endl; cout<<endl; cout<<"是否继续译码(Y/N)?"<<endl; getchar(); g=getchar(); if(g=='Y') goto godc;//继续译码 cout<<"是否继续编码(Y/N)?"<<endl; getchar(); g=getchar(); if(g=='Y') goto gocd;//继续编码 } } 四 设计与调试分析 从上面的程序能够看出, 有些地方时没有办法限制的, 比如说输入整型变量的时候, 没有办法限制其不能输入字符型。 在调试的过程中所遇到的问题很多。 五 用户手册 1 本程序能够在vc++5.0和vc++6.0 的环境下运行。 2 在vc中创立一个工程, 将源程序复制到.cpp中, 编译链接就能够。 3 选择编译、 运行以后会出现运行界面, 选择相应的选项, 根据提示即可进行演示。界面如下: 4、 请如数字符集大小n,就是要求用户输入哈夫曼树叶子结点的个数 六 测试成果 测试结束 八.课程设计心得 我相信经过短短几天除了吃饭, 睡觉, 上课就天天坐在电脑面前编程, 那编程水平没有提高是绝对不可能的, 让你每天24小时有18个小时是坐在电脑面前编程, 我相信, 你一定会成为一出类拔萃的程序员。设计心得, 时间太短, 忙不过来, 同时要设计的东西太多, 这个和知识学的不精也有关系, 如果给充分的时间, 我相信没有什么解决不了的! 谢谢老师的指导!
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:哈夫曼树课程设计样本.doc
    链接地址:https://www.zixin.com.cn/doc/4638763.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork