封装链表:
尾添加的效率低、非法下标的判断效率也非常低
1、单链表
结点:
数据域
指针域
单链表数据项:
头结点
尾结点
结点数量
2、静态链表
结点:
数据域
游标
静态链表的结点存储在连续的内存中,通过游标来访问下一个
结点
这种链表在插入删除时需要修改游标的值,而不用申请、释放
结点内存就可以达到类似链式结构的效果
牺牲了随机访问的功能、也没达到链式动态申请内存的效果,只是
给没有指针的编程语言实现链表的一种方式,适用范围不大
3、循环链表
链表的最后一个结点的next不再指向NULL;而是指向头结点,这
种链表称为单向循环链表,简称循环链表,它好处是可以通过任意
结点来遍历整个链表
4、双向链表
结点:
前驱指针 prev
数据域
后继指针 next
数据项:
头结点
结点数量
特点;
1、在任意结点都可以遍历整个链表
2、相比单链表,删除、插入更直接
3、已知结点位置,可以选择从前往后或者从后往前遍历,提高
链表的访问效率
5、Linux内核通用链表
链表的结点不能包含万物,那么就让万物来包含结点
//计算结构成员member所在结构中的距离第一个成员地址编号的差值
#define offset(type,member) ((int)&((type*)0->member))
//计算返回结构成员指针所在结构变量的首地址
#define node_to_obj(node,type,member)\
((type*)((void*)node-offset(type,member)))
//第二种遍历方式
#define list_for_each_entry(obj,head,member)
for(obj=node_to_obj(head->next,typeof(*obj),member);
head!=&obj->member;
obj=node_to_obj(obj->member.next,typeof(obj),member))
封装链表:
1、单链表
2、静态链表
3、循环链表
4、双向循环链表 prev next
5、Linux内核链表
6、通用链表
结点:
void ptr;
指针域
运算:常规功能+回调函数
线索二叉树:
规律:在n个节点的链式二叉树中必定有n+1个空指针
有序链式二叉树中有很多的空指针,可以让这些指针指向
下一个、前一个节点,这样在遍历时可以不用递归而可以
使用循环遍历,可以提高树的遍历速度
中序线索二叉树节点数据项:
数据
左子树指针
右子树指针
右子树指针标志位(假表示指向真的右子树,真表示右子树
指向下一个节点)
实现过程:
1、构建有序二叉树
2、创建线索
3、通过线索循环遍历二叉树
选择树:(胜者树、败者树)
是一种完全二叉树,待比较的数据都存储在最后一层,根节点
是根据左右子树其中一个生成,因此根节点是最大或者是最小的,
选择树的功能是快速找出最大值或最小值
堆:
是一种完全二叉树,不适合链式存储
大顶堆(大根堆):根节点比左右子树大
小顶堆(小根堆):根节点比左右子树小
数据项:
存储数据的内存首地址
容量
数量
操作:创建、销毁、添加、删除、空堆、满堆
堆可以实现优先队列的效果