【数据结构】抽象数据类型Triplet的表示和实现

三元组的C / C++实现代码

#include <iostream>
using namespace std;

//函数结果状态代码
#define TRUE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define INFEASIBLE  -1
#define OVERFLOW    -2
 
typedef int Status;
typedef float ElemType;
typedef ElemType *Triplet;

//函数原型
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3);
Status DestroyTriplet(Triplet &T);
Status Get(Triplet T,int i,ElemType &e);
Status Put(Triplet &T,int i,ElemType e);
Status IsAscending(Triplet T);
Status IsDescending(Triplet T);
Status Max(Triplet T,ElemType &e);
Status Min(Triplet T,ElemType &e);
void Print(Triplet T);
void addTriplet(Triplet &T1,Triplet T2);

//创建
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3){
    T=(Triplet)malloc(3*sizeof(ElemType));
    if(!T)
        return ERROR;
    else{
        T[0]=v1;
        T[1]=v2;
        T[2]=v3;
        return OK;
    }
}
//获取
Status Get(Triplet T,int i,ElemType &e){
    //i如果不在范围内,返回错误
    if(i<1||i>3){
        return ERROR;
    }
    e=T[i-1];
    return OK;
}
//改变
Status Put(Triplet &T,int i,ElemType e){
    if(i<1||i>3){
        return ERROR;
    }
    T[i-1]=e;
    return OK;
}
Status IsAscending(Triplet T){
    //若升序则返回1,否则返回0
    return (T[0]<=T[1])&&(T[1]<=T[2]);
}
Status IsDescending(Triplet T){
    //若降序则返回1,否则返回0
    return (T[0]>=T[1])&&(T[1]>=T[2]);
}
//求最大
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;
}
//求最小
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;
}
//销毁
Status DestroyTriplet(Triplet &T){
    free(T);
    T=NULL;
    return OK;
}
//合并
void addTriplet(Triplet &T1,Triplet T2){
    T1[1]+=T2[1];
    T1[0]+=T2[0];
    T1[2]+=T2[2];
}
//输出
void Print(Triplet T){
    printf("%.2f %.2f %.2f\n",T[0],T[1],T[2]);
}

int main(void){
    int i,x;
    Triplet T=nullptr,T1,T2;
    //T=(Triplet)malloc(3*sizeof(ElemType));
    ElemType a,b,c,e;
    printf("          |$$$抽象数据类型三元组的实现\n");
    printf("          |该程序可以实现一下几种功能:\n");
    printf("          |1.创建一个三元组;\n");
    printf("          |2.获取三元组的第i个值;\n");
    printf("          |3.改变三元组的第i个值为e;\n");
    printf("          |4.判断该三元组此时是否升序;\n");
    printf("          |5.判断该三元组此时是否降序;\n");
    printf("          |6.求该三元组的最大值;\n");
    printf("          |7.求该三元组的最小值;\n");
    printf("          |8.销毁三元组;\n");
    printf("          |9.实现两个三元组的相加;\n");
    printf("          |0.退出程序;\n\n\n");
    printf("请输入要实现的功能:\n");
    scanf("%d",&x);
    while(x){
        switch(x){
            case 1:{
                printf("请输入要创建的三元组的三个值:");
                scanf("%f%f%f",&a,&b,&c);
                InitTriplet(T,a,b,c);
                Print(T);
                break;
            }
            case 2:{
                printf("请输入要获取三元组的第几个值:");
                scanf("%d",&i);
                Get(T,i,e);
                printf("该三元组的第%d个值为:%.2f\n",i,e);
                break;
            }
            case 3:{
                printf("请输入位置i和数值e:");
                scanf("%d%f",&i,&e);
                Put(T,i,e);
                printf("此时的三元组为:");
                Print(T);
                break;
            }
            case 4:{
                if(IsAscending(T)==1)
                    printf("该三元组为升序!\n");
                else
                    printf("该三元组不为升序!\n");
                break;
            }
            case 5:{
                if(IsDescending(T)==1)
                    printf("该三元组为降序!\n");
                else
                    printf("该三元组不为降序!\n");
                break;
            }
            case 6:{
                Max(T,e);
                printf("该三元组此时的最大值为%.2f\n",e);
                break;
            }
            case 7:{
                Min(T,e);
                printf("该三元组此时的最小值为%.2f\n",e);
                break;
            }
            case 8:{
                if(DestroyTriplet(T)==1){
                    printf("三元组销毁成功!\n");
                }
                else{
                    printf("销毁失败!\n");
                }
                break;
            }
            case 9:{
                printf("请输入第一个三元组:");
                scanf("%f%f%f",&a,&b,&c);
                InitTriplet(T1,a,b,c);
                printf("请输入第二个三元组:");
                scanf("%f%f%f",&a,&b,&c);
                InitTriplet(T2,a,b,c);
                addTriplet(T1,T2);
                printf("合并之后的三元组为:");
                Print(T1);
                break;
            }
            default:printf("输入错误,请重新输入!\n");
                continue;
        }
        printf("请输入要实现的功能:\n");
        scanf("%d",&x);
    }
    printf("程序运行完毕,感谢您的使用!\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值