1.实验名称
抽象数据类型的表示和实现
2.实验目的
(1)复习巩固C语言的结构体、指针、函数、动态分配内存等知识点。
(2)掌握抽象数据类型的定义、表示和实现,为后续实验打好基础。
3.实验内容
基本要求:
设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
选作内容:
实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。
4.数据类型描述(此处写清楚三元组的抽象数据类型描述)
三元组Triplet的定义:
ADT Triplet{
数据对象:D={e1,e2,e3|e1,e2,e3属于ElemType}
数据关系:R={<e1,e2>,<e2,e3>}
基本操作:
InitTrip(&L,v0,v1,v2)
{
初始条件:无
操作结果:构造三元组T,元素e1,e2,e3分别被赋予参数 v0,v1,v2的值。
}
DestroyTriplet(&L)
{
初始条件:三元组T已经存在;
操作结果:销毁三元组T;
}
GetElem(L,i)
{
初始条件:三元组T已经存在,1<=i<=3
操作结果:用e返回三元组的第i个元素。
}
PutElem(&T,i,e)
{
初始条件:三元组T已经存在,1<=i<=3
操作结果:将T的第i个元素的位置置为e
}
IsAscending(T)
{
初始条件:三元组T已经存在
操作结果:如果三元组T的三个元素按升序排序,则返回TRUE,否则返回FALSE
}
IsDescending(T)
{
初始条件:三元组T已经存在
操作结果:如果三元组T的三个元素按降序排序,则返回TRUE,否则返回FALSE
}
max(T)
{
初始条件:三元组已存在
操作结果:用e返回三元组中的最大值
}
min(T)
{
初始条件:三元组已存在
操作结果:用e返回三元组中的最小值
}
CoRide(L)
{
初始条件:三元组已存在
操作结果:给三元组的各分量同乘一个比例因子
}
DifferenceVaule(L)
{
初始条件:三元组已存在
操作结果:实现两个三元组的对应分量相减
}
Sum(L)
{
初始条件:三元组已存在
操作结果:实现两个三元组的对应分量相加
}
print(L)
{
初始条件:三元组已存在
操作结果:打印三元组的值
}
}ADT Triplet
代码:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define LIST_INIT_SIZE 200
typedef int Status;
typedef float ElemType;
typedef struct
{
ElemType *elem;
}Triplet;
ElemType e;
Status i;
//创建一个三元组
void initTriplet(Triplet &L,ElemType v0,ElemType v1,ElemType v2)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));L.elem[0]=v0;L.elem[1]=v1;L.elem[2]=v2;
}
//打印三元组
void print(Triplet &L)
{
for(i=0;i<3;i++){
printf("%f ",L.elem[i]);}
}
//取三元组的任意一个分量
ElemType Getelem(Triplet L,Status i)
{
if(i<1||i>3){
return FALSE;}ElemType e=L.elem[i-1];return e;
}
//置三元组的任意一个分量
ElemType Putelem(Triplet &L)
{
printf("请输入需要置换元素的位置:");scanf("%d",&i); printf("请输入置换的元素:");scanf("%f",&e); if(i<1||i>3){
return FALSE;}L.elem[i-1]=e;printf("置换后的三元组为:");print(L);return OK;
}
//求三元组的最大分量
ElemType max(Triplet L)
{
Status temp;if(L.elem[0]>L.elem[1]){
temp=L.elem[0];}else{
temp=L.elem[1];}if(temp>L.elem[2]){
e=temp;}else{
e=L.elem[2];}printf("%f",e);
}
//求三元组的最小分量
ElemType min(Triplet L)
{
Status temp;if(L.elem[0]<L.elem[1]){
temp=L.elem[0];}else{
temp=L.elem[1];}if(temp<L.elem[2]){
e=temp;}else{
e=L.elem[2];}printf("%f",e);
}
//实现两个三元组的对应分量相加
ElemType Sum(Triplet L)
{
Status a,b;printf("请输入三元组的两个位置:");scanf("%d",&a);scanf("%d",&b);if(a<1||a>3){
return FALSE;}if(b<1||b>3){
return FALSE;}ElemType sum=0;sum+=Getelem(L,a);sum+=Getelem(L,b);printf("%f",sum);return OK;
}
//实现两个三元组的对应分量相减
ElemType DifferenceVaule(Triplet L)
{
Status a,b;ElemType c,d;printf("请输入三元组的位置:");scanf("%d %d",&a,&b);if(a<1||a>3){
return FALSE;}if(b<1||b>3){
return FALSE;}c=Getelem(L,a);d=Getelem(L,b);printf("%f",c-d);return OK;}
//给三元组的各分量同乘一个比例因子(2)
ElemType CoRide(Triplet &L)
{
ElemType a;printf("请输入需要同乘的值:");scanf("%f",&a);int i;for(i=0;i<3;i++){
L.elem[i]=L.elem[i]*a;}print(L);
}
Status isAscending(Triplet T)
{
return (T.elem[0]<=T.elem[1])&&(T.elem[1]<=T.elem[2]);
}
Status isDecending(Triplet T)
{
return (T.elem[0]>=T.elem[1])&&(T.elem[1]>=T.elem[2]);
}
//销毁三元组
DestroyTriplet(Triplet &L)
{
free(L.elem);printf("三元组已销毁"); return OK;
}
ElemType menu(Triplet &T)
{
Status i,val;printf("**********************************\n");printf("| 欢迎使用 |\n");printf("1:显示三元组的值 \n");printf("2:获取三元组中第n个值 \n");printf("3:三元组中最大值 \n");printf("4:三元组中最小值 \n");printf("5:置三元组的任意一个分量 \n");printf("6:两个三元组的对应分量相加 \n");printf("7:两个三元组的对应分量相减 \n");printf("8:给三元组的各分量同乘一个比例因子\n");printf("9:销毁三元组 \n");printf("10:判断是否升序(如果T的三个元素按升序排序,则返回1,否则返回0) \n");printf("11:判断是否升序(如果T的三个元素按降序排序,则返回1,否则返回0) \n"); printf("**********************************\n");printf("输入数字选取您所需要的功能 \n");scanf("%d",&val); switch(val){
case 1:print(T);break;case 2:printf("请输入需要获取元素的位置:");scanf("%d",&i);printf("%f",Getelem(T,i));break;case 3:max(T);break; case 4:min(T);break;case 5:Putelem(T);break;case 6:Sum(T);break;case 7:DifferenceVaule(T);break;case 8:CoRide(T);break;case 9:DestroyTriplet(T);break;case 10:printf("%d",isAscending(T));break;case 11:printf("%d",isDecending(T));break; }
}
int main()
{
Status j,k;Triplet T;ElemType v0,v1,v2;printf("请输入三元组的值:\n");scanf("%f %f %f",&v0,&v1,&v2);initTriplet(T,v0,v1,v2);for(j=0;j<100;j++){
printf("是否执行程序?(1代表继续执行,0代表终止程序)\n");scanf("%d",&k);if(k!=1){
break;}if(k==0){
break;}else{
menu(T);printf("\n");}}
}
控制台: