当前位置: 代码迷 >> 综合 >> 实验报告 抽象数据类型的表示和实现 (三元组) 实现对三元组的基本操作 创建 取值 置换 打印/销毁三元组等功能 数据结构(C语言版)
  详细解决方案

实验报告 抽象数据类型的表示和实现 (三元组) 实现对三元组的基本操作 创建 取值 置换 打印/销毁三元组等功能 数据结构(C语言版)

热度:11   发布时间:2023-11-22 06:57:41.0

实验内容
基本要求:
设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。
选作内容:
实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。
代码实现:

#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 后面不能加空格