实验二 抽象数据类型的表示和实现——及编码答案
更新时间:2023-04-22 07:00:01 阅读量: 实用文档 文档下载
- 实验二小推荐度:
- 相关推荐
t浙江大学城市学院实验报告
课程名称 数据结构基础 实验项目名称 实验二 抽象数据类型的表示和实现 学生姓名 专业班级 学号
实验成绩 指导老师(签名 ) 日期
一. 实验目的和要求
1、通过抽象数据类型三元组的表示和实现,了解抽象数据类型的定义方式。
2、掌握抽象数据类型的定义方式和用C语言实现的方法。
3、熟悉如何运用主函数检验各基本操作函数的正确性的具体操作
二. 实验内容
1、 认真阅读以下有关抽象数据类型的知识:
(1)抽象数据类型的概念
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,就不影响其外部的使用。
一个含抽象数据类型的软件模块通常应包含定义、表示和实现3个部分。抽象数据类型通常采用以下格式定义:
ADT抽象数据类型名 {
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
} ADT抽象数据类型名
(2)三元组的抽象数据类型定义及表示
我们以抽象数据类型三元组为例,说明抽象数据类型是如何定义的。三元组实际上就是一个数据对象中有3个数据元素。三元组中元素的数据类型,可以是整型数,也可以是字符、浮点数或者更复杂的数据类型。
以下是三元组的抽象数据类型定义:
ADT Triplet{
数据对象:D={e1, e2, e3 | e1, e2, e3∈ElemSet (ElemSet为某个数据对象的集合)}
数据关系:R1={<e1, e2>, <e2, e3>}
基本操作:
InitTriplet(&T, v1, v2, v3)
操作结果:构造三元组T,元素e1, e2和e3分别被赋以v1, v2, v3值 DestroyTriplet(&T)
操作结果:三元组T被销毁
Get(T, i, &e)
初始条件:三元组T已存在,1≤i≤3
操作结果:用e返回T的第i元的值
IsAscending(T)
初始条件:三元组T已存在
操作结果:如果T的三个元素按升序排列,则返回1,否则返回0
IsDecending(Triplet T);
初始条件: 三元组T已存在
操作结果: 如果T的三个元素按降序排列,则返回1,否则返回0 Put(&T, i, e)
初始条件:三元组T已存在,1≤i≤3
操作结果:改变T的第i元的值为e
Max(T, &e)
初始条件:三元组T已存在
操作结果:用e返回T的三个元素中的最大值
Min(T, &e)
初始条件:三元组T已存在
操作结果:用e返回T的三个元素中的最小值
} ADT Triplet
三元组在计算机中的具体存储方式可以采用动态分配的顺序存储结构,如图
2.1所示。
TripletElemType
图2.1 动态分配的顺序存储的三元组
2、 在计算机中实现上述三元组抽象数据类型。步骤如下:
(1)首先搭好实现该抽象数据类型的整个C语言程序的模块框架结构图,如图
2.2所示。即在一个工程中分别建立两个文件:头文件test2_function.h与源文件test2_main.cpp。
图2.2 实现三元组操作的C语言源程序框架图
(2)编写test2_function.h和test2_main.cpp两个文件,其中test2_function.h中包含三元组的各种操作函数的实现,test2_main.cpp中包含三元组存储结构定义与主函数,主函数主要用于验证test2_function.h中各函数的正确性。编译并调试程序,直到正确运行。
说明:
以下给出了若干基本操作(即函数)的实现方法,供参考,其余函数请自行完成。
(a) 头文件test2_function.h中三元组基本操作的实现个例。
I. 初始化操作:
int InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{ // 操作结果:构造三元组T,依次置T的3个元素的初值为v1,v2和v3
// (见图2.3) ,经过此操作,系统将分配给三元组T一个起始地址
if (!(T=(ElemType *) malloc (3*sizeof(ElemType))))
exit(0); // 申请空间失败,退出系统
T[0]=v1; T[1]=v2; T[2]=v3;
return 1; // 若返回值为1,则初始化成功
}
TT[0]
T[1]T[2] 图2.3 构造三元组T
II. 销毁操作:
void DestroyTriplet(Triplet &T)
{ // 操作结果:三元组T被销毁
free(T);
T=NULL;
return;
}
(b) 主文件test2_main.cpp:
# include <iostream.h> // 包含输入(cin)、输出(cout)的头文件, #include <stdio.h> //若采用printf和scanf,则用stdio.h库函数 # include <stdlib.h> //常用函数的头文件
typedef int ElemType; // 定义三元组元素类型ElemType为整型 typedef ElemType *Triplet; //定义动态分配的三元组类型, 指针Triplet
//指向ElemType类型元素的地址。初始化操作分配3个元素的存储空间 # include "test2_function.h" // 包含三元组基本操作的头文件
void main()
{
Triplet T; // ___定义整型指针T _____
ElemType m;
int i;
i=InitTriplet(T, 1, 3, 5); //__以v1, v2, v3值____
printf("调用初始化函数后,i=%d (1:成功;否则:不成功) ", i); printf("\n三元组中三个元素的值分别为:\n");
printf("T[0]=%d, T[1]=%d, T[2]=%d", T[0], T[1], T[2]);
Get(T, 2, m); // ___ printf("\nT的第2个值为:%d", m) ;
Put(T, 2, 6); // ___ printf("\n改变后T的3个值为:%d, %d, %d", T[0], T[1], T[2]) ;
Max(T, m); // ___ printf("\nT中的最大值为:%d", m) ;
Min(T, m); //____用e返回T的三个元素中的最小值______ printf("\nT中的最小值为:%d", m);
..................
DestroyTriplet(T); printf("\n销毁T后,T=%d\n", T);
}
请读懂这个主程序,并把主函数填写完整,体会main() 函数前的“文件包含 (include) ”处理和typedef类型定义作用,并在主函数的划线处填上相应C语句的注释。
3、填写实验报告,实验报告文件取名为report2.doc。
4、上传实验报告文件report2.doc 、源程序文件test2_main.cpp及
test2_function.h到Ftp服务器上( )自己的文件夹下。
三. 函数的功能说明及算法思路
(包括每个函数的功能说明,及一些重要函数的算法实现思路)
附属文件test2_function.h:
InitTriplet(&T, v1, v2, v3)
操作结果:构造三元组T,元素e1, e2和e3分别被赋以v1, v2, v3值 DestroyTriplet(&T)
操作结果:三元组T被销毁
Get(T, i, &e)
初始条件:三元组T已存在,1≤i≤3
操作结果:用e返回T的第i元的值
IsAscending(T)
初始条件:三元组T已存在
操作结果:如果T的三个元素按升序排列,则返回1,否则返回0
IsDecending(Triplet T);
初始条件: 三元组T已存在
操作结果: 如果T的三个元素按降序排列,则返回1,否则返回0 Put(&T, i, e)
初始条件:三元组T已存在,1≤i≤3
操作结果:改变T的第i元的值为e
Max(T, &e)
初始条件:三元组T已存在
操作结果:用e返回T的三个元素中的最大值
Min(T, &e)
初始条件:三元组T已存在
操作结果:用e返回T的三个元素中的最小值
} ADT Triplet
主文件中test2_main.cpp:
先编写开头文件,和调用子函数语句,
# include <iostream.h> // 包含输入(cin)、输出(cout)的头文件, #include <stdio.h> //若采用printf和scanf,则用stdio.h库函数 # include <stdlib.h> //常用函数的头文件
typedef int ElemType; // 定义三元组元素类型ElemType为整型
typedef ElemType *Triplet; //定义动态分配的三元组类型, 指针Triplet //指向ElemType类型元素的地址。初始化操作分配3个元素的存储空间 # include "test2_function.h" // 包含三元组基本操作的头文件
void main()
{
Triplet T; // ________
ElemType m;
int i;
i=InitTriplet(T, 1, 3, 5); //__ printf("调用初始化函数后,i=%d (1:成功;否则:不成功) ", i);
printf("\n三元组中三个元素的值分别为:\n");
printf("T[0]=%d, T[1]=%d, T[2]=%d", T[0], T[1], T[2]);
Get(T, 2, m); // ________
printf("\nT的第2个值为:%d", m) ;
Put(T, 2, 6); // ___ printf("\n改变后T的3个值为:%d, %d, %d", T[0], T[1], T[2]) ;
Max(T, m); // _________
printf("\nT中的最大值为:%d", m) ;
Min(T, m); //__________ printf("\nT中的最小值为:%d", m);
..................再增加判断三元组T是否按顺序排列.
DestroyTriplet(T); printf("\n销毁T后,T=%d\n", T);
}
四. 实验结果与分析
(包括运行结果截图、结果分析等)
五. 心得体会
(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。)
感觉程序越编越多,也复杂起来了,多步调用附属文件的子函数,且细节问题频频出现,需多加努力仔细.
【附录----源程序】
Test2_main:
#include<iostream.h> // 包含输入(cin)、输出(cout)的头文件, #include<stdio.h> //若采用printf和scanf,则用stdio.h库函数 #include<stdlib.h> //常用函数的头文件
typedef int ElemType; // 定义三元组元素类型ElemType为整型 typedef ElemType *Triplet; //定义动态分配的三元组类型, 指针Triplet //指向ElemType类型元素的地址。初始化操作分配3个元素的存储空间 # include "test2_function.h" // 包含三元组基本操作的头文件 void main()
{
Triplet T; // __定义整型指针T_______ ElemType m;
int i;
i=InitTriplet(T, 1, 3, 5); //____构造三元组T,元素e1, e2和e3分别被赋以v1, v2, v3值___
printf("调用初始化函数后,i=%d (1:成功;否则:不成功) ", i); printf("\n三元组中三个元素的值分别为:\n");
printf("T[0]=%d, T[1]=%d, T[2]=%d", T[0], T[1], T[2]); Get(T, 2, m); // __用e返回T的第i元的值____ printf("\nT的第2个值为:%d", m) ;
Put(T, 2, 6); // __改变T的第i元的值为e_______ printf("\n改变后T的3个值为:%d, %d, %d", T[0], T[1], T[2]) ; Max(T, m); // __用e返回T的三个元素中的最大值_____ printf("\nT中的最大值为:%d", m) ;
Min(T, m); //___用e返回T的三个元素中的最小值___ printf("\nT中的最小值为:%d", m);
if(IsAscending(T))
printf("\nT的三个元素按升序排列");
else
printf("\nT的三个元素不是按升序排列");
if(IsDecending(T))
printf("\nT的三个元素按降序排列");
else
printf("\nT的三个元素不是按降序排列");
DestroyTriplet(T); //___三元组T被销毁_______ printf("\n销毁T后,T=%d\n", T);
}
Test2_function:
/*初始化操作:*/
int InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{ // 操作结果:构造三元组T,依次置T的3个元素的初值为v1,v2和v3 // (见图2.3) ,经过此操作,系统将分配给三元组T一个起始地址 if (!(T=(ElemType *) malloc (3*sizeof(ElemType))))
exit(0); // 申请空间失败,退出系统
T[0]=v1; T[1]=v2; T[2]=v3;
return 1; // 若返回值为1,则初始化成功
}
/*用e返回T的第i元的值*/
int Get(ElemType *T,int i,ElemType &e)
{
e=T[i-1];
return e;
}
/*改变T的第i元的值为e*/
int Put(ElemType *T,int i,ElemType e)
{
T[i-1]=e;
return T[i-1];
}
/*如果T的三个元素按升序排列,则返回1,否则返回0*/ int IsAscending(Triplet T)
{
int i;
for(i=0;i<2;i++)
if(T[i]>T[i+1])
return 0;
return 1;
}
/*如果T的三个元素按降序排列,则返回1,否则返回0*/ int IsDecending(Triplet T)
{
int i;
for(i=0;i<2;i++)
if(T[i]<T[i+1])
return 0;
return 1;
}
/*用e返回T的三个元素中的最大值*/
void Max(Triplet T,ElemType &e)
{
int i;
e=T[0];
for(i=1;i<3;i++)
if(e<T[i])
e=T[i];
}
/*用e返回T的三个元素中的最小值*/ void Min(Triplet T,ElemType &e)
{
int i;
e=T[0];
for(i=1;i<3;i++)
if(e>T[i])
e=T[i];
}
/*销毁操作:*/
void DestroyTriplet(Triplet &T)
{ // 操作结果:三元组T被销毁
free(T);
T=NULL;
return;
}
正在阅读:
乐优记叙性散文阅读辅导公开课教案(重要)1331006-04
面向对象的程序设计第一讲 C 语言基础08-05
湖北省武汉市2010年九年级物理中考仿真试题三人教版07-18
吴城古镇恢复项目建议书08-08
家长学校学员测试卷301-15
最全最经典的有理数测试题06-27
中考作文如何审题05-16
物质的分类03-08
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 抽象
- 编码
- 表示
- 答案
- 类型
- 实验
- 实现
- 数据
- 人教版七年上语文第五单元字词
- 血液透析标准化操作规程
- 各式韩国料理的做法
- 2010 年进口废五金电器、废电线电缆和废电机定点加工利用单位名
- 2013年考研英语复试面试问答总结
- 2015年全国各地高考英语模拟试题_2015届辽宁省沈阳二中高三上学
- 日本实施企业标准化的经验介绍
- 苏教版五年级科学上总复习知识点打印版
- 快递服务标准(征求意见稿)
- 玉米胚芽油市场分析
- 人工挖孔桩工程劳务施工合同1B
- 标准日本语第9课_四川料理は辛いです
- 宁波大学数字媒体技术专业培养方案
- 团委副书记竞聘演讲
- 鲁教版六年级下册Unit4单元检测题
- 综合教程5-1 何兆熊
- 2022届云南省昆明一中高三上学期高中新课标第三次双基检测理综物
- 09小升初英语突击训练系列试卷九
- 法语最常用动词及用法
- 设计思维与表达------图形创意的语言表现