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

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

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

猜你喜欢

转载自blog.csdn.net/qq_52077949/article/details/114794460