标签:
抽象数据类型(ADT)
类型是由什么组成?一个类型(type)指定两类信息:一个属性集和一个操作集。
所以您想定义一个新的数据类型。首先,您需要提供存储数据的方式,可能是通过设计一个结构。第二个,需要提供操作数据的方式。
计算机科学已经研究出一种定义新类型的成功方法。这种方法使用3个步骤来完成从抽象到具体的过程:
以抽象数据类型——列表为例进行说明
类型名称: | 列表 |
类型属性: | 可保存一个项目序列 |
类型操作: | 把列表初始化为空列表 |
确定列表是否为空 | |
确定列表是否已满 | |
确定列表中项目的个数 | |
向列表末尾添加项目 | |
遍历列表,处理列表中每个项目 | |
清空列表 | |
在列表中的任何位置插入一个项目 | |
从列表中删除一个项目 | |
取出列表中的一个项目(不改变列表) | |
替换列表中的一个项目 | |
在列表中搜索一个项目 |
非正式但抽象的列表定义时:它是一个能够保存项目序列并且可以对其应用任何前面的操作的数据对象。这个定义没有说明什么样的项目才能存储在列表中。它并未指定是否应该使用数组或链接的结构集或其他数据形式来保存这些项目。它并未指定使用何种方法来实现诸如获取列表中的元素个数之类的操作。这些都是留给实现的细节。
构造C语言接口
简单列表的接口有两个部分:①描述数据如何表示,②描述实现ADT操作的函数。接口的设计应和ADT的描述尽可能密切地保持一致。因此,应该使用某种通用的Item类型来进行表达,而不是用诸如int或struct film之类的专用类型。这样做的方法之一是使用C的typedef工具将Item定义为所需类型。如:
#define TSIZE 45 /* 存放片名的数组大小 */ struct film { char title[TSIZE]; int rating; }; typedef struct film Item;
在链表的实现中,每一个链接被称为一个节点(node)。每一个节点包含形成列表内容的信息和指向下一节点的指针。例如:
typedef struct node { Item item; struct node * next; // 指向下一节点的指针 } Node; typedef Node * List;
↓ 等价于
struct node { Item item; struct node * next; }; typedef struct node Node; typedef Node * List; // 为了管理链表,需要一个指向其开始处的指针
还可以加入一个变量来保存列表中项目的数量:
typedef struct list { Node * head; // 指向列表头的指针 int size; // 列表中项目的数量 } List;
考虑如下声明:
List movies;
movies是在建立一个列表,而不是在建立一个指向节点的指针或是建立一个结构。movies的确切数据表示是应该在接口层上不可见的实现细节上。
启动后,程序应该把头指针初始化为NULL。任何使用List类型的人都应无须担心细节,而应能够使用下面的代码:
InitializeList(movies);
程序员只需要知道他们应该使用InitializeList()函数来初始化列表,不需要知道List变量的确切的数据实现。这是数据隐藏的一个例子。数据隐藏是一种对跟高级编程隐藏数据表示细节的艺术。InitializeList()的函数原型为:
/* 操作: 初始化一个列表 */ /* 操作前:plist指向一个列表 */ /* 操作后:该列表被初始化为空列表 */ void InitializeList(List * plist);
C语言把所有的类型和函数信息集成到一个包中的方法是:将类型定义和函数原型(包括“操作前”和“操作后”注释)放入一个头文件中。这个文件将提供程序员使用该类型所需的全部信息。
标签:
原文地址:http://www.cnblogs.com/yerenyuan/p/5117326.html