在正式写代码之前先来解释一下什么是三元组,个人理解三元组就是只有三个元素的数组,至于这个数组到底是什么类型的数组无关紧要,数组的类型可以由程序员自己定义,但不管是什么类型的数组,对其所做的操作都是一样的,这也是数据结构的精髓,只要结构相同,对应的操作就相同,只是实现起来细节上有略微差异而已。
具体实现#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; }
- 本篇三元组是通过动态分配的数组来实现的,用静态数组实现相对简单,有想法的选手可以用静态数组尝试一下。
- 形参列表中的形参为什么有的是引用类型而有的不是引用类型,这是一个值得时刻思考问题,因为在接下来的数据结构中依然会有这样的问题存在,如果还有选手没有搞不清楚的话,那么推荐你先看看《C++中的引用类型》这篇文章。
- 如果程序中有错误或者没有考虑到的地方,欢迎大家评论,互相学习,共同进步!



