《计算机科学导论(第二版)》 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 疑问:
为什么没有记录操作?链表为什么是有序的?