实现抽象数据类型“三元组”,动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef float ElemType;
typedef struct
{
ElemType e[3];
}Triplet;
//创建三元组
Triplet *InitTriplet(Triplet *T,ElemType v0,ElemType v1,ElemType v2,Status i)
{
printf("请输入三元组的三个分量值(以空格相间):\n");
scanf("%f %f %f",&v0,&v1,&v2);
T=(Triplet*)malloc(sizeof(Triplet));
T->e[0]=v0;
T->e[1]=v1;
T->e[2]=v2;
printf("三元组的三个分量值分别为:\n");
for(i=0;i<3;i++)
{
printf("%4.2f ",T->e[i]);
}
printf("\n");
return T;
}
//重置三元组
Status DestroyTriplet(Triplet *T)
{
if(T)
{
free(T);
printf("重置成功!\n");
return OK;
}
else
printf("三元组不存在!\n");
}
//取三元组的第i个分量
Status Get(Triplet *T,int i)
{
printf("请输入您需要的分量的序号\n");
scanf("%d",&i);
if(i<1||i>3)
{
printf("输入非法!\n");
return ERROR;
}
else
{
printf("第%d个分量的值为:%4.2f\n",i,T->e[i-1]);
return OK;
}
}
//置三元组的第i个分量
Status Put(Triplet *T,Status i,ElemType e)
{
printf("请输入您所置分量的序号及要置的值(以空格相间)\n");
scanf("%d %f",&i,&e);
if(i<1||i>3)
{
return ERROR;
}
else
{
T->e[i-1]=e;
printf("已将第%d个分量的值修改为:%4.2f\n",i,T->e[i-1]);
printf("修改后三元组的三个分量值分别为:\n");
for(i=0;i<3;i++)
{
printf("%4.2f ",T->e[i]);
}
printf("\n");
return OK;
}
}
//判断升序
Status IsAscending(Triplet *T)
{
return(T->e[0]<=T->e[1]&&T->e[1]<=T->e[2]);
}
//判断降序
Status IsDescending(Triplet *T)
{
return(T->e[0]>=T->e[1]&&T->e[1]>=T->e[2]);
}
//求三元组的最大分量
ElemType getMax(Triplet *T,ElemType e)
{
e=-99999;
int i=0;
for(i=0;i<3;i++)
{
if(T->e[i]>=e)
e=T->e[i];
}
printf("该三元组中的最大分量为:%4.2f\n",e);
}
//求三元组的最小分量
ElemType getMin(Triplet *T,ElemType e)
{
e=99999;
int i=0;
for(i=0;i<3;i++)
{
if(T->e[i]<=e)
e=T->e[i];
}
printf("该三元组中的最小分量为:%4.2f\n",e);
}
void menu()
{
printf("请输入菜单选项: *\n");
printf("1 创建三元组 *\n");
printf("0 退出系统 *\n");
printf("**************************\n");
}
void menu1()
{
printf("**************************\n");
printf("请输入菜单选项: *\n");
printf("0 退出系统 *\n");
printf("1 取三元组的第i个分量 *\n");
printf("2 置三元组的第i个分量 *\n");
printf("3 判断三元组升降序 *\n");
printf("4 取三元组的最大分量 *\n");
printf("5 取三元组的最小分量 *\n");
printf("6 销毁三元组并重新创建 *\n");
printf("**************************\n");
}
int main()
{
Triplet *T;
Status flag,flog,i;
ElemType v0,v1,v2,e,m=1;
printf("***欢迎使用三元组处理器***\n");
while(1)
{
menu();
scanf("%d",&flag);
getchar();
switch(flag)
{
case 0:{
printf("正在退出,请稍候");
printf(".");
printf(".");
printf(".");
system("cls");
printf("*******欢迎下次使用*******\n");
return 0;
}
case 1:T=InitTriplet(T,v0,v1,v2,i);
while(m=1)
{
menu1();
scanf("%d",&flog);
getchar();
switch(flog)
{
case 0: printf("正在退出,请稍候");
printf(".");
printf(".");
printf(".");
system("cls");
printf("*******欢迎下次使用*******\n");
return 0;
case 1:Get(T,i);
break;
case 2:Put(T,i,e);
break;
case 3:if(IsAscending(T))
{
printf("该三元组的元素为升序排列\n");
}
else if(IsDescending(T))
{
printf("该三元组的元素为降序排列\n");
}
else
{
printf("该三元组的元素非升降序排列\n");
break;
}
break;
case 4:getMax(T,e);
break;
case 5:getMin(T,e);
break;
case 6:printf("正在销毁,请稍候");
printf(".");
printf(".");
printf(".");
DestroyTriplet(T);
system("cls");
T=InitTriplet(T,v0,v1,v2,i);
break;
}
}
break;
}
}
}