电子科技大学软件技术基础实验报告4
更新时间:2023-05-02 01:16:01 阅读量: 实用文档 文档下载
电子科技大学通信与信息工程学院标准实验报告
(实验)课程名称软件技术基础实验
电子科技大学教务处制表
电子科技大学
实验报告
一、实验室名称:校公共机房
二、实验项目名称:二叉树和哈夫曼树
三、实验学时:4学时
四、实验原理:
使用VS2010等C语言集成开发环境(IDE),在微型计算机上对程序进行编辑、编译、连接与运行。通过上机练习掌握二叉树的建立、插入删除,遍历等方法和过程,掌握递归函数在二叉树建立,遍历中的应用,掌握哈夫曼树的最小路径和建立过程。
五、实验目的:
1.熟练二叉树和哈夫曼树的概念和基本操作方法。
2.掌握课程平台使用方法。
六、实验内容:
上机完成所有函数,编程实验,调试运行程序并完成报告。
七、实验器材(设备、元器件):
硬件要求:普通pc机,1G内存,100G硬盘空间即可。
软件要求:Windows 7,包括C编译器的IDE。
八、实验步骤、实验编程与运行结果:
下面建立该二叉树并展示输出结果:
#include
#include
typedef struct bnode
{
int data;
struct bnode *lc,*rc;
};
struct bnode* create()
{
struct bnode *tree=NULL;
char ch;
ch=getchar();
if(ch=='_')
tree=NULL;
else
{
tree=(struct bnode *)malloc(sizeof(struct bnode));
tree->data=ch;
tree->lc=create();
tree->rc=create();
}
return tree;
}
//先序遍历(根左右)--递归
int preorder(struct bnode *root)
{
putchar(root->data);
if(root->lc!=NULL)
preorder(root->lc);
if(root->rc!=NULL)
preorder(root->rc);
}
//中序遍历--递归
int inorder(struct bnode *root)
{
if(root->lc!=NULL)
inorder(root->lc);
putchar(root->data);
if(root->rc!=NULL)
inorder(root->rc);
}
//后序遍历--递归
int postorder(struct bnode *root)
{
if(root->lc!=NULL)
postorder(root->lc);
if(root->rc!=NULL)
postorder(root->rc);
putchar(root->data);
}
int main()
{
struct bnode *root=NULL;
printf("先序建立二叉树,输入变量: (下划线为NULL):");
root=create(); //输入(ABC DE G F )
printf("先序遍历输出:");
preorder(root);
printf("\n");
printf("中序遍历输出:");
inorder(root);
printf("\n");
printf("后序遍历输出:");
postorder(root);
printf("\n");
}
下面建立该二叉树并展示输出结果:
#include
#include
struct hftree
{
int data;
struct hftree *left;
struct hftree *right;
};
struct hftree *CreateHuffman(int a[], int n)
{
int i, j;
struct hftree *b[100], *q;//假设哈弗曼书最大为100个节点
for (i = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点{
b[i]=(struct hftree*)malloc(sizeof(struct hftree));
b[i]->data=a[i];
b[i]->left=NULL;
b[i]->right=NULL;
}
for (i = 1; i < n; i++)//进行n-1 次循环建立哈夫曼树
{
//k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标
int k1 = -1, k2;
for (j = 0; j < n; j++)//让k1初始指向森林中第一棵树,k2指向第二棵
{
if (b[j] != NULL && k1 == -1)
{
k1 = j;
continue;
}
if (b[j] != NULL)
{
k2 = j;
break;
}
}
for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小
{
if (b[j] != NULL)
{
if (b[j]->data < b[k1]->data)
{
k2 = k1;
k1 = j;
}
else if (b[j]->data < b[k2]->data)
k2 = j;
}
}
//由最小权值树和次最小权值树建立一棵新树,q指向树根结点
q = (struct hftree*)malloc(sizeof(struct hftree));
q->data = b[k1]->data + b[k2]->data;
q->left = b[k1];
q->right = b[k2];
b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置
b[k2] = NULL;//k2位置为空
}
free(b); //删除动态建立的数组b
return q; //返回整个哈夫曼树的树根指针
}
//求哈夫曼树的带权路径长度
int WeightPathLength(struct hftree* T, int len)//len初始为0
{
if (T == NULL) //空树返回0
return 0;
else
{
if (T->left == NULL && T->right == NULL)//访问到叶子结点
return T->data * len;
else //访问到非叶子结点,进行递归调用,返回左右子树的带权路径长度之和,len 递增
return WeightPathLength(T->left,len+1)+WeightPathLength(T->right,len+1);
}
}
//哈夫曼编码(可以根据哈夫曼树带权路径长度的算法基础上进行修改)
void HuffManCoding(struct hftree* T, int len)//len初始值为0
{
static int a[10];//定义静态数组a,保存每个叶子的编码,数组长度至少是树深度减一if (T != NULL)//访问到叶子结点时输出其保存在数组a中的0和1序列编码
{
if (T->left == NULL && T->right == NULL)
{
int i;
printf("结点权值为%d的编码:", T->data);
for (i = 0; i < len; i++)
printf("%d", a[i]);
printf("\n");
}
else
{
a[len] = 0;
HuffManCoding(T->left, len + 1);
a[len] = 1;
HuffManCoding(T->right, len + 1);
}
}
}
int main()
{
int n, i;
int a[100];
struct hftree* t;
printf("从键盘输入待构造的哈夫曼树中带权叶子结点数n:");
scanf("%d", &n);
printf("从键盘输入%d个整数作为权值:", n);
for (i = 0; i < n; i++)
scanf(" %d", &a[i]);
t = CreateHuffman(a, n);
printf("哈夫曼树的带权路径长度:");
printf("%d\n", WeightPathLength(t, 0));
printf("各个数据的哈夫曼编码:\n");
HuffManCoding(t, 0);
}
正在阅读:
电子科技大学软件技术基础实验报告405-02
关于我镇农村建房控违工作调研报107-10
大卫奥格威97项广告信条03-07
养成亲社会行为的教学设计12-28
人教版初中物理实验目录06-17
Y系列电机制造工艺知识04-14
关于预售中的土地解押11-14
计算机网络安全问题初探08-20
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 软件技术
- 实验
- 基础
- 报告
- 大学
- 电子
- 科技
- 机械厂的认知实习报告
- 第一章空间几何体章末测试题
- 一级建造师考试专业对照表
- 2021高考理科数学一轮总复习课标通用版作业:第9章 平面解析几何 课时作业51
- 上机考试不用愁,2012年全国计算机二级VB上机考试题库及答案word版本
- 2016新课标三维人教A版数学选修2-1 3.2 立体几何中的向量方法
- 2019-2020学年度第二学期五年级数学空中课堂复学期末检测试卷(含评分标准及答案)
- 廉江市人民法院审判法庭综合楼智能化系统
- 2015年H3CNE_GBO-190_题库V2.01及答案详
- 万福时代广场B座(大都汇)项目配电安装工程施工组织设计
- 连续牵引车安装安全技术措施
- 【全国百强校】广西柳州铁路第一中学2016-2017学年高二上学期段考化学(文)试题解析(解析版)
- 2020广东公务员考试乡镇申论真题及参考答案(一类)
- 行风自查报告(完整版)
- 土木工程专业大学生职业生涯规划范文
- 土木工程结构设计论文参考文献范例
- 2021年资产评估师职业资格全国统一考试大纲
- 全国7月高等教育自学考试国际商务管理学试题
- 北师大版九年级上册数学全册导学案
- 近年来全国链标委审查通过的链传动行业新标准