动态链表的创建

简介: 动态链表的创建

一、内存的两种访问方式


1、随机访问方式

对于数组来说,他的所有元素在内存中是连续存储的,因而很容易计算出每个元素的内存地址,从而可以直接访问数组中的任意一个元素。


2、顺序访问方式

对于链表来说,不同的结点在内存中存储的位置是随机的,因而无法计算出每个结点的内存地址,从而只能从第一个结点开始依次访问。

因此,需要将第一个结点的地址保存起来。


二、如何保存第一个结点的地址?

1、带头结点的链表

若是将第一个结点的地址存储到一个专门的结点的指针域中,那么这种链表称为带头结点的链表。image.png

这个专门的结点称为头结点,头结点的数据域中不存储任何有效数据。

这种链表也有头指针,不过此时的头指针变量中存储的是头节点的地址。

看起来头结点似乎多余,实际上引入头结点能够简化链表的创建、插入和删除等操作。


为何要创建一个函数

原因:需要返回头指针的地址,便于后面遍历、删除等操作

image.png


image.png

时刻谨记这张图!

因为指针p一直表示末指针,所以创建一个新指针,利用之后,此刻就变成了末指针

相关文章
|
7月前
指针\动态二维数组空间
指针\动态二维数组空间
38 4
|
3月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
46 2
|
7月前
|
存储
数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)
数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)
46 2
|
8月前
|
存储
建立动态链表
建立动态链表
63 1
|
7月前
|
算法
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
40 0
|
8月前
|
存储 算法
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
59 0
|
8月前
|
存储
数组实现循环队列(新增一个空间)
数组实现循环队列(新增一个空间)
62 0
|
存储 C++
7.2 C/C++ 实现动态链表
动态链表是一种常用的动态数据结构,可以在运行时动态地申请内存空间来存储数据,相比于静态数组和静态链表,更加灵活和高效。在动态链表中,数据元素被组织成一条链表,每个元素包含了指向下一个元素的指针,这样就可以通过指针将所有元素串联起来。使用动态链表存储数据时,不需要预先申请内存空间,而是在需要的时候才向内存申请。当需要添加新的元素时,可以使用`malloc`函数动态地申请内存空间,然后将新的元素插入到链表中;当需要删除元素时,可以使用`free`函数释放元素占用的内存空间,然后将链表中的指针重新连接。
242 0
【为什么】指针,动态内存的例子
【为什么】指针,动态内存的例子