目录大纲:
一、抽象数据类型的格式定义
二、抽象数据类型三元组Triplet的定义
三、抽象数据类型三元组Triplet的表示与实现
文章内容引用清华大学出版社严蔚敏版《数据结构》并加以笔者注释
一、抽象数据类型的格式定义
ADT抽象数据类型名{
数据对象:
数据关系:
基本操作:
}ADT抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为
基本操作名(参数表)
初始条件:
操作结果:
基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头,除可提供输入值外,还将返回操作结果。
二、抽象数据类型三元组Triplet的定义
ADT Triplet{
数据对象:D = {e1, e2, e3|e1, e2, e3∈ElemSet(定义了关系运算的某个集合)}
数据关系:R1 = {, }
基本操作:
InitTriplet( &T, v1, v2, v3)
操作结果:构造了三元组T,元素e1, e2和e3分别被赋以参数v1,v2和v3的值。
DestroyTriplet( &T)
操作结果:三元组T被销毁。
Get( T, i, &e)
初始条件:三元组T已存在,1≤i≤3
操作结果:用e返回T的第i元的值。
Put( &T, i, e)
初始条件:三元组T已存在,1≤i≤3
操作结果:改变T的第i元的值为e
IsAscending( T)
初始条件:三元组T已存在
操作结果:如果T的3个元素按升序排列,则返回1,否则返回0
IsDescending( T)
初始条件:三元组T已存在
操作结果:如果T的3个元素按降序排列,则返回1,否则返回0
Max( T, &e)
初始条件:三元组T已存在
操作结果:用e返回T的3个元素中的最大值。
Min( T, &e)
初始条件:三元组T已存在
操作结果:用e返回T的3个元素中的最小值。
}ADT Triplet
三、抽象数据类型三元组Triplet的表示与实现
#include #include #include #include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2/*Status 是函数的类型,其值是函数结果状态代码*/ typedef int Status; /*数据元素类型*/ typedef float ElemType;/*将Triplet类型定义为ElemType指针类型*/typedef ElemType * Triplet;/*构造三元组T,将元素e1, e2和e3分别赋以参数v1,v2和v3的值*/ Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3);/*销毁三元组T*/ Status DestroyTriplet(Triplet &T);/*使用e返回T的第i元的值*/ Status Get(Triplet T, int i, ElemType &e);/*改变T的第i元的值为e*/ Status Put(Triplet &T, int i, ElemType e); /*若三元组T的元素为升序排列,则返回1,否则返回0*/ Status IsAscending(Triplet T); /*若三元组T的元素为降序排列,则返回1,否则返回0*/ Status IsDescending(Triplet T);/*使用e返回T的3个元素中的最大值*/ Status Max(Triplet T, ElemType &e); /*使用e返回T的3个元素中的最小值*/ Status Min(Triplet T, ElemType &e);int main(){/*定义三个三元组*/ Triplet T1, T2, T3;/*分别初始化三个三元组 */InitTriplet(T1, 1, 2.3, 1.2);InitTriplet(T2, 2, 3, 4);InitTriplet(T3, 5, 3, 1);ElemType e;/*获取T1中的第一个元素*/ if(Get(T1, 1, e)) {/*函数调用成功*/printf("T1的第1个元素值为%.2f\n", e); }e = 2.1;/*修改T1中的第一个元素*/ if(Put(T1, 1, e)) { printf("修改后的T1的第1个元素值为%.2f\n", e); }/*获取T2的最大元素*/ if(Max(T2, e)){printf("T2的最大元素值为%.2f\n", e); }/*获取T3的最小元素*/if(Min(T3, e)) {printf("T3的最小元素值为%.2f\n", e); }/*判断T2是否为升序*/if(IsAscending(T2)) {printf("T2元素为升序排列\n");}/*判断T3是否为降序*/ if(IsDescending(T3)){printf("T3元素为降序排列\n");}/*结束时销毁三元组,回收空间*/ DestroyTriplet(T1);DestroyTriplet(T2);DestroyTriplet(T3); return 0;}/*初始化三元组*/ Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3){T = (ElemType *)malloc(3 * sizeof(ElemType));//分配3个元素的存储空间if(!T)exit(OVERFLOW);//分配存储空间失败T[0] = v1;T[1] = v2;T[2] = v3;return OK; }/*销毁三元组*/ Status DestroyTriplet(Triplet &T){free(T);T = NULL;return OK;}/*使用e获取第i个元素的值*/ Status Get(Triplet T, int i, ElemType &e){/*检查元素是否存在*/ if(i 3)return ERROR;e = T[i - 1];return OK;}/*改变T中第i个元素的值为e*/ Status Put(Triplet &T, int i, ElemType e){/*检查元素是否存在*/ if(i 3)return ERROR;T[i - 1] = e;return OK; }/*返回三元组是否升序排列*/ Status IsAscending(Triplet T){return (T[0] <= T[1]) && (T[1] = T[1]) && (T[1] >= T[2]); }/*返回三元组中最大的元素值,赋值给e*/ Status 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]);//使用三目运算符 return OK; }/*返回三元组中最小的元素值,赋值给e*/ 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; }