声明:大部分内容来自 - 《2019天勤数据结构高分笔记》
目录
1. 线性结构 VS 非线性结构
线性结构 | 非线性结构 |
---|---|
1 线性表 2 栈 3 队列 4 串 | 1 数组 2 广义表 3 树 4 图 |
线性结构 ( 逻辑特征 / 逻辑关系 )
仅一个表头元素、仅一个表尾元素,表头无前驱、表尾无后继
除了表头和表尾外的元素 仅一个前驱 和 一个后继
即:1 对 1 的关系
非线性结构
不是 1 对 1 的关系!
为什么数组是非线性结构?
数组是有序的元素序列(√)
但其元素并非只能是 基本数据类型,还能是结构、枚举、类。因此,数组不属于线性结构!
2. 线性表
![](https://i-blog.csdnimg.cn/blog_migrate/31ab44acfad2a3432a132712e0416146.png)
2.1 线性表:相同特征 元素 的有限序列(有序、无序 均可)
其长度为 元素个数n,n ≥ 0,n = 0 时 为空表
3. 线性表存储结构
顺序存储 - 顺序表:连续的存储空间
链式存储 - 链表
3.1 顺序表和链表的比较:
空间 和 时间的比较
(1)空间
1.1 存储空间分配
顺序表:一次性分配连续的存储空间
链表:存储空间多次分配
1.2 存储密度 = 节点值域所占存储量 / 节点结构所占存储量:
顺序表:= 1
链表: <1
(2)时间
1.1 存取方式:
顺序表:一般是随机存取,也可顺序存取(极少)
链表:仅顺序存取
1.2 插入、删除元素
顺序表:平均需要移动一半的元素,复杂度为O(n)
链表:不需要移动元素,仅修改指针就行
4. c/c++代码定义
4.1 顺序表
简约版:当数组为顺序表
int main()
{
int data[maxsize];
int length;
}
正式版:
typedef struct
{
int data[maxsize]; //数组
int length; //数组长度
}sqlist;
4.2 单链表
typedef struct LNode
{
int data; //结点数据域
struct LNode *next; //指向后继结点的指针
}*link,LNode;
LNode * = link
4.3 双链表
typedef struct DLNode
{
int data;
struct DLNode *prior; //指向前继的指针
struct DLNode *next; //指向后继的指针
}DLNode;
4.4 分配链表空间
LNode *a = (LNode*)malloc(sizeof(LNode));