《计算机科学导论(第二版)》  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 疑问:

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