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"); } } }
控制台: