数据结构 (三元组)实现对三元组的建立,读取,求其最大值,最小值。判断其排列方式等的基本操作

下面是我作为本科生在学习数据结构的时候使用C语言来实现三元组基本操作的代码,欢迎大家指正批评:

#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
#define listsize 10//为了以后方便修改组里面的元素的个数 
//数据类型的定义 
typedef int status;
typedef int elemtype;
typedef struct {
    elemtype *elem;
}triplet;//准备以结构体的形式创建三元组 
//函数声明
void inittriplet(triplet &array,elemtype num1,elemtype num2,elemtype num3);
//建立一个三元表 
void theprint(triplet array);
//读取三元表的操作
void max(triplet array);
//读取三元表最大值的操作
void min(triplet array);
//读取三元表最小值的操作
status change(triplet &array,int i,elemtype e);
//将array的第i元改为e
status isascending(triplet array);
//判断是否按照升序排列
status isdescending(triplet array);
 //判断是否按照降序排列 

void inittriplet(triplet &array,elemtype num1,elemtype num2,elemtype num3)
//array前面的&是c++的用法,是为了确保编写者定义的数据类型发生数据变化后能保留变化值 
{
    array.elem = (elemtype *)malloc(listsize * sizeof(elemtype));
    //申请三元组的空间
    array.elem[0] = num1; 
    array.elem[1] = num2;
    array.elem[2] = num3;

void theprint(triplet array)
{
    for(int i = 0;i <= 2;i++ )
        {
            printf("%d\n",array.elem[i]);
        }
}
void max(triplet array)
{
    elemtype result;
    result = array.elem[0];
    if(result < array.elem[1])
    {
        result = array.elem[1];
    }
    if(result < array.elem[2])
    {
        result = array.elem[2];
    }
    printf("%d\n",result);
}

void min(triplet array)
{
    elemtype result = array.elem[0];
    if(result > array.elem[1])
    {
        result = array.elem[1];
    }
    if(result > array.elem[2])
    {
        result = array.elem[2];
    }
    printf("%d\n",result);
}
status change(triplet &array,int i,elemtype e)
{
    if(i < 0 || i > 2)
        {
            printf("修改位置不在三元组范围内,修改结束");
            return 0;
        }
    else
    {
        array.elem[i] = e;
        return True;
    }
}

status isascending(triplet array)
{
    return (array.elem[0] <= array.elem[1]) && (array.elem[1] <= array.elem[2]);
    //如果升序,则返回1 
}

status isdescending(triplet array)
{
    return (array.elem[0] >= array.elem[1]) && (array.elem[1] >= array.elem[2]);
    //如果升序,则返回1 
}

void arrange(triplet &T)
{
    int a =  T.elem[0]>=T.elem[1] ? (T.elem[0]>=T.elem[2] ? T.elem[0] : T.elem[2])
                    : (T.elem[1]>=T.elem[2] ? T.elem[1] : T.elem[2]);
                    //最大值 
    int b =  T.elem[0]<=T.elem[1] ? (T.elem[0]<=T.elem[2] ? T.elem[0] : T.elem[2])
                    : (T.elem[1]<=T.elem[2] ? T.elem[1] : T.elem[2]);
                    //最小值 
    int c,flag = 1;
    for(int i = 0; i <= 2;i++)
    {
        if(T.elem[i]<a&&T.elem[i]>b)
        {
            c = T.elem[i];
            flag = 0;
            break;
        }
    }
    if(flag)
    {
        int a1 = 0;
        int b1 = 0;
        for(int i =0;i<=2;i++)
            {
                if(T.elem[i] == a)
                a1++;
                if(T.elem[i]==b)
                b1++;
                if(a1 == 2)
                {
                    c = T.elem[i];
                    break;
                }
                if(b1 == 2)
                {
                    c = T.elem[i];
                    break;
                }
            }
    }
    T.elem[0] = b;
    T.elem[1] = c;
    T.elem[2] = a;
}
int main()
{
    triplet array;//定义一个triplet的数据类型
    elemtype num1,num2,num3;//定义三个status的数据 
    //注意不要使用status来代替elemtype避免以后修改数据出现错误 
    printf("请输入数据元组的第一个元素:");
    scanf("%d",&num1);
    printf("请输入数据元组的第二个元素:");
    scanf("%d",&num2);
    printf("请输入数据元组的第三个元素:");
    scanf("%d",&num3);
    inittriplet(array,num1,num2,num3);
    //构建数据类型的函数 
    printf("输出三元表的内容:\n");
    theprint(array);
    printf("输出三元组的最大值:");
    max(array);
    printf("输出三元组的最小值:");
    min(array);
    printf("请输入您想要修改的位置(0,1,2):");
    int i;
    scanf("%d",&i);
    printf("请输入您想要修改后的结果:");
    int result;
    scanf("%d",&result);
    int flag = 0;
    //判断三元组的排列的方式是否需要修改 
    if(change(array,i,result))
    {
        printf("修改成功!\n修改后的结果为:\n");
        theprint(array);
    }
    if(isascending(array))
    {
        printf("三元组升序排列方式检验结果:%d\n",isascending(array));
        printf("三元组是按照升序排列的\n");
    }
    else if(isdescending(array))
    {
        printf("三元组降序排列方式检验结果:%d\n",isdescending(array));
        printf("三元组是按照降序排列的\n");
    }
    else
    {
        flag = 1;
        printf("三元组升序排列方式检验结果:%d\n",isascending(array));
        printf("三元组降序排列方式检验结果:%d\n",isdescending(array));
        printf("三元组既不是按照升序的方式也不是按照降序的方式排列的");
    }
    if(flag)
    {
        printf("三元组的排列方式需要修改,并且程序将按照升序的方式排列修改:\n");
        arrange(array);
        theprint(array);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值