基本要求:
设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
选作内容:
实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef float ElemType;
typedef ElemType *Triplet;
//1.动态存储分配初始化三元组T
Status initTriplet(Triplet &T, ElemType v1,ElemType v2,ElemType v3)
{
T =(ElemType*)malloc(3*sizeof(ElemType));
if (!T)
exit(OVERFLOW);
T[0] = v1;
T[1] = v2;
T[2] = v3;
return OK;
}
//2.输出三元组
void printTriplet(Triplet T)
{
printf("三元组为:%f %f %f\n", T[0], T[1], T[2]);
}
//3.取三元组的任意一个分量
Status Get(Triplet T,Status i,ElemType &e)
{
if(i<1||i>3)
return ERROR;
else
e=T[i-1];
return OK;
}
//4.置三元组T的第i元的值为e
Status Put(Triplet &T,Status i,ElemType e)
{
if(i<1||i>3)
return ERROR;
else
T[i-1]=e;
return OK;
}
//5.求三元组的最大分量
Status GetMax(Triplet T, ElemType &e)
{
Status j;
e=T[0];
for(j=1;j<3;j++)
{
if(e >= T[j])
continue;
else if(e < T[j])
e = T[j];
}
printf("最大分量为:%f\n", e);
return OK;
}
//6.求三元组的最小分量
Status GetMin(Triplet T, ElemType &e)
{
Status j;
e=T[0];
for(j=1;j<3;j++)
{
if(e <= T[j])
continue;
else if(e > T[j])
e = T[j];
}
printf("最小分量为:%f\n", e);
return OK;
}
//7.实现该三元组的对应分量相加 eg.第二位和第三位
ElemType Addition(Triplet T, Status a, Status b)
{
if(a<1||a>3)
{
return ERROR;
}
if(b<1||b>3)
{
return ERROR;
}
ElemType sum = 0;
ElemType c, d;
Get(T,a,c);
Get(T,b,d);
sum = c+d;
printf("同乘后第%d位和第%d位分量相加为:%f\n",a, b, sum);
return OK;
}
//8.实现该三元组的对应分量相减 eg.第二位和第三位
ElemType Subtract (Triplet T, Status a, Status b)
{
if(a<1||a>3)
{
return ERROR;
}
if(b<1||b>3)
{
return ERROR;
}
ElemType sub = 0, c, d;
Get(T,a,c);
Get(T,b,d);
sub = c-d;
printf("第%d位和第%d位分量相减为:%f\n",a, b, sub);
return OK;
}
//9.给三元组的各分量同乘一个比例因子
ElemType Homology(Triplet &T,Status a)
{
int n;
for(n=0;n<3;n++)
{
T[n]=T[n]*a;
}
printf("同乘%d后三元组为:%f %f %f\n", a, T[0], T[1], T[2]);
return OK;
}
//10.销毁三元组
Status DestroyTriplet(Triplet &T)
{
free(T);
T=NULL;
return OK;
}
//主函数
Status main()
{
Triplet T, T1;
ElemType v1, v2, v3;
ElemType e, yz;//yz为比例因子, a,b为相加位数,c,d为相减位数
Status a, b, c, d;
Status i;
printf("给三元组T赋值:\n");
scanf("%f %f %f", &v1, &v2, &v3);
initTriplet(T, v1, v2, v3);//1.初始化三元组
printTriplet(T);//2.输出三元组
Get(T,i,e);//3.取三元组的任意一个分量
Put(T,i,e);//4.置三元组T的第i元的值为e
GetMax(T,e);//5.求三元组的最大分量
GetMin(T,e);//6.求三元组的最小分量
printTriplet(T);//再次显示三元组
//7.实现该三元组的对应分量相加 eg.第一位和第三位
Addition(T,1,3);
//8.实现该三元组的对应分量相减 eg.第二位和第三位
Subtract(T,2,3);
//9.给三元组的各分量同乘一个比例因子
printf("请输入三元组各分量同乘的一个比例因子:\n");
scanf("%f", &yz);
Homology(T,yz);
//10.销毁三元组
DestroyTriplet(T);
return OK;
}