数据结构(八)之链表

1.1 链表的引出
1.1.1 思考

  • 顺序存储结构线性表有什么缺陷?
    • 插入和删除操作需要移动大量的元素。

1.1.2 如何解决上面的问题?

  • 使用链表

  • 链表的定义

    • 为了表示每一个数据元素与其后继元素之间的逻辑关系; 数据元素处理存储本身的信息外,还需要存储其直接后继的信息

    在这里插入图片描述

  • ai 和a(i+1) 是线性表中的两个相邻数据元素; 在物理内存中无相邻关系

1.1.3 链式存储逻辑结构

  • 基于链式存储结构的线性表中,每个节点都包含数据域和指针域
    • 数据域:存储数据元素本身
    • 指针域:存储相邻节点的地址
      在这里插入图片描述

1.2 基本概念

1.2.1 专业术语的统一

  • 顺序表: 基于顺序存储结构的线性表
  • 链表: 基于链式存储结构的线性表
    • 单链表 : 每个节点只包含直接后继的地址信息
    • 循环链表 : 单链表中的最后一个节点的直接后继为第一个节点
    • 双向链表 : 单链表中的节点包含直接前驱和后继的地址信息

1.2.2 链表中的基本概念

  • 头结点
    • 链表中的辅助阶段,包含指向第一个数据元素的指针
  • 数据节点
    • 链表中代表数据元素的节点,表现形式为: 数据元素,地址
  • 尾节点
    • 链表中的最后一个暑假节点,包含的地址信息为空

1.2.3 单链表中的节点定义

在这里插入图片描述

1.2.4 单链表中的内部结构
在这里插入图片描述

  • 头结点在单链表中的意思是: 辅助数据元素的定位,方便插入和删除操作;因此,头结点不存储实际的数据元素

1.2.4 在目标位置插入数据元素

  1. 从头节点开始,通过current指针定位到目标位置
  2. 从堆空间中申请新的Node节点
  3. 执行操作
node->value = e;
node->next = current->next;
current->next = node;
  1. 图解插入操作
    在这里插入图片描述

1.2.5 在目标位置删除数据元素

  1. 从头节点开始,通过current指针定位到目标位置
  2. 使用toDel指针指向需要删除的节点
  3. 执行操作
	toDel = current->next;
	current->next = toDel->next;
	delete toDel;

1.3l链表的实现
在这里插入图片描述
1.3.1 LinkList的实现

  • 类模板,通过头结点访问后继节点
  • 定义内部节点类型,用于描述数据域和指针域
  • 实现线性表的关键操作(增删改查

1.3.2

1.3.3 问题

  • 头结点是否存在隐患
  • 实现代码是否可以优化?

1.3.3.1 头结点是否存在隐患

    struct Node : public Object  //这里如果不写Object会怎样?
    {
        T value;
        Node * next;
    };
    Node m_header;

// T 类型是 类类型
class Test
{
public:
	Test()
	{
		throw 0;
	}
}
int main()
{
    LinkList<Test> list;
    cout << "zhangsan" << endl;
    return 0;
}

在这里插入图片描述

  • 如何解决

在这里插入图片描述

1.3.3.2 实现代码是否可以优化?

  • 注意,有的时候一定重新构建下代码
  • 只要修改了代码,就需要进行代码测试

参考一 : 狄泰软件课程
如有侵权:请联系邮箱 1986005934@qq.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值