数据结构(C语言) 抽象数据类型Triplet的表示和实现
抽象数据类型
抽象数据类型(abstract data type,ADT)是指一个数学模型以及定义在该模型上的一组操作,取决于其逻辑特性。可通过固有数据类型来表示和实现,利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
采用动态分配的顺序存储结构
typedef ElemType* Triplet; //由InitTriplet分配3个元素存储空间
基本操作的函数原型说明
//----基本操作的函数原型说明----
Status InitTriplet(Triplet& T, ElemType v1, ElemType v2, ElemType v3);
//操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2和v3的值。
Status DestroyTriplet(Triplet& T);
//操作结果:三元组T被销毁。
Status Get(Triplet T, int i, ElemType& e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:用e返回T的i元的值
Status Put(Triplet& T, int i, ElemType e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:改变T的第i元的值为e。
Status IsAscending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按升序排列,则返回1,否则返回0。
Status IsDescending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按降序排列,则返回1,否则返回0。
Status Max(Triplet T, ElemType& e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的三个元素中的最大值。
Status Min(Triplet T, ElemType& e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的三个元素中的最小值。
基本操作的实现
Status InitTriplet(Triplet& T, ElemType v1, ElemType v2, ElemType v3)
{
T = (ElemType*)malloc(3 * sizeof(ElemType));
if (!T)
exit(OVERFLOW);
T[0] = v1; T[1] = v2; T[2] = v3;
return OK;
}//InitTriplet
Status DestroyTriplet(Triplet& T)
{
free(T); T = NULL;
return OK;
}//DestroyTriplet
Status Get(Triplet T, int i, ElemType& e)
{
if (i < 1 || i>3)
return ERROR; //ERROR==0
e = T[i - 1];
return OK;
}
Status Put(Triplet& T, int i, ElemType e)
{
if (i < 1 || i>3)
return ERROR; //ERROR==0
T[i - 1] = e;
return OK;
}//Put
Status IsAscending(Triplet T)
{
return (T[0] <= T[1]) && (T[1] <= T[2]);
}//IsAscending
Status IsDescending(Triplet T)
{
return (T[0] >= T[1]) && (T[1] >= T[2]);
}//IsDescending
Status Max(Triplet T, ElemType& e)
{
//用e返回指向T的最大元素的值。
e = (T[0] > T[1] ? T[0] : T[1]) > (T[1] > T[2] ? T[1] : T[2]) ? (T[0] > T[1] ? T[0] : T[1]) : (T[1] > T[2] ? T[1] : T[2]);
return OK;
}//Max
Status Min(Triplet T, ElemType& e)
{
e = (T[0] < T[1] ? T[0] : T[1]) < (T[1] > T[2] ? T[1] : T[2]) ? (T[0] < T[1] ? T[0] : T[1]) : (T[1] < T[2] ? T[1] : T[2]);
return OK;
}//Min
最大值编写思路:Max{x1,x2,x3}=Max{Max{x1,x2},Max{x2,x3}}
完整代码
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; //Status是函数的类型,其值是函数结果状态代码
typedef int ElemType;
//----采用动态分配的顺序存储结构----
typedef ElemType* Triplet; //由InitTriplet分配3个元素存储空间
//----基本操作的函数原型说明----
Status InitTriplet(Triplet& T, ElemType v1, ElemType v2, ElemType v3);
//操作结果:构造了三元组T,元素e1,e2和e3分别被赋以参数v1,v2和v3的值。
Status DestroyTriplet(Triplet& T);
//操作结果:三元组T被销毁。
Status Get(Triplet T, int i, ElemType& e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:用e返回T的i元的值
Status Put(Triplet& T, int i, ElemType e);
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:改变T的第i元的值为e。
Status IsAscending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按升序排列,则返回1,否则返回0。
Status IsDescending(Triplet T);
//初始条件:三元组T已存在。
//操作结果:如果T的3个元素按降序排列,则返回1,否则返回0。
Status Max(Triplet T, ElemType& e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的三个元素中的最大值。
Status Min(Triplet T, ElemType& e);
//初始条件:三元组T已存在。
//操作结果:用e返回T的三个元素中的最小值。
Status PrintTriplet(Triplet T);
//初始条件:三元组T已存在。
//操作结果:查看三元组每个元素。
Status InitTriplet(Triplet& T, ElemType v1, ElemType v2, ElemType v3)
{
T = (ElemType*)malloc(3 * sizeof(ElemType));
if (!T)
exit(OVERFLOW);
T[0] = v1; T[1] = v2; T[2] = v3;
return OK;
}//InitTriplet
Status DestroyTriplet(Triplet& T)
{
free(T); T = NULL;
return OK;
}//DestroyTriplet
Status Get(Triplet T, int i, ElemType& e)
{
if (i < 1 || i>3)
return ERROR; //ERROR==0
e = T[i - 1];
return OK;
}
Status Put(Triplet& T, int i, ElemType e)
{
if (i < 1 || i>3)
return ERROR; //ERROR==0
T[i - 1] = e;
return OK;
}//Put
Status IsAscending(Triplet T)
{
return (T[0] <= T[1]) && (T[1] <= T[2]);
}//IsAscending
Status IsDescending(Triplet T)
{
return (T[0] >= T[1]) && (T[1] >= T[2]);
}//IsDescending
Status Max(Triplet T, ElemType& e)
{
//用e返回指向T的最大元素的值。
e = (T[0] > T[1] ? T[0] : T[1]) > (T[1] > T[2] ? T[1] : T[2]) ? (T[0] > T[1] ? T[0] : T[1]) : (T[1] > T[2] ? T[1] : T[2]);
return OK;
}//Max
Status Min(Triplet T, ElemType& e)
{
e = (T[0] < T[1] ? T[0] : T[1]) < (T[1] > T[2] ? T[1] : T[2]) ? (T[0] < T[1] ? T[0] : T[1]) : (T[1] < T[2] ? T[1] : T[2]);
return OK;
}//Min
Status PrintTriplet(Triplet T)
{
printf("抽象数据类型Triplet:");
for (int i = 0; i < 3; i++)
printf("%d ", T[i]);
printf("\n");
return OK;
}
int main()
{
Triplet T;
InitTriplet(T, 3, 4, 2);
int num1, num2, num3; //用来存放抽象数据类型数据元素
Get(T, 1, num1);
Get(T, 2, num2);
Get(T, 3, num3);
PrintTriplet(T);
Put(T, 2, 1);
PrintTriplet(T);
if (IsAscending(T))
printf("抽象数据类型Triplet由小到大排列!\n");
else if (IsDescending(T))
printf("抽象数据类型Triplet由大到小排列!\n");
else
printf("排列大小无规则\n");
int max, min;//记录最大值与最小值
Max(T, max);
Min(T, min);
printf("最大值为:%d,最小值为:%d", max, min);
return 0;
}