实验内容
基本要求:
设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
选作内容:
实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define LIST_INIT_SIZE 200//初始容量为200
typedef int Status;
typedef float ElemType;
typedef struct
{
ElemType *elem;
}Triplet;
// 创建一个三元组
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)
{
int i;
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,Status i,ElemType e)
{
if(i<1||i>3)
{
return FALSE;
}
L.elem[i-1]=e;
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])
{
return temp;
}else
{
return L.elem[2];
}
}
//求三元组的最小分量
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])
{
return temp;
}else
{
return L.elem[2];
}
}
//实现两个三元组的对应分量相加
ElemType sum(Triplet L,ElemType a,ElemType 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);
return sum;
}
//实现两个三元组的对应分量相减
ElemType DifferenceVaule(Triplet L,ElemType a,ElemType b)
{
if(a<1||a>3)
{
return FALSE;
}
if(b<1||b>3)
{
return FALSE;
}
a=Getelem(L,a);
b=Getelem(L,b);
return a-b;
}
//给三元组的各分量同乘一个比例因子(2)
ElemType CoRide(Triplet &L,ElemType a)
{
int i;
for(i=0;i<3;i++)
{
L.elem[i]=L.elem[i]*a;
}
}
//销毁三元组
DestroyTriplet(Triplet &L)
{
free(L.elem);
return OK;
}
int main()
{
Triplet T;
ElemType v0,v1,v2;
printf("请输入三元组的值:\n");
scanf("%f %f %f",&v0,&v1,&v2);
initTriplet(T,v0,v1,v2);
printf("输出三元组的值:");
print(T);
printf("\n");
printf("获取三元组中第二个值:%f\n",Getelem(T,2));
Putelem(T,2,11);
printf("将三元组中第二个值替换为11:");
print(T);
printf("\n");
printf("替换后三元组中最大值为:%f\n",max(T));
printf("替换后三元组中最小值为:%f\n",min(T));
printf("替换后三元组中第一个值和第二个值之和为:%f\n",sum(T,1,2));
printf("替换后三元组中第一个值和第二个值之差为:%f\n",DifferenceVaule(T,1,2));
printf("给三元组的各分量同乘一个比例因子(2):");
CoRide(T,2);
print(T);
DestroyTriplet(T);
return 0;
}
打印结果:
注意:
1:释放动态内存时要将结构体中的成员分别释放;(和开空间相对应)
2:int a[i] 中的i必须为整型,不能为浮点型
3:scanf读入时最后一个 %f 后面不能加空格