《计算机科学导论(第二版)》 11章 数据结构

11.1 引言

1、为什么要使用数据结构?

尽管单变量在程序设计语言中被大量使用,但是它们不能有效地解决复杂问题。此时考虑使用数据结构。

2、数据结构是什么?

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

3、三种数据结构

数组;

记录;

链表;

大多的编程语言都隐式实现了前两种,而第三种则通过指针和记录来模拟。

11.2 数组

1、为什么使用数组?

为了处理大量的数据,需要一个数据结构,如数组。当然还有其他的数据结构。

2、数组的定义

数组是元素的顺序集合,通常这些元素具有相同的数据类型。

3、数组的基础知识

1索引

表示元素在数组中的顺序号,顺序号从数组开始计数。

数组元素通过索引被独立给出了地址,使用索引可以访问数组中的元素。

有些现代语言(如C、C++和Java)是从0开始数组索引的。

2数组名与元素名

在一个数组中,有两种标识符:数组的名字(scores)和各个元素的名字(scores[1]、scores[2])。

3多维数组

许多应用需要数据以多于一维的形式存储。一个常见的例子是表,其是由行和列组成的二维数组。

多维数组(多于二维的数组)也是可以的。

二维数组在内存中可以使用行主序存储或列主序存储,第一种更常见。

4、数组操作

数组操作是值得一些把数组作为数据结构的操作。

常见的数组操作有:查找、插入、删除、检索和遍历

1查找

未排序的数组使用顺序查找。对排序的数组使用折半查找;

2插入(操作冗长和棘手)

语言允许可变长数组的前提(例如,C语言的最新版本)

①尾部的插入

②开始或中间的插入

首先查找数组。找到插入的位置后,插入新的元素。

注意移位需要在数组的尾部进行,以防止元素值的丢失。

3删除(操作冗长和棘手)

需要把需要移动的元素向数组的开始位置移动一个位置。

4检索

检索操作就是随机(注意对随机地理解)地存取一个元素,达到检查或拷贝元素中的数据的目的。

5、数组的应用

当需要进行的插入和删除操作数目较少,而需要大量的查找和检索操作时,数组是合适的数据结构。

11.3 记录

1、为什么要用记录?

记录也是为了处理大量的数据而被需要的一个数据结构。

2、什么是记录?

记录是一组相关元素的集合,它们可能是不同的类型,但整个记录有一个名称。

记录中的数据必须都与一个对象关联。

3、记录的基础知识

1域

记录中的每个元素称为域。域是具有含义的最小命名数据。域不同于变量主要在于它是记录的一部分。

2记录名与域名

就像数组一样,在记录中也有两种标识符:记录的名字student和记录中各个域的名字。

域名(student.id student.name)

11.4 记录与数组

1、记录与数组的比较

数组定义了元素的集合,而记录定义了元素可以确认的部分。

2、记录数组

1什么时候使用记录数组?

如果我们需要定义元素的集合,且同时还需要定义元素的属性,那么可以使用记录数组。

2规则

1、数组的名字定义了整个结构,作为一个整体的学生组。

2、首先定义元素,然后在定义元素的部分(属性),如(student[2]).id,括号告诉我们索引运算符要先于点运算符。

3、通常使用循环来读记录数组中的数据。

3数组与记录数组

数组可以看成是记录数组的一种特例,其中每个元素是只带一个域的记录。


11.3 链表

1、为什么要用到链表?

记录也是为了处理大量的数据而被需要的一个数据结构。

2、什么是链表?

链表是一个有序数据的集合,其中每个元素(节点)包含下一个元素的地址。链表中的节点是至少包含两个域的记录。

3、链表的基本知识

1元素

习惯上称节点,包含两个部分:数据和链。链包含指明列表中下一个元素的指针(地址);

2空指针和空链表

3节点间的连线:实心圆和箭头;

4链表名和节点名

①链表名是头指针的名字,该头指针指向表中的第一个节点。

②节点的名字与指向节点的指针有关。不同语言不同。C语言的约定是指向节点的指针称为p,则称节点为*p。这种命名约定隐含一个节点可以有多于一个名字。

4、数组与链表区别

1连接工具:数组是索引,链表是指向下一元素的链(指针或地址)

2在内存中的存储方式:数组是无间隔存储;链表是有间隔存储。

5、链表操作

1搜索链表

链表的搜索算法只能是顺序的。由于链表中的节点没有特定的名字,我们使用两个指针来进行搜索:

pre(先前的)和cur(当前的)。

搜索算法使用一个标记(一个只能取真值或假值的变量),目标找到为真,未找到为假。

2插入节点

在插入链表之前,我们首先要使用搜索算法。如果搜索算法的返回值为假,将允许插入,否则终止算法。因为我们不允许重复值的数据。

①在空表中插入

②在表的开始插入

③在表的末尾插入

④在表中间插入

对list<--new的理解

3删除节点

在插入链表之前,我们首先要使用搜索算法。如果搜索算法的返回值为真(节点找到),我们可以在链表中删除该节点。

①删除首节点

②删除中间或末尾节点

4检索节点

检索就是为了检索或复制节点中的所含数据的目的而随机访问节点。在检索之前也是需要检索的。

检索只使用cur指针。

遍历链表

为了遍历链表我们需要一个步行指针,当指针被处理时,他从一个节点移到另一个节点。

使用循环,步行指针为空的时候,循环终止。

6、链表的应用(与数组应用比较)

如果需要大量的插入和删除,那么链表是合适的数据结构。但是搜索一个链表比搜索一个数组要慢。

11.4 疑问:

为什么没有记录操作?链表为什么是有序的?