数据结构之三元组的实现

数据结构之三元组的实现

思路的构建

三元组的实现
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.csdn.net/download/qq_37002607/11387345)
(https://github.com/idong1e/DataStruct)

  • 28
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值