下面是我作为本科生在学习数据结构的时候使用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;
}