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