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

简介: 实验报告 抽象数据类型的表示和实现 (三元组) 实现对三元组的基本操作 创建 取值 置换 打印/销毁三元组等功能 数据结构(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;
}


打印结果:

image.png


注意:


1:释放动态内存时要将结构体中的成员分别释放;(和开空间相对应)

2:int a[i] 中的i必须为整型,不能为浮点型

3:scanf读入时最后一个 %f 后面不能加空格

相关文章
|
11月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
12月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
504 1
|
12月前
|
存储 算法 搜索推荐
【趣学C语言和数据结构100例】91-95
本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
170 4
|
12月前
|
存储 机器学习/深度学习 搜索推荐
【趣学C语言和数据结构100例】86-90
本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
150 4
|
12月前
|
存储 算法 数据处理
【趣学C语言和数据结构100例】81-85
本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
132 4
|
9月前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
1536 1
一文彻底搞清楚C语言的数据类型和变量
|
9月前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏
|
10月前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
10月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
269 1
|
11月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
516 8

热门文章

最新文章