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

#include<string.h>//字符串函数头文件
#include<ctype.h>//字符函数头文件
#include<malloc.h>//malloc等
#include<stdio.h>//标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h>//atoi(),exit()
#include<io.h>//eof()
#include<math.h>//数学函数头文件,包括floor(),celil(),abs()等
#include<sys/timeb.h>//ftime()
#include<stdarg.h>//提供宏va_start,va_arg和va_end,用于存取变长参数表

//函数结果状态代码。
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef int Status;//Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean;//Boolean是布尔类型,,其值是TRUE和FALSE

typedef int ElemType;

typedef ElemType * Triplet;//由InitTriplet分配3个元素存储空间
//Triplet类型是ElemType类型的指针,存放ElemType类型的地址

Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3){
    //操作结果:构造三元组T,依次置T的3个元素的初值为v1,v2和v3。
    T = (ElemType *)malloc(3 * sizeof(ElemType));//分配3个元素的存储空间
    if (!T)exit(OVERFLOW);//分配失败则退出
    T[0] = v1, T[1] = v2, T[2] = v3;
    return OK;
}

Status DestroyTriplet(Triplet &T){
    //操作结果:三元组T被销毁。
    free(T);//释放T所指的三元组存储空间
    T = NULL;//T不再指向任何存储单元
    return OK;
}

Status Get(Triplet T, int i, ElemType &e){
    //初始条件:三元组T已存在,1 <= i <= 3。操作结果:用e返回T的第i元的值。
    if (i<1 || i>3) return ERROR;//i不在三元组范围内
    e = T[i - 1];//将三元组T的第i个元素赋给e
    return OK;
}

Status Put(Triplet T, int i, ElemType e){
    //初始条件:三元组T已存在,1 <= i <= 3。操作结果:改变T的第i元的值为e。
    if (i<1 || i>3) return ERROR;//i不在三元组范围内
    T[i - 1] = e;//将e的值赋给三元组T的第i个元素
    return OK;
}

Status IsAscending(Triplet T){
    //初始条件:三元组T已存在。操作结果:如果三元组T的3个元素按升序排列,则返回1,否则返回0。
    return (T[0] <= T[1] && T[1] <= T[2]); //只在T[0]不大于T[1]且不大于T[2]时返回真
}

Status IsDescending(Triplet T){
    //初始条件:三元组T已存在。操作结果:如果三元组T的3个元素按降序排列,则返回1,否则返回0。
    return (T[0] >= T[1] && T[1] >= T[2]);//只在T[0]不小于T[1]且不小于T[2]时返回真
}

Status Max(Triplet T, ElemType &e){
    //初始条件:三元组T已存在。操作结果:用e返回指向T的最大元素的值。
    e = (T[0] >= T[1]) ? (T[0] >= T[2] ? T[0] : T[2]) : (T[1] >= T[2] ? T[1] : T[2]);//嵌套的条件运算符
    return OK;
}

Status Min(Triplet T, ElemType &e){
    //初始条件:三元组T已存在。操作结果:用e返回指向T的最小元素的值。
    e = (T[0] <= T[1]) ? (T[0] <= T[2] ? T[0] : T[2]) : (T[1] <= T[2] ? T[1] : T[2]);//嵌套的条件运算符
    return OK;
}

void PrintE(ElemType e){//输出元素的值
    printf("%d\n", e);
}

void PrintT(Triplet T){//依次输出三元组的值
    printf("%d, %d, %d\n", T[0], T[1], T[2]);
}

void main(){
    Triplet T;
    ElemType m;
    Status i;
    i = InitTriplet(T, 5, 7, 9);//初始化三元组T,其3个元素依次为5,7,9。
    printf("调用初始化函数后,i = %d(1:成功)。 T的三个值为", i);
    PrintT(T);//输出T的3个值
    i = Get(T, 2, m);//将三元组T的第2个值赋给m
    if (i == OK){//调用Get()成功
        printf("T的第2个值为:");
        PrintE(m); //输出m (= T[1])
    }
    i = Put(T, 2, 6);//将三元组T的第2个值改为6
    if (i == OK){//调用Put()成功
        printf("将T的第2个值改为6后,T的三个值为:");
        PrintT(T);//依次输出三元组T的3个值
    }
    i = IsAscending(T);//测试升序的函数
    printf("调用测试升序的函数后,i = %d(0:否 1:是)\n", i);
    i = IsDescending(T);//测试降序的函数
    printf("调用测试降序的函数后,i = %d(0:否 1:是)\n", i);
    if (i = Max(T, m) == OK){//先赋值再比较
        printf("T中的最大值为");
        PrintE(m); //输出最大值m
    }
    if (i = Min(T, m) == OK){
        printf("T中的最小值为");
        PrintE(m);//输出最小值m
    }
    DestroyTriplet(T);//函数也可以不带返回值
    printf("销毁T后,T = %u\n", T);

    getchar();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-26 22:33:30

抽象数据类型的表示与实现的相关文章

【Python&amp;数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

数据类型和抽象数据类型

<(^-^)> 我们知道在各种编程语言中都会有数据类型. 一.数据类型 先看看为什么会有不同的数据类型呢?很简单,很多东西不能一概而论,而是需要更精确的划分.计算机计算1+1并不需要多么大的空间,但是计算10000000000+1000000000就得需要有个比较大的空间来放.还有有时候会计算小数,小数的位数不一样,需要的空间也就不一样.数字1和字母a也需要区分啊,于是开发者就想出了“数据类型”这一招,用来描述不同的数据的集合. 我记得最早接触的数据类型就是int了.当初一个int a;就把我

计算机软考笔记之《抽象数据类型(ADT)》

1.引言 1抽象数据类型和数据结构的关系 抽象数据类型(ADT)是一种比数据结构处于更高抽象层的数据类型,ADT使用数据结构来实现. 2数据类型的定义和应用于数据的操作定义是ADT背后的一部分概念,隐藏数据上的操作是如何进行的. 3分类:简单抽象数据类型和复杂抽象数据类型 简单ADT:整数.实数.字符.指针: 复杂ADT:需要建立.不需要详细说明实现过程的泛化操作成为抽象. 抽象概念意味着: ①知道一个数据类型能做什么: ②如何去做是隐藏的. 4定义 抽象数据类型就是与对数据类型有意义的操作封装

抽象数据类型(ADT)入门(一)

抽象数据类型(ADT)入门(一) 1.抽象数据类型(Abstract Data Types,ADT)和ADT的实现 抽象数据类型:一个数据元素集合以及在这些数据上的操作. ADT的一个实现包括存储数据元素的存储结构以及实现基本操作的算法. 在这个数据抽象的思想中,数据类型的定义和它的实现是分开的,这在软件设计中是一个重要的概念.这使得只研究和使用它的结构而不用考虑它的实现细节成为可能.实际上,这通常使用在int.double.char和bool等预定义数据类型上的方法,使用这些数据类型的程序员在

ELF格式解析库之抽象数据类型

抽象?抽谁的象? ELF是一种链接执行格式,它规定了对于一个ELF文件的基本数据类型是什么样的.可是,要解析一个ELF文件,而这个ELF文件或者是32Bits 或者是 64Bits,反正字长是未定的,怎么办?难道我们要定义两套解析的接口,以对应不同的字长的ELF文件吗?如果要这样做,不是不可以,只是那样做为接口的设计增加了太大的负担.这里我们采用"抽象"的方式,将已有的两套基础数据结构封装成一个兼容的数据结构.这样,我们设计解析接口时,可以做到尽量的简化,大大的减轻了工作量. 因此,这

算法(第4版)-1.2.1 使用抽象数据类型

总结:本小节是关于抽象数据类型的综述,包括是什么.为什么.怎么办. 重点: 1. 研究同一个问题的不同算法的主要原因:它们的性能特点不同. 2. API:通过列出所有构造函数和实例方法(及操作)并简要描述它们的功用,说明抽象数据类型的行为. 3. Java中的所有数据类型都会继承toString()方法来返回用String表示的该类型的值.Java会在用+运算符将任意数据类型的值和String值连接时调用该方法. 可以重写toString()方法.必须声明为public String toStr

线性表的抽象数据类型描述

代码如下 1 //抽象数据类型线性表的定义 2 #include <studio.h> 3 /*-------------------初始化线性表-----------------------*/ 4 void InitList(SqList *&L) 5 { 6 L=(SqList*)malloc(sizeof(SqList)); 7 L->length=0; 8 } 9 /*--------------------销毁线性表,释放内存空间-------------------

C++抽象数据类型,如何抽象

C++是个多范式的语言,所以C++难学,所以C++强大,可比起java,C#,用C++来做软件开发,开发周期要长很多. 为什么呢?这是因为C++的自由度高,换句话说自由度越高地语言,开发软件的周期越长,这是有一定道理的 自由度过高就不容易掌控,java和C#它们的库很强大,这在一定程度上就限制了自由度,相当于提供了一套模式,方法,开发人员不需要去为实现这些东西而操心 然而C++程序员却需要为这些费劲心力,这体现在实现细节上. 本文要说的是抽象数据类型,抽象数据类型 ADT 一种重要的数据类型.它

ADT(Abstract Data Type)抽象数据类型

ADT(Abstract Data Type)抽象数据类型 为了便于理解,以复数为例: (1)定义: ADT Complex{ 数据对象:D={e1,e2|e1,e2为实数} 数据关系:S={<e1,e2>|e1是实部,e2是虚部} 基本操作: Creat(&C , x, y) GetReal(C) GetImage(C) Add(c1,c2) Sub(C1,C2) } ADT Complex; (2)表示: typedef struct{ float Realpart; float

算法(第4版)-1.2.4 更多抽象数据类型的实现

总结:本小节列举了更多抽象数据类型的实现,并讨论了维护多个实现的问题. 重点: 1. 本书中反复出现的一个主题就是我们需要理解各种实现对空间和时间的需求以及它们对各种用例的适用性. 2. 本书的一个主要目标就是深入讨论若干种基本抽象数据结构的实现并衡量他们的性能的不同. 3. 编译时出现 -Xlint:deprecation 警告时,可以不用理会,直接运行程序即可.