数据结构之三元组的实现
思路的构建
三元组的实现
1、必要的头文件
2、相关操作集
3、主函数调用实现最终的功能
头文件
#include<malloc.h>
#include<math.h>//包含OVERFLOW=3
#include<stdlib.h>//包含exit函数
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//经Hope.133发现,该例子中可不用定义SElemType类型
//20220922修改
//typedef int SElemType;
//20201001添加
typedef ElemType *Triplet;
操作集
1.构造三元组
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)
{
//传参列表为三元组指针,元素一、二、三
//通过malloc函数为三元组分配三个元素的空间
T=(ElemType *)malloc(3*sizeof(ElemType));
//分配失败
if(!T)
exit(OVERFLOW);
T[0]=v1;T[1]=v2;T[2]=v3;
return OK;
}
2.销毁三元组
Status DestroyTriplet(Triplet &T)
{
//传参为三元组
free(T);
T=NULL;
return OK;
}
3.返回三元组某个位置的值
Status GetElem(Triplet T,int i,ElemType &e)
{
//传参为三元组,位置i和用来返回数值的参数e,这里的三元组不需要修改,传递实参
//判断是否输入正确
if(i<1||i>3)
return ERROR;
//正确则将i-1的值赋给e
else
e=T[i-1];
return OK;
}
4.改变某个位置的值
Status Replace(Triplet &T,int i,ElemType e)
{
//传参为三元组,位置i和替换元素e
//判断i的位置是否为1-3
if(i<1||i>3)
return ERROR;
//将e的值付给三元组i-1的位置
else
T[i-1]=e;
return OK;
}
5.将三元组升序排列
Status IsAscending(Triplet T)
{
//值只有三个,可以直接通过两两比较判断是否为升序
//若值有很多个,可通过for循环判断是否为升序
return (T[0]<=T[1]&&T[1]<T[2]);
}
6.将三元组降序排列
Status IsDescending(Triplet T)
{
//方法同升序
return (T[0]>T[1]&&T[1]>T[2]);
}
7.返回三元组最大值
Status Max(Triplet T,ElemType &e)
{
//传参为三元组,返回参数e
//直接通过判断语句返回最大值
e=(T[0]>=T[1])?((T[0]>=T[2])?T[0]:T[2]):((T[1]>=T[2])?T[1]:T[2]);
return OK;
}
8.返回三元组最小值
Status Min(Triplet T,ElemType &e)
{
//传参方法同最大值
e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]):((T[1]<=T[2])?T[1]:T[2]);
return OK;
}
主函数的实现
int main()
{
//创建三元组对象T
Triplet T;
//构建元素m
ElemType m;
//执行函数完成的状态
Status i;
//构建三元组
i=InitTriplet(T,0,0,0);
printf("构造的三元组状态为%d,元素为%d,%d,%d\n",i,T[0],T[1],T[2]);
system("pause");
//查询操作
int a;
printf("请选择1-3来选择要查询的数\n");
scanf("%d",&a);
i=GetElem(T,a,m);
printf("查询状态%d,查询的数为%d\n",i,m);
system("pause");
//循环修改操作
int isRound=1;
while(isRound)
{
int n=-1;
printf("请输入需要修改数的位置和修改后的值,用空格隔开\n");
scanf("%d %d",&n,&m);
i=Replace(T,n,m);
printf("修改状态为%d,修改后的三元组为%d,%d,%d\n",i,T[0],T[1],T[2]);
printf("继续修改请按1,退出修改按0\n");
scanf("%d",&isRound);
}
//判断三元组是否为升序
i=IsAscending(T);
printf("三元组为升序的状态为%d,(0为否,1为是)\n",i);
system("pause");
//判断三元组是否为降序
i=IsDescending(T);
printf("三元组为降序的状态为%d,(0为否,1为是)\n",i);
system("pause");
//最大值
i=Max(T,m);
printf("函数执行状态为%d,最大值为%d\n",i,m);
system("pause");
//最小值
i=Min(T,m);
printf("函数执行状态为%d,最小值为%d\n",i,m);
system("pause");
return 0;
}
执行结果如图
PS:经过网友指正,缺少一个Triplet的声明,在原文已添加。
总结:三元组的实现需要注意传参问题,实参与形参的知识点一定要牢记。附源代码一份(https://download.youkuaiyun.com/download/qq_37002607/11387345)
(https://github.com/idong1e/DataStruct)