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

相关文章
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
13天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
56 16
|
13天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
62 8
|
16天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
44 4
|
17天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
49 3
|
27天前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
36 1
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
67 1
|
16天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
37 0
|
1月前
|
C语言
3.4 C语言基本数据类型2
在C语言中,声明一个整型(int)变量时,需先写入&#39;int&#39;关键字,后跟变量名并以分号结尾。若同时声明多个变量,可在&#39;int&#39;后用逗号分隔列出所有变量名。例如,`int erns;` 或 `int hogs, cows, goats;` 都是合法声明。变量声明后需通过赋值语句如 `cows = 112;` 或使用函数如 `scanf()` 来初始化其值。
44 10
|
1月前
|
存储 程序员 C语言
3.1 C语言基本数据类型
在C语言中,整数类型如`int`类型是很有用的,它属于有符号整型,意味着该类型的值必须是整数,并且可以是正整数、负整数或者零。`int`类型的数值范围依据计算机系统有所不同,通常取决于系统的位宽。例如,在早期16位的IBM PC兼容机上,`int`类型使用16位存储,取值范围为-32768至32767;而在当前32位系统中,使用32位存储,拥有更宽泛的取值范围。随着64位处理器的普及,`int`类型能够存储的整数范围将进一步扩大。根据ISO C标准,`int`类型的最小取值范围被规定为-32768到32767。系统通常会利用一个特殊的位来表示整数的正负。
34 10

热门文章

最新文章