1. 示例代码:
1)status.h
/* DataStructure 预定义常量和类型头文件 */
#ifndef STATUS_H
#define STATUS_H
/* 函数结果状态码 */
#define TRUE 1 /* 返回值为真 */
#define FALSE 0 /* 返回值为假 */
#define RET_OK 0 /* 返回值正确 */
#define INFEASIABLE 2 /* 返回值未知 */
#define ERR_MEMORY 3 /* 访问内存错 */
#define ERR_NULL_PTR 4 /* 空指针错误 */
#define ERR_MEMORY_ALLOCATE 5 /* 内存分配错 */
#define ERR_NULL_STACK 6 /* 栈元素为空 */
#define ERR_PARA 7 /* 函数参数错 */
#define ERR_OPEN_FILE 8 /* 打开文件错 */
typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如 OK 等 */
typedef int Bollean; /* Boolean 是布尔类型,其值是 TRUE 或 FALSE */
#endif // !STATUS_H
2) triplet.h
/* 抽象数据类型 Triplet 和 ElemType 的基本操作头文件 */
#ifndef TRIPLET_H
#define TRIPLET_H
#include "status.h"
#define SIZE 3
typedef int ElemType; /* 定义抽象数据类型 ElemType 在本程序中为整型 */
typedef ElemType* Triplet; /* 由 InitTriplet 分配三个元素存储空间 */
/* 操作结果:构造三元组 T,依次置 T 的三个元素的初值为 v1, v2 和 v3 */
Status InitTriplet(Triplet* T, ElemType v1, ElemType v2, ElemType v3);
/* 操作结果:三元组 T 被销毁 */
void DestroyTriplet(Triplet* T);
/* 初始条件:三元组 T 已存在,1 ≤ i ≤ 3。操作结果:用 e 返回 T 的第 i 元的值 */
Status Get(Triplet T, int i, ElemType* e);
/* 初始条件:三元组 T 已存在,1 ≤ i ≤3。操作结果:改变 T 的第 i 元的值为 e */
Status Put(Triplet T, int i, ElemType e);
/* 初始条件:三元组 T 已存在。操作结果:如果 T 的三个元素按升序排列,返回 1,否则返回 0 */
Bollean IsAscending(Triplet T);
/* 初始条件:三元组 T 已存在。操作结果:如果 T 的三个元素按降序排列,返回 1,否则返回 0 */
Bollean IsDescending(Triplet T);
/* 初始条件:三元组 T 已存在。操作结果:用 e 返回 T 的三个元素中的最大值 */
void Max(Triplet T, ElemType* e);
/* 初始条件:三元组 T 已存在。操作结果:用 e 返回 T 的三个元素中的最小值 */
void Min(Triplet T, ElemType* e);
#endif // !TRIPLET_H
3) triplet.c
/* 抽象数据类型 Triplet 和 ElemType 的基本操作实现 */
#include "triplet.h"
#include <stdlib.h> /* 提供 malloc() 函数原型*/
#include <stdio.h>
/* 操作结果:构造三元组 T,依次置 T 的三个元素的初值为 v1, v2 和 v3 */
Status InitTriplet(Triplet* T, ElemType v1, ElemType v2, ElemType v3)
{
*T = (ElemType*)malloc(sizeof(ElemType) * SIZE);
if (!(*T)) {
printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);
return ERR_MEMORY_ALLOCATE;
}
(*T)[0] = v1;
(*T)[1] = v2;
(*T)[2] = v3;
return RET_OK;
}
/* 操作结果:三元组 T 被销毁 */
void DestroyTriplet(Triplet* T)
{
free(*T);
*T = NULL;
}
/* 初始条件:三元组 T 已存在,1 ≤ i ≤ 3。操作结果:用 e 返回 T 的第 i 元的值 */
Status Get(Triplet T, int i, ElemType* e)
{
if (i < 1 || i > 3) {
printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);
return ERR_PARA;
}
*e = T[i - 1];
return RET_OK;
}
/* 初始条件:三元组 T 已存在,1 ≤ i ≤3。操作结果:改变 T 的第 i 元的值为 e */
Status Put(Triplet T, int i, ElemType e)
{
if (i < 1 || i > 3) {
printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);
return ERR_PARA;
}
T[i - 1] = e;
return RET_OK;
}
/* 初始条件:三元组 T 已存在。操作结果:如果 T 的三个元素按升序排列,返回 1,否则返回 0 */
Bollean IsAscending(Triplet T)
{
return (T[0] <= T[1] && T[1] <= T[2]);
}
/* 初始条件:三元组 T 已存在。操作结果:如果 T 的三个元素按降序排列,返回 1,否则返回 0 */
Bollean IsDescending(Triplet T)
{
return (T[0] >= T[1] && T[1] >= T[2]);
}
/* 初始条件:三元组 T 已存在。操作结果:用 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]);
}
/* 初始条件:三元组 T 已存在。操作结果:用 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]);
}
4) main.c
#include <stdio.h>
#include "status.h"
#include "triplet.h"
int main(void)
{
Triplet T;
/* 初始化三元组 */
Status ret = InitTriplet(&T, 5, 7, 9);
printf("初始化三元组%s, T[0] = %d, T[1] = %d, T[2] = %d\n\n", ret == RET_OK ? "成功" : "失败", T[0], T[1], T[2]);
/* 获取三元组第 i 个值 */
ElemType e;
int i = 2;
ret = Get(T, i, &e);
if (ret != RET_OK) {
printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ret);
return ret;
}
printf("获取成功,T 的第 %d 个值为:%d\n\n", i, e);
/* 改变三元组第 i 个值 */
e = 6;
ret = Put(T, i, e);
if (ret != RET_OK) {
printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ret);
return ret;
}
printf("改变三元组成功,T 的第 %d 个值为:%d\n\n", i, T[i - 1]);
/* 判断三元组是否升序 */
ret = IsAscending(T);
printf("该三元组为%s\n\n", ret == TRUE ? "升序" : "非升序");
/* 判断三元组是否降序 */
ret = IsDescending(T);
printf("该三元组为%s\n\n", ret == TRUE ? "降序" : "非降序");
/* 获取三元组中最大值 */
Max(T, &e);
printf("三元组中最大值为:%d\n\n", e);
/* 获取三元组中最小值 */
Min(T, &e);
printf("三元组中最小值为:%d\n\n", e);
/* 销毁三元组 */
DestroyTriplet(&T);
return 0;
}
2. 输出示例: