云南大学软件学院数据结构实验报告五
- 格式:doc
- 大小:415.00 KB
- 文档页数:18
(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)
实验难度: A □ B □ C
序号 学号 姓名 成绩
1 20111120
2 20111120
3
指导教师 (签名)
学 期: 2012秋季学期
任课教师:
实验题目: 树及其应用
小 组 长:
联系电话:
完成提交时间:2012年12月10日
云南大学软件学院 数据结构实验报告
云南大学软件学院2012学年 秋季 学期
《数据结构实验》成绩考核表
学号: 20111120 姓名: 本人承担角色: 小组长
评分项目 评分指标 分值 得分
实验构思(10%) 1. 实验目的明确 5
2. 实验内容理解透彻、对实验所涉及到的知识点分析到位 5
实验设计(15%) 1. 有对基本数据结构的抽象数据类型定义 5
2. 实验方案设计完整,数据结构、算法选择合理 5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图 5
实验实现(25%) 1. 代码编写规范、风格统一、注释清楚易读 5
2. 程序运行正常,测试结果正确 15
3. 界面友好、易于操作、有较强的容错性 5
实验报告撰写(10%) 1. 内容详实无缺漏,文字流畅、图表清楚 5
2. 实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考 5
个人工作量(30%) 1. 个人完成工作量 15
2. 个人技术水平 10
3. 团队合作精神 5
实验运作(10%) 1. 有一定用户群 5
2. 应用前景分析 5
综合得分: (满分100分)
指导教师: 年 月 日
(注:此表在难度为C时使用,每个成员一份。)
云南大学软件学院2012学年 秋季 学期
《数据结构实验》成绩考核表
学号: 20111120 姓名: 人承担角色: 组员
评分项目 评分指标 分值 得分
实验构思(10%) 1. 实验目的明确 5
2. 实验内容理解透彻、对实验所涉及到的知识点分析到位 5
实验设计(15%) 1. 有对基本数据结构的抽象数据类型定义 5
2. 实验方案设计完整,数据结构、算法选择合理 5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图 5
实验实现(25%) 1. 代码编写规范、风格统一、注释清楚易读 5
2. 程序运行正常,测试结果正确 15
3. 界面友好、易于操作、有较强的容错性 5
实验报告撰写(10%) 1. 内容详实无缺漏,文字流畅、图表清楚 5
2. 实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考 5
个人工作量(30%) 1. 个人完成工作量 15
2. 个人技术水平 10
3. 团队合作精神 5
实验运作(10%) 1. 有一定用户群 5
2. 应用前景分析 5
综合得分: (满分100分)
指导教师: 年 月 日
(注:此表在难度为C时使用,每个成员一份。)
一、【实验构思(Conceive)】(10%)
(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)
本实验要求设计一个哈夫曼编码译码器,要求通过统计一段电文中的各字符频率编写哈夫曼码并进行翻译。首先要解决如何进行哈夫曼编码,然后设计对电文进行编码,最后还有有译码过程。本程序使用二叉树进行哈夫曼编码,使用文本文档保存电文处理。
利用程序设计的相关知识:贯彻设计程序所必需的五大步骤,目标分析->设计算法->程序编写->后期调试->售后服务 的流程完成这个项目。
利用算法设计相关知识:该算法具有有穷性、确定性、可行性、有0个或多个输入、有一个或多个输出、正确性、可读性、健壮性的特性。
离散数学相关知识:正确合理使用与或非之间的关系,进行程序分支判断,保证程序正常进行,以及二叉树的使用。
二、【实验设计(Design)】(20%)
本次实验使用C进行编写,自定义函数7个:
void SortHufmtree(hufmtree *tree){//将哈夫曼树n个叶子结点由大到小排序Codetype* HuffmanCode(hufmtree *tree){//哈弗曼编码的生成
hufmtree* BuildHuffmanTree(hufmtree *tree){//构建叶子结点已初始化的哈夫曼树
hufmtree* CreateHuffmanTreeFromSourceFile(){//通过解析源文件建立哈夫曼树
hufmtree* Encoding(hufmtree *tree){//对源文件进行编码并保存
hufmtree* Decoding(hufmtree *tree)//对存有编码的源文件进行译码并保存
主函数为功能选择界面
三、【实现描述(Implement)】(30%)
主函数显示开始界面,选择相应的功能进行哈夫曼编码译码。本程序提供两种编码规则:统计源文件进行编码和给定权值文件编码。
人性化设计:
1. 在输入出现错误时例如功能选择错误时,程序会给出友好的提示;
2. 界面友好,容易上手。
四、【测试结果(Testing)】(10%)
程序开始运行后进行初始化,完成后的界面:
程序正确性测试1:通过源文件求哈夫曼码
程序正确性测试2:通过指定权值文件求哈夫曼码
程序正确性测试3:编码
程序正确性测试4:译码
程序健壮性测试1:输入错误的数据时报错
程序健壮性测试2:输入错误的数据时报错
四、【代码】(10%)
#include #include #include #define MAXVAL 10000 int flag=0; //哈弗曼树结点数据类型 struct hufmtreenode{ char data; int weight;//结点权值 int parent,lchild,rchild;//父结点,左、右孩子结点 }; //哈弗曼树数据类型
struct hufmtree{ hufmtreenode *node;//结点数组(根据n的值动态分配) int n;//叶子结点数 }; //哈弗曼编码数据类型 struct Codetype{ char *bits;//编码流数组,n为为哈夫曼树中叶子结点的数目,编码的长度不可能超过n
int start;//编码实际在编码流数组里的开始位置 }; //将哈夫曼树n个叶子结点由大到小排序 void SortHufmtree(hufmtree *tree){ int i,j,k; hufmtreenode temp; if (tree==NULL) return; for (i=0;in;i++) { k=i; for(j=i+1;jn;j++) if (tree->node[j].weight>tree->node[k].weight) k=j; if (k!=i) { temp=tree->node[i]; tree->node[i]=tree->node[k]; tree->node[k]=temp; } } } //哈弗曼编码的生成 Codetype* HuffmanCode(hufmtree *tree){ int i,j,p,k; Codetype *code; if (tree==NULL) return NULL; code=(Codetype*)malloc(tree->n*sizeof(Codetype)); for (i=0;in;i++) { if(flag==1) printf("%c ",tree->node[i].data);//打印字符信息 code[i].bits=(char*)malloc(tree->n*sizeof(char)); code[i].start=tree->n-1; j=i; p=tree->node[i].parent; while(p!=-1){ if (tree->node[p].lchild==j) code[i].bits[code[i].start]='0'; else code[i].bits[code[i].start]='1'; code[i].start--; j=p; p=tree->node[p].parent;
} if (flag==1) { for (k=code[i].start+1;kn;k++)//打印字符编码 printf("%c",code[i].bits[k]); printf("\n"); } } return code; } //构建叶子结点已初始化的哈夫曼树 hufmtree* BuildHuffmanTree(hufmtree *tree){ //tree中所有叶子结点已初始化 int i,j,p1,p2,m; int small1,small2; m=2*(tree->n)-1; for (i=tree->n;inode[i].parent=-1; tree->node[i].lchild=-1; tree->node[i].rchild=-1; tree->node[i].weight=0; } for (i=tree->n;inode[j].parent==-1 && tree->node[j].weight<=small1) { small1=tree->node[j].weight; p1=j; } } for (j=0;j<=i-1;j++) { if (tree->node[j].parent==-1 && tree->node[j].weight<=small2 && (j!=p1)) { small2=tree->node[j].weight; p2=j; } } tree->node[p1].parent=tree->node[p2].parent=i; tree->node[i].weight=tree->node[p1].weight+tree->node[p2].weight; tree->node[i].lchild=p1; tree->node[i].rchild=p2; } return tree; }