【数据结构】抽象数据类型三元组的表示与实现c/c++
【数据结构】抽象数据类型三元组的表示与实现c/c++
天依镇楼!!!
大部分童鞋学数据结构的时候应该都是学的清华大学出版社的严蔚敏奶奶的书,但里面都是伪代码,上课老师讲的都很模糊,应该都是纸讲了每个操作的核心算法,就那么几句话,同学们下来自己打代码实现的时候会出现很大的问题,各种莫名奇妙的bug,头都要大了有没有,我自己拿出来我的代码给各位参考一下。希望有些帮助,如果没有,就当进来看看图片吧,哈哈哈哈。
下面代码奉上。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//函数结果状态代码
#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);
void Print(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);
Status DestroyTriplet(Triplet &T);
void addTriplet(Triplet &T1,Triplet T2);
int main(void){
int i,x;
Triplet T,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;
}
//创建
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;
}
}
//输出
void Print(Triplet T){
printf("%.2f %.2f %.2f\n",T[0],T[1],T[2]);
}
//获取
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];
}