实验内容
基本要求:
设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
选作内容:
实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。
代码实现:
//
#include<stdio.h> #include<stdlib.h> #define OK 1 #define FALSE 0 #define LIST_INIT_SIZE 200//初始容量为200 typedef int Status; typedef float ElemType; typedef struct { ElemType *elem; }Triplet; // 创建一个三元组 void initTriplet(Triplet &L,ElemType v0,ElemType v1,ElemType v2) { L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); L.elem[0]=v0; L.elem[1]=v1; L.elem[2]=v2; } //打印三元组 void print(Triplet &L) { int i; for(i=0;i<3;i++) { printf("%f ",L.elem[i]); } } //取三元组的任意一个分量 ElemType Getelem(Triplet L,Status i) { if(i<1||i>3) { return FALSE; } ElemType e=L.elem[i-1]; return e; } //置三元组的任意一个分量 ElemType Putelem(Triplet &L,Status i,ElemType e) { if(i<1||i>3) { return FALSE; } L.elem[i-1]=e; return OK; } //求三元组的最大分量 ElemType max(Triplet L) { Status temp; if(L.elem[0]>L.elem[1]) { temp=L.elem[0]; }else { temp=L.elem[1]; } if(temp>L.elem[2]) { return temp; }else { return L.elem[2]; } } //求三元组的最小分量 ElemType min(Triplet L) { Status temp; if(L.elem[0]<L.elem[1]) { temp=L.elem[0]; } else { temp=L.elem[1]; } if(temp<L.elem[2]) { return temp; }else { return L.elem[2]; } } //实现两个三元组的对应分量相加 ElemType sum(Triplet L,ElemType a,ElemType b) { if(a<1||a>3) { return FALSE; } if(b<1||b>3) { return FALSE; } ElemType sum=0; sum+=Getelem(L,a); sum+=Getelem(L,b); return sum; } //实现两个三元组的对应分量相减 ElemType DifferenceVaule(Triplet L,ElemType a,ElemType b) { if(a<1||a>3) { return FALSE; } if(b<1||b>3) { return FALSE; } a=Getelem(L,a); b=Getelem(L,b); return a-b; } //给三元组的各分量同乘一个比例因子(2) ElemType CoRide(Triplet &L,ElemType a) { int i; for(i=0;i<3;i++) { L.elem[i]=L.elem[i]*a; } } //销毁三元组 DestroyTriplet(Triplet &L) { free(L.elem); return OK; } int main() { Triplet T; ElemType v0,v1,v2; printf("请输入三元组的值:\n"); scanf("%f %f %f",&v0,&v1,&v2); initTriplet(T,v0,v1,v2); printf("输出三元组的值:"); print(T); printf("\n"); printf("获取三元组中第二个值:%f\n",Getelem(T,2)); Putelem(T,2,11); printf("将三元组中第二个值替换为11:"); print(T); printf("\n"); printf("替换后三元组中最大值为:%f\n",max(T)); printf("替换后三元组中最小值为:%f\n",min(T)); printf("替换后三元组中第一个值和第二个值之和为:%f\n",sum(T,1,2)); printf("替换后三元组中第一个值和第二个值之差为:%f\n",DifferenceVaule(T,1,2)); printf("给三元组的各分量同乘一个比例因子(2):"); CoRide(T,2); print(T); DestroyTriplet(T); return 0; }
打印结果:
注意:
1:释放动态内存时要将结构体中的成员分别释放;(和开空间相对应)
2:int a[i] 中的i必须为整型,不能为浮点型
3:scanf读入时最后一个 %f 后面不能加空格