C Primer Plus之高级数据表示

 抽象数据类型(ADT)

   类型是由什么组成?一个类型(type)指定两类信息:一个属性集和一个操作集。

所以您想定义一个新的数据类型。首先,您需要提供存储数据的方式,可能是通过设计一个结构。第二个,需要提供操作数据的方式。

计算机科学已经研究出一种定义新类型的成功方法。这种方法使用3个步骤来完成从抽象到具体的过程:

  1. 为类型的属性和可对类型执行的操作提供一个抽象的描述。这个描述不应受任何特定实现的约束,甚至不应受到任何特定编程语言的约束。这样一种正式的抽象描述被称为抽象数据类型(ADT)
  2. 开发一个实现该ADT的编程接口(即函数集合)。即说明如何存储数据并描述用于执行所需操作的函数集合。比如,在C中,您可能同时提供一个结构的定义和用来操作该结构 的函数的原型。
  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语言把所有的类型和函数信息集成到一个包中的方法是:将类型定义和函数原型(包括“操作前”和“操作后”注释)放入一个头文件中。这个文件将提供程序员使用该类型所需的全部信息。

时间: 2024-08-08 18:53:00

C Primer Plus之高级数据表示的相关文章

高级数据表示

抽象数据类型(ADT) 链表 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define TSIZE 45 5 6 struct film 7 { 8 char title[TSIZE]; 9 int rating; 10 struct film * next; 11 }; 12 13 int main(void) 14 { 15 struct film * head = NULL

《C Primer Plus(第6版)(中文版)》普拉达(作者)epub+mobi+azw3

内容简介 <C Primer Plus(第6版)中文版>详细讲解了C语言的基本概念和编程技巧. <C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编程的预备知识.第3~15章详细讲解了C语言的相关知识,包括数据类型.格式化输入/输出.运算符.表达式.语句.循环.字符输入和输出.函数.数组和指针.字符和字符串函数.内存管理.文件输入输出.结构.位操作等.第16章.17章介绍C预处理器.C库和高级数据表示.本书以完整的程序为例,讲解C语言的知识要点和注意事项

《C Primer Plus 》动态链表删除的一个错误

<C Primer Plus>确实是一本伟大的书,但尽信书不如无书,作者Stephen Prata可能也希望他的读者能找到些许他在不经意中出现的小错误吧! 在该书第五版17章"高级数据表示"中,程序清单17.2给出如下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define TSIZE 45 #define LEN sizeof(struct film)

一起读经典《C Primer Plus(第6版)中文版》

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书 --异步小编 今天我们要读的是一本经久不衰的C语言畅销经典教程,自1984年第一版诞生以来,它持续畅销了34年,升级了6个版本,是程序员们学习C语言不可多得的良师益友,它就是<C Primer Plus(第6版)中文版>. 1.   C语言的历史和变革 提到C语言,就绕不开计算机编程语言的演变与进化.这足以证明C语言在整个编程领域举足轻重的地位.C语言不是凭空出现的,它的背后总是伴随

C Primer Plus第6版_源代码+练习答案

下载地址:网盘下载 C Primer Plus(第6版)中文版详细讲解了C语言的基本概念和编程技巧.<C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编程的预备知识.第3~15章详细讲解了C语言的相关知识,包括数据类型.格式化输入/输出.运算符.表达式.语句.循环.字符输入和输出.函数.数组和指针.字符和字符串函数.内存管理.文件输入输出.结构.位操作等.第16章.17章介绍C预处理器.C库和高级数据表示.本书以完整的程序为例,讲解C语言的知识要点和注意事项.每章末

C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载

普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表达式.流程控制语句.函数.数组和指针.字符串操作.内存管理.位操作等,知识内容都针对C99标准:另外,<C Primer Plus(中文版)(第5版)>强化了对指针的讨论,并引入了动态内存分配的概念,也讨论了C预处理器和C库函数.高级数据表示(数据结构)方面的内容. 下载地址:点我 编辑推荐 作为

C Primer Plus(第五版)12

第 12 章 存储类, 链接和内存管理 在本章中你将学习下列内容 . 关键字: auto, extern, static, register, const, volatile, restricted. . 函数: rand(), srand(), time(), malloc(), calloc(), free() . 在 C 中如何确定变量的作用域 ( 它在多大范围内可知) 以及变量的生存期 (它存在多长时间). . 设计更复杂的程序. C 的强大功能之一在于它允许你控制程序的细节. C 的内

C Primer Plus(第五版)中文版.pdf

下载地址:网盘下载 内容简介 编辑 本书全面讲述了C语言编程的相关概念和知识. 全书共17章.第1.2章学习C语言编程所需的预备知识.第3到15章介绍了C语言的相关知识,包括数据类型.格式化输入输出.运算符.表达式.流程控制语句.函数.数组和指针.字符串操作.内存管理.位操作等等,知识内容都针对C99标准:另外,第10章强化了对指针的讨论,第12章引入了动态内存分配的概念,这些内容更加适合读者的需求.第16章和第17章讨论了C预处理器和C库函数.高级数据表示(数据结构)方面的内容.附录给出了各章

时间序列数据挖掘综述

时间序列数据挖掘综述 http://hi.baidu.com/superkiki1989/item/33d609ec4d936204560f1d14 一.引言 时间序列是指按时间顺序排列的一组数据,是一类重要的复杂数据对象.作为数据库中的一种数据形式,它广泛存在于各种大型的商业.医学.工程和社会科学等数据库中,如股票价格.各种汇率.销售数量.产品的生产能力.天气数据等.大量时间序列数据真实地记录了系统在各个时刻的所有重要信息,若能改进某种高效的数据处理方法,发现其中各时间序列之间的相互关系,必将