#include <stdio.h>
#include <stdlib.h> //exit()
#include <math.h> //OVERFLOW
/*函数结果状态代码*/
#define TRUE  1
#define FALSE 0
#define OK   1
#define ERROR 0

typedef int Status;
typedef int Boolean;
typedef int ElemType;
typedef ElemType * Triplet;
//操作结果:构造三元组T,依次设置T的3个元素的初始值为v1,v2,v3。
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{
    T = (ElemType *) malloc(sizeof(ElemType) * 3); //分配3个元素的存储空间
    if(! T) //当T===NULL
    {
        exit(OVERFLOW); //分配失败则退出
    }
    T[0] = v1;
    T[1] = v2;
    T[2] = v3;
    return OK;
}
//操作结果:三元组T被销毁。
Status DestroyTriplet(Triplet &T)
{
    free(T); //释放T所指的三元组存储空间
    T = NULL; //T不再指向任何存储单元
    return OK;
}
//初始条件:三元组T已存在,1<=i<=3。
//操作结果:用e返回T的第i元的值。
Status Get(Triplet T, int i, ElemType &e)
{
    if(i < 1 || i > 3) //i不在三元组的范围之内
    {
        return ERROR;
    }
    e = T[i - 1]; //将三元组T的第i个元素的值赋给e
    return OK;
}
//初始条件:三元组T已存在。
//操作结果:T改变T的第i元的值为e。
Status Put(Triplet T, int i, ElemType e)
{
    if(i < 1 || i > 3)
    {
        return ERROR;
    }
    T[i - 1] = e; //将e的值赋给三元组T的第i个元素
    return OK;
}
//初始条件:三元组T已存在。
//操作结果:如果三元组T的3个元素按升序排列,则返回1;否则返回0。
Status IsAscending(Triplet T)
{
    return (T[0] <= T[1] && T[1] <= T[2]);
}
//初始条件:三元组T已存在。
//操作结果:如果三元组T的3个元素按降序排列,则返回1;否则返回0。
Status IsDescending(Triplet T)
{
    return (T[0] >= T[1] && T[1] >= T[2]);
}
//初始条件:三元组T已存在。
//操作结果:用e返回指向T的最大元素的值。
Status Max(Triplet T, ElemType &e)
{
    /*用if else判断
    if(T[0] >= T[1])
    {
        if(T[0] >= T[2])
        {
            e = t[0];
        }
        else
        {
            e = t[2];
        }
    }
    else
    {
        if(t[1] >= T[2])
        {
            e = T[1];
        }
        else
        {
            e = T[2];
        }
    }
    */
    e = (T[0] >= T[1]) ? (T[0] >= T[2] ? T[0] : T[2]) : (T[1] >= T[2] ? T[1] : T[2]); //只在T[0]>=T[1]>=T[2]返回真
    return OK;
}
//初始条件:三元组T已存在。
//操作结果:用e返回指向T的最小元素的值。
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;
}
//输出元素的值
void printE(ElemType e)
{
    printf("%d\n", e);
}
//依次输出三元组的值
void printT(Triplet T)
{
    printf("%d, %d, %d\n", T[0], T[1], T[2]);
}
//打印分界
void printStar(int n)
{
    for(int j = 0; j <= n; j ++)
    {
        printf("*");
    }
    printf("\n");
}

void main()
{
    Triplet T;
    ElemType m;
    Status i;
    int num1;
    int num2;
    int num3;

    printStar(50);
    i = InitTriplet(T, 5, 7, 9);
    printf("Call InitTriplet() after , T = %u\n", T);
    printf("i = %d (1: success). Call printT() after T[0], T[1], T[2] valuse is: ",i);
    printT(T);
    printf("Please select T[num] output, 1 <= num <= 3\n");
    scanf("%d", &num1);
    while(num1 < 1 || num1 > 3)
    {
        printf("You're input error number\n");
        printf("Please select T[num] output, 1 <= num <= 3\n");
        scanf("%d", &num1);
    };
    i = Get(T, num1, m);
    if(OK == i)
    {
        printf("Call Get() after, T[%d] = %d\n", num1,m);
    }

    printf("Please select change T[num], 1 <= num < 3\nPlease input T[num]'s values _3,9_:");
    scanf("%d,%d", &num2,&num3);
    while(num2 < 1 || num2 > 3)
    {
        printf("You're input error number\n");
        printf("Please select change T[num], 1 <= num < 3\nPlease input T[num]'s values: ");
        scanf("%d,%d", &num2, &num3);
    };

    i = Put(T, num2, num3);
    if(OK == i)
    {
        printf("Call Put() after, Call PrintT()\n");
        printT(T);
    }

    i = IsAscending(T);
    if(1 == i)
    {
        printf("is ascending\n");
    }
    else
    {
        printf("is not sacending\n");
    }
   
    i = IsDescending(T);
    if(1 == i)
    {
        printf("is decending\n");
    }
    else
    {
        printf("is not decending\n");
    }

    i = Max(T, m);
    if(OK == i)
    {
        printf("max value is ");
        printE(m);
    }

    i = Min(T, m);
    if(OK == i)
        {
        printf("min value is ");
        printE(m);
    }

    DestroyTriplet(T);
    printf("Call DestroyTriplet() after , T = %u\n", T);
    printStar(50);
}