封装链表、线索二叉树、选择树、堆

本文探讨了封装链表(单链表、静态链表、循环链表、双向链表和Linux内核链表)的优缺点,以及线索二叉树的构建和遍历技巧,包括选择树(如胜者树和败者树)和堆(大顶堆与小顶堆)的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

封装链表:
尾添加的效率低、非法下标的判断效率也非常低
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、通过线索循环遍历二叉树

选择树:(胜者树、败者树)
是一种完全二叉树,待比较的数据都存储在最后一层,根节点
是根据左右子树其中一个生成,因此根节点是最大或者是最小的,
选择树的功能是快速找出最大值或最小值

堆:
是一种完全二叉树,不适合链式存储
大顶堆(大根堆):根节点比左右子树大
小顶堆(小根堆):根节点比左右子树小
数据项:
存储数据的内存首地址
容量
数量

操作:创建、销毁、添加、删除、空堆、满堆
堆可以实现优先队列的效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值