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 在目标位置插入数据元素
- 从头节点开始,通过current指针定位到目标位置
- 从堆空间中申请新的Node节点
- 执行操作
node->value = e;
node->next = current->next;
current->next = node;
- 图解插入操作
1.2.5 在目标位置删除数据元素
- 从头节点开始,通过current指针定位到目标位置
- 使用toDel指针指向需要删除的节点
- 执行操作
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