线性结构
线性表
实现方式:
数组(又称顺序表):
支持根据索引随机访问,支持用地址访问
链表:
链表之间用指针连接,不支持随机访问。
链表结点的定义:
typedef struct LNode{
int val;
struct LNode* next;
}List,LNode;
栈和队列(输入/输出受限的双端队列)
栈:
有口无肛门(?)结构,吃了吐,进出全在一端,且先进栈的元素会被后进栈的压在下面。
所以栈具有后进先出(LIFO)特性。
队列:
有口有肛门,先吃的先拉(好像有点恶心但是确实挺形象的)
正经队列是不允许插队的,就像吃饭只能从嘴里吃进去,所以只能在队尾加入新元素。
出队时是队首元素出队,所以队列具有先进先出(FIFO)特性
非线性结构
树
一些概念:结点,祖先 / 父(双亲)/ 子(子女)/ 兄弟,度,深度,高度,宽度,路径
二叉树(一些结论可以推广到n叉树)
二叉查找树()
平衡二叉树(AVL Tree)
红黑树
B树/B-树
图
一些概念:点,边(有向边与无向边),连通图与非联通图,强连通图与弱连通图,连通分量
图的实现:
邻接矩阵:一个二维数组,g[i][j]存储的是从i到j的路径长度(权重)
如果是无向图,只需要存储一半空间,但这并不代表占用的空间会降低,因为申请的是n*n大小的二维数组。可以使用一位数组模拟二维数组达到减小空间占用的目的。
邻接表:一个线性表存储表头节点,每个节点是一个链表的起点,该链表中存储与表头结点之间有边的所有结点。
边节点可以定义为
typedef struct Gnode{
int val;//路径长度
LNode* nextnode;
}Gnode;