数据结构编程笔记二:第一章 绪论 三元组的程序实现

第一章主要是让大家入门,理解ADT的作用,所以书的作者没有安排太难的程序,只安排了三元组。
写C的童鞋都知道,写指针程序是个麻烦事,且不说调试遇到的各种奇葩问题,仅仅是打*号字符就是一个麻烦,每次手都必须伸到很远去找星号。为了解决这个麻烦,我们给指针起个别名,可以减少星号的输入。C语言中的返回值只能带回一个变量(当然了,可以用结构体封装多个结果,就是往回带结果的时候还得逐个去设置,想想就麻烦),使用C++中的引用参数可以方便的带回多个操作结果。本次的程序分为指针版和引用版,旨在帮助大家搞清楚指针和引用是什么关系,从线性表开始,我们就用引用来写程序了。

程序在码云上可以下载。
地址:https://git.oschina.net/601345138/DataStructureCLanguage.git

我们的程序主要分为以下几个部分(以后的程序都是如此,不再重复说明):

  1. 数据结构的ADT定义和程序操作的各种声明
  2. 引入头文件
  3. 自定义常量
  4. 自定义数据类型以及typedef给已有数据类型起别名
  5. 对ADT定义的各个操作算法的实现
  6. 主函数调用各个函数完成对算法的演示
  7. 程序运行结果的截屏(我采用复制控制台字符的方式,不截图,方便大家复制我的测试输入数据)

我们要完成的程序要求如下:
设计实现抽象数据类型“三元组 (Triplet)” 。 每个三元组由任意三个实数的序列构成,基本操作包括:创建一个三元组,取三元组的任意一个分量,置三元组的任意一个分量,求三元组的最大分量、最小分量,显示三元组,销毁三元组等。

抽象数据类型三元组的定义:

  ADT Triplet
   {
         数据对象:D={e1,e2,e3|e1,e2,e3属于ElemSet (定义了关系运算的某个集合)}
         数据关系:R={<e1,e2>|<e2,e3>}
         基本操作:
         1.创建三元组
            createTriplet()
            初始条件:无 
            操作结果:已申请好三元组所占的内存空间,并返回带有三元组首地址的指针。 
         2.初始化三元组 
            initTriplet(*T,v0,v1,v2) 
            初始条件:已成功输入vo,v1,v2的值,并且已经开辟好三元组的内存空间 
            操作结果:元素e1,e2和e3分别被赋予参数v1,v2,v3的值。
         3.销毁三元组 
            destroyTriplet(*T)
            初始条件:三元组已经存在。
            操作结果:销毁三元组T4.获取第i个元素的值 
            getElem(*T,i,&e)
            初始条件:三元组已经存在且1<=i<=3.
            操作结果:用e返回三元组的第i个元素。
         5.置三元组第i个元素的值 
            putElem(*T,i,e)
            初始条件:三元组已经存在且1<=i<=3.
            操作结果:用e值取代三元组的第i个元素。
         6.判断三元组的三个元素是否为升序排列 
            isAscending(*T)
            初始条件:三元组已经存在。
            操作结果:如果三元组的三个元素按升序排列,则返回TRUE;否则返回FALSE7.判断三元组的三个元素是否为降序排列 
            isDescending(*T)
            初始条件:三元组已经存在。
            操作结果:如果三元组的三个元素按降序排列,则返回TRUE,否则返回FALSE8.获取三元组三个元素中的最大值
            getMax(*T,&e)
            初始条件:三元组已经存在。
            操作结果:用e返回的3个元素中的最大值。
         9.获取三元组三个元素中的最小值
            getMin(*T,&e)
            初始条件:三元组已经存在。
            操作结果:用e返回的3个元素中的最小值。 
    } ADT Triplet

首先看看静态存储分配方式的指针版程序:

#include<stdio.h>
#define OK 1
#define ERROR 0

typedef int Status;
typedef float ElemType;  //三元组元素的类型先定义为int,可以随时变换成别的类型 
typedef struct
{
    ElemType e[3];
}Triplet;

//三元组的初始化
Status initTriplet(Triplet *T,ElemType v0,ElemType v1,ElemType v2)
{
    T->e[0]=v0;
    T->e[1]=v1;
    T->e[2]=v2;
    return OK;
}
//销毁三元组,静态存储是在程序开始的时候就分配固定的内存单元,整个程序结束后自动释放存储单元,不需销毁 
//而动态存储单元在程序运行初不分配内存单元在用到时才分配,而当用过后需要用语句释放该内存空间
Status destroyTriplet(Triplet *T)
{
    return OK;
}
//用e获取T的第i(1~3)个元素的值, 
Status getElem(Triplet T,int i,ElemType *e)
{
    if(i<1||i>3)
        return ERROR;
    else *e=T.e[i-1];
        return OK;
}
//置T的第i元的值为e 
Status putElem(Triplet *T,int i,ElemType e)
{
    if(i<1||i>3)
        return ERROR;
    else T->e[i-1]=e;
        return OK;
}
//如果T的三个元素按升序排列,则返回1,否则返回0
Status isAscending(Triplet *T)
{
    return (T.e[0]<=T.e[1])&&(T.e[1]<=T.e[2]);
} 
//如果T的三个元素按降序排列,则返回1,否则返回0
Status isDescending(Triplet T)
{
    return (T.e[0]>=T.e[1])&&(T.e[1]>=T.e[2]);
} 
//用e返回指向T的最大元素的值
ElemType getMax(Triplet T)
{
    ElemType e;
    if(T.e[0]>T.e[
  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值