内容正文:
第十一章 数组与链表(含代码)
1.数组在内存中的存储方式为顺序存储,数组作为常用的数据结构,有特定的数据组织、存储结构及操作特性。
2.计算机中数据的存储结构主要分为顺序存储结构和非顺序存储结构。常见的顺序存储结构是数组,常见的非顺序存储结构是链表
3.数字是由相同类型的变量构成的一个序列。数组使用一个标识符命名,并用编号区分数组内的各个变量,这个特殊的标识符号称为数组名,编号称为下表或索引。由数组名和下标组成数组的各个变量称为数组的分量,也称为数组元素。(数组的下标一般从0开始)
4.数组在内存中的存储结构简单,创建数组时系统会分配一块连续的存储空间,每个数组元素按照下标顺序依次存储。如下图
图1.1
5.一维数组适合用来表示具有线性特征的数据序列,因此只需要一个下标来表示数据元素在该序列中的位置。如果要表示二维空间内既有纵向联系和又有横向联系的一批数据,那么采用二维数组会变得更形象、方便由于二维数组中的数组有行有列两个维度的位置信息,因此需要两个下标。二维数组下标详见下图:
图1.2
6.用二维数组表示的数据在内存中的存储方式也才用顺序存储,有行优先存储和列优先存储。一般默认采用行优先。
7.数组的特性:1.数组元素的数据类型相同,2.通过数组名的下标对数组元素的值进行访问,3.数据存储空间不变
8.动态数组就是在声明时没有确定数据规模的数组,可以在任何时候改变数据规模。
9.对数组的常见操作有:数组的创建、数组元素的访问、数组元素的插入和删除等。
10.Python没有数组这种数据结构,所以采用列表来实现。
11.数组的和创建实质是在系统内存中划分一块连续区域,同来保存数组所含的所有数据元素
12.数组元素的访问指的是寻址到特定的数组元素,并根据存储地址对该数据元素进行读取、修改等操作。因为数组元素从0开始数,所以:例如 s[5] 访问的是s数组的第六个元素
13.Python列表常用函数与方法:
图1.3
14.链表指的是将需要处理的数据对象以节点的形式,通过指针串联在一起的一种数据结构。链表中的每一个节点一般由“数据区域”和“指针区域”两部分构成(如下图)。数据区域用于保存实际需要处理的数据元素,指针区域用来保存该节点相邻节点的存储地址,通过该地址指向(指针)来实现从当前节点按顺序走到相邻的节点。某个节点前面的相邻节点称为该节点的前驱节点,后面的相邻节点称为该节点的后继节点。
15.每个链表都拥有一个表头---head(也称为头指针),头指针的作用之一是链表的入口,只有通过头指针才能进入链表;作用之二是为循环链表设立一个边界,便于数据处理时的边界判断和处理。
16.链表可以根据每个节点中指针的数量分为两类: 只有一个指针的单向链表和有两个指针的双向链表(即每个节点有两个指针区域,一个指向前驱节点,一个指向后继节点)。将第一个节点和最后一个节点使用指针链接,就会形成循环链表
17.单向链表中各个节点在内存中可以非顺序存储,每个节点使用指针指向后继节点的存储地址。进入链表只能通过头指针head,其他节点则需要经过所有在它之前的节点才可以访问,尾节点的指针指向null,表示指向为空(一般情况下,尾指针为-1。当尾指针指向head时,即为循环链表)
18.链表的特性:1.同一链表中每个节点的结构均相同,2.每个链表必定有一个头指针,以实现对链表的引用和边界处理,3.链表占用的空间不固定。
19.链表的操作有:链表的创建、链表节点的访问、链表节点的插入与删除
单向链表代码实现
给定一个链表 a[],其第一个元素代表的下标为 head。a[i] 代表的元素是一个长度为 2 的数组,其中 a[i][0] 表示它的数据 data(数据都是整数),a[i][1] 表示它的下一个元素 next,如果 next 为 −1 代表其是链表的最后一个元素。
假设有如下代码:
a = [['A',2],['D',-1],['B',3],['C',1]]
head = 0
#删除第一个元素
head = a[head][1]
#遍历链表
h = head
while h != -1:
print(a[h][0])
h = a[h][1]
#删除中间元素,根据内容B
h = head
pre = head
while h != -1:
if a[h][0] == 'B':
break
else:
pre = h
h = a[h][1]
a[pre][1] = a[h][1]
#在头部插入元素
head = 0
a.append(['E',head])
head = len(a)-1
#插入中间元素根据值
#首先找到B
h = head
while h !=