实验报告 抽象数据类型的表示和实现 (三元组) 实现对三元组的基本操作 动态分配 (更新)增加菜单功能

简介: 实验报告 抽象数据类型的表示和实现 (三元组) 实现对三元组的基本操作 动态分配 (更新)增加菜单功能

1.实验名称

抽象数据类型的表示和实现

2.实验目的

(1)复习巩固C语言的结构体、指针、函数、动态分配内存等知识点。

(2)掌握抽象数据类型的定义、表示和实现,为后续实验打好基础。

3.实验内容

基本要求:

设计实现抽象数据类型“三元组”,要求动态分配内存。每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量,求三元组的最小分量,显示三元组,销毁三元组等。

选作内容:

实现两个三元组的对应分量相加或相减,给三元组的各分量同乘一个比例因子等操作。

4.数据类型描述(此处写清楚三元组的抽象数据类型描述)

三元组Triplet的定义:

ADT Triplet{

数据对象:D={e1,e2,e3|e1,e2,e3属于ElemType}

数据关系:R={<e1,e2>,<e2,e3>}

基本操作:

InitTrip(&L,v0,v1,v2)

{

初始条件:无

操作结果:构造三元组T,元素e1,e2,e3分别被赋予参数 v0,v1,v2的值。

}


DestroyTriplet(&L)

{

初始条件:三元组T已经存在;

操作结果:销毁三元组T;

}

GetElem(L,i)

{

初始条件:三元组T已经存在,1<=i<=3

操作结果:用e返回三元组的第i个元素。

}

PutElem(&T,i,e)

{

初始条件:三元组T已经存在,1<=i<=3

操作结果:将T的第i个元素的位置置为e

}

IsAscending(T)

{

初始条件:三元组T已经存在

操作结果:如果三元组T的三个元素按升序排序,则返回TRUE,否则返回FALSE

}


IsDescending(T)

{

初始条件:三元组T已经存在

操作结果:如果三元组T的三个元素按降序排序,则返回TRUE,否则返回FALSE

}


max(T)

{

初始条件:三元组已存在

操作结果:用e返回三元组中的最大值

}

min(T)

{

初始条件:三元组已存在

操作结果:用e返回三元组中的最小值

}

CoRide(L)

{

初始条件:三元组已存在

操作结果:给三元组的各分量同乘一个比例因子

}

DifferenceVaule(L)

{

初始条件:三元组已存在

操作结果:实现两个三元组的对应分量相减

}

Sum(L)

{

初始条件:三元组已存在

操作结果:实现两个三元组的对应分量相加

}

print(L)

{

初始条件:三元组已存在

操作结果:打印三元组的值

}

}ADT Triplet

代码:


//

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define LIST_INIT_SIZE 200
typedef int Status;
typedef float ElemType;
typedef struct
{
  ElemType *elem;
}Triplet;
ElemType e;
Status i;
//创建一个三元组 
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)
{
  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)
{
  printf("请输入需要置换元素的位置:");
    scanf("%d",&i); 
    printf("请输入置换的元素:");
  scanf("%f",&e); 
  if(i<1||i>3)
  {
    return FALSE;
  }
  L.elem[i-1]=e;
  printf("置换后的三元组为:");
    print(L);
  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])
  {
    e=temp;
  }else
  {
    e=L.elem[2];
  }
  printf("%f",e);
}
//求三元组的最小分量
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])
  {
    e=temp;
  }else
  {
    e=L.elem[2];
  }
  printf("%f",e);
}
//实现两个三元组的对应分量相加
ElemType Sum(Triplet L)
{
  Status a,b;
  printf("请输入三元组的两个位置:");
  scanf("%d",&a);
  scanf("%d",&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);
  printf("%f",sum);
  return OK;
}
//实现两个三元组的对应分量相减
ElemType DifferenceVaule(Triplet L)
{
  Status a,b;
  ElemType c,d;
  printf("请输入三元组的位置:");
  scanf("%d %d",&a,&b);
  if(a<1||a>3)
  {
    return FALSE;
  }
  if(b<1||b>3)
  {
    return FALSE;
  }
  c=Getelem(L,a);
  d=Getelem(L,b);
  printf("%f",c-d);
  return OK;
}
//给三元组的各分量同乘一个比例因子(2)
ElemType CoRide(Triplet &L)
{   
    ElemType a;
    printf("请输入需要同乘的值:");
  scanf("%f",&a);
  int i;
  for(i=0;i<3;i++)
  {
    L.elem[i]=L.elem[i]*a;
  }
  print(L);
}
Status isAscending(Triplet T)
{
  return (T.elem[0]<=T.elem[1])&&(T.elem[1]<=T.elem[2]);
}
Status isDecending(Triplet T)
{
  return (T.elem[0]>=T.elem[1])&&(T.elem[1]>=T.elem[2]);
}
//销毁三元组 
DestroyTriplet(Triplet &L)
{
  free(L.elem);
  printf("三元组已销毁"); 
  return OK;
}
ElemType menu(Triplet &T)
{
  Status i,val;
  printf("**********************************\n");
  printf("|            欢迎使用            |\n");
  printf("1:显示三元组的值                  \n");
  printf("2:获取三元组中第n个值             \n");
  printf("3:三元组中最大值                  \n");
  printf("4:三元组中最小值                  \n");
  printf("5:置三元组的任意一个分量          \n");
  printf("6:两个三元组的对应分量相加        \n");
  printf("7:两个三元组的对应分量相减        \n");
  printf("8:给三元组的各分量同乘一个比例因子\n");
  printf("9:销毁三元组                      \n");
  printf("10:判断是否升序(如果T的三个元素按升序排序,则返回1,否则返回0)                     \n");
    printf("11:判断是否升序(如果T的三个元素按降序排序,则返回1,否则返回0)                     \n");  
  printf("**********************************\n");
  printf("输入数字选取您所需要的功能        \n");
  scanf("%d",&val); 
  switch(val)
  {
    case 1:print(T);break;
    case 2:
           printf("请输入需要获取元素的位置:");
             scanf("%d",&i);
             printf("%f",Getelem(T,i));
         break;
    case 3:max(T);break; 
    case 4:min(T);break;
    case 5:Putelem(T);break;
    case 6:Sum(T);break;
    case 7:DifferenceVaule(T);break;
    case 8:CoRide(T);break;
    case 9:DestroyTriplet(T);break;
    case 10:printf("%d",isAscending(T));break;
    case 11:printf("%d",isDecending(T));break;       
  } 
}
int main()
{
  Status j,k;
  Triplet T;
  ElemType v0,v1,v2;
  printf("请输入三元组的值:\n");
  scanf("%f %f %f",&v0,&v1,&v2);
  initTriplet(T,v0,v1,v2);
  for(j=0;j<100;j++)
  {
    printf("是否执行程序?(1代表继续执行,0代表终止程序)\n");
    scanf("%d",&k);
    if(k!=1)
    {
      break;
    }
    if(k==0)
    {
      break;
    }else
    {
      menu(T);
        printf("\n");
    }
  } 
}

控制台:

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png


image.png

image.png

相关文章
|
4月前
数据结构堆排序中堆的建立、调整、插入、删除等操作的详解(题目讲解 简单易懂)
数据结构堆排序中堆的建立、调整、插入、删除等操作的详解(题目讲解 简单易懂)
122 0
|
2月前
【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新
【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新
79 0
|
9月前
|
机器学习/深度学习 存储 算法
数据结构(未完)(五)
数据结构(未完)(五)
53 0
|
9月前
|
存储 算法 编译器
数据结构(未完)(二)
数据结构(未完)(二)
34 0
|
9月前
|
存储 算法
数据结构(未完)(四)
数据结构(未完)(四)
48 0
|
9月前
|
存储 算法 程序员
数据结构(未完)(一)
数据结构(未完)
40 0
|
9月前
|
存储 测试技术 网络架构
数据结构(未完)(三)
数据结构(未完)(三)
38 0
|
存储 算法
数据结构上机实践第11周项目2 - 操作用邻接表存储的图
数据结构上机实践第11周项目2 - 操作用邻接表存储的图
数据结构上机实践第11周项目2 - 操作用邻接表存储的图
|
算法 C++
数据结构-第三章-循环顺序队-增设标记法实现各种基本功能
数据结构-第三章-循环顺序队-增设标记法实现各种基本功能
823 0
|
C语言 C++
数据结构-第二章-线性表-动态/静态分配数据元素各功能实现
数据结构-第二章-线性表-动态/静态分配数据元素各功能实现
1065 0
数据结构-第二章-线性表-动态/静态分配数据元素各功能实现