目录--“供自己回看的粗略笔记”
!!是markdown文件导入,存在格式问题,可直接看附件文档
数据结构导论
一种电脑存储和组织数据的方式,可以是其更高效。数据结构不光研究数据的操作、操作的实现,还研究分析操作的成本。
谈论数据结构的方式:
1)数学或逻辑模型
抽象数据类型(ADT):只定义要存储的数据,然后定义类型上可进行的操作,不讨论实现细节。
List(列表)—ADT(模型)
1)静态列表(列表中的元素数量不会更改)—Arrays
--存储一些给定数量、给定数据类型的元素
--根据在列表中的任意位置来读取写入、修改元素
--修改任意特定位置的元素
eg:
int A[10];
A[i] = 2;
print A[i];
2)动态列表 —动态数组(效率不高)、链表
--若列表中没有元素,会称列表为空、大小为零
--可以在任何位置插入、删除元素
--可以计算列表中的元素数
动态数组:
int A[MAXSIZE]; //虽是动态,但设有最大“尺寸”
INT end = -1; //设置结尾标识,可以用来判断是否为空,也可计算列表长度
insert(2); //0
当超出所设最大范围时,要创建一个新数组,并复制原数组之前的数据存入新数组,并释放原数组空间,那创建新数组应增加多大呢?且所需创建、复制、移动、释放等操作繁琐,时间成本高。—所以一般新创数组空间为原数组的两倍。
(1)访问(access): O(1) (2)插入(insert): O(n)
(3)移动(remove): O(n) (4)增加(add): O(n)
------所以引出链表
2)实现
不同语言实现相同的ADT
数据类型的具体实现:
Arrays(数组)符合静态List(动态也可)所要的操作
Linked List(链表)符合动态列表所要的操作
Stack(栈)
Queue(队列)
Tree(树)
Grapth…
研究这些数据结构可以为我们提供哪些操作
链表
struct Node
{
int data; //4 bytes
Node* next; //4 bytes
}
由数据(data)or值(value)+下一节点地址组成一个节点(node),每个节点有两个字段,每个节点指向下一节点, 表尾节点指针域为空(NULL), 第一个节点称为头节点(head)
保持列表信息唯一性,所以头节点或第一个节点的地址可以让人访问到完整列表,表尾节点指针域为空或零,表示其不指向任何其他节点。
遍历链表唯一方法:从头开始,一个一个遍历
逻辑视图: