栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【数据结构】动态三元组的实现(附带详细注释)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【数据结构】动态三元组的实现(附带详细注释)

开场白

在正式写代码之前先来解释一下什么是三元组,个人理解三元组就是只有三个元素的数组,至于这个数组到底是什么类型的数组无关紧要,数组的类型可以由程序员自己定义,但不管是什么类型的数组,对其所做的操作都是一样的,这也是数据结构的精髓,只要结构相同,对应的操作就相同,只是实现起来细节上有略微差异而已。

具体实现

#include 	// printf、scanf函数所在的头文件
#include  // exit函数所在的头文件
#include 	// malloc、free函数所在的头文件
#include 	// 宏OVERFLOW所在的头文件,OVERFLOW的值为3

// 按照严蔚敏老师书中的编程习惯,定义如下几个宏
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef int Status;		// Status是函数返回值的类型,其返回的是函数执行结果的状态
typedef int ElemType;	// ElemType是元素类型,想要整体改变元素的数据类型只需改变ElemType前的数据类型即可

typedef ElemType* Triplet; // 本程序以int类型的三元组为例



void init_triplet(Triplet&, ElemType, ElemType, ElemType);
void destroy_triplet(Triplet&);
Status get_element(Triplet, int, ElemType&);
Status change_element(Triplet, int, ElemType);
Status is_ascending(Triplet);
Status is_descending(Triplet);
void max(Triplet, ElemType&);
void min(Triplet, ElemType&);
void print_triplet(Triplet);



// 用e1,e2,e3三个元素初始化三元组T
void init_triplet(Triplet& T, ElemType e1, ElemType e2, ElemType e3)
{
	T = (ElemType*)malloc(sizeof(ElemType) * 3); // 动态分配三个元素的存储空间
	if (!T) // 如果T不存在,则分配失败并退出程序
		exit(OVERFLOW);

	T[0] = e1, T[1] = e2, T[2] = e3; // 分配成功后,T即为该三元组的数组名
}

// 销毁三元组T
void destroy_triplet(Triplet& T)
{
	free(T); // 释放T所指向三元组的存储空间
	T = NULL; // 将T置为空,T不再指向任何存储单元
}

// 获取三元组T中第pos个元素,并用e返回其值
Status get_element(Triplet T, int pos, ElemType& e)
{
	if (pos < 1 || pos > 3) // pos的范围:1 ≤ pos ≤ 3
		return ERROR;

	e = T[pos - 1]; // 下标为pos-1的元素为三元组中第pos个元素,将其值赋给e
	return OK;
}

// 将三元组T中第pos个元素的值改为e
Status change_element(Triplet T, int pos, ElemType e)
{
	if (pos < 1 || pos > 3) // pos的范围:1 ≤ pos ≤ 3
		return ERROR;

	T[pos - 1] = e; // 下标为pos-1的元素为三元组中第pos个元素,将e赋给该元素
	return OK;
}

// 判断三元组T中的元素是否按升序排列,如果是则返回1,不是则返回0
Status is_ascending(Triplet T)
{
	return (T[0] <= T[1] && T[1] <= T[2]); 
}

// 判断三元组T中的元素是否按降序排列,如果是则返回1,不是则返回0
Status is_descending(Triplet T)
{
	return (T[0] >= T[1] && T[1] >= T[2]);
}

// 用e返回三元组T的最大值
void max(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]);
	// 上行代码是三目运算符(也叫条件运算符)的嵌套使用,如果不太明白的话,可以看下面的代码
	
}

// 用e返回三元组T的最小值
void 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]);
	// 上行代码是三目运算符(也叫条件运算符)的嵌套使用,如果不太明白的话,可以看下面的代码
	
}

// 依次输出三元组T中的各元素
void print_triplet(Triplet T)
{
	printf("%d %d %dn", T[0], T[1], T[2]);
}



int main()
{
	Triplet T;
	ElemType e;
	int i;
	
	init_triplet(T, 5, 7, 9); // 测试初始化三元组的函数
	printf("初始化T后,T = %pn", T); // %p用来将指针变量的内容以十六进制输出
	
	printf("T中的三个元素依次为:");
	print_triplet(T); // 测试输出三元组的函数

	i = get_element(T, 2, e); // 测试获取元素的函数
	if (i)
		printf("T中的第二个元素为%dn", e);

	i = change_element(T, 2, 6); // 测试修改元素的函数
	if (i)
	{
		printf("将T中的第二个元素改为6后,T中的三个元素依次为:");
		print_triplet(T);
	}

	i = is_ascending(T); // 测试是否升序的函数
	printf("T中的元素是否升序排列?%d(1 是,0 否)n", i);

	i = is_descending(T); // 测试是否降序的函数
	printf("T中的元素是否降序排列?%d(1 是,0 否)n", i);

	max(T, e); // 测试获取最大值的函数
	printf("T中的最大值为%dn", e);

	min(T, e);// 测试获取最小值的函数
	printf("T中的最小值为%dn", e);

	destroy_triplet(T); // 测试销毁三元组的函数
	printf("销毁T后,T = %pn", T);
		
	return 0;
}
结尾语
  1. 本篇三元组是通过动态分配的数组来实现的,用静态数组实现相对简单,有想法的选手可以用静态数组尝试一下。
  2. 形参列表中的形参为什么有的是引用类型而有的不是引用类型,这是一个值得时刻思考问题,因为在接下来的数据结构中依然会有这样的问题存在,如果还有选手没有搞不清楚的话,那么推荐你先看看《C++中的引用类型》这篇文章。
  3. 如果程序中有错误或者没有考虑到的地方,欢迎大家评论,互相学习,共同进步!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号