链表是一种采用什么存储结构存储的线性表
链表是一种采用“链式”存储结构存储的线性表。链表的数据元素所占的存储单元地址可以是连续的,也可以是不连续的,可根据需要临时、动态地申请分配相应的存储空间,数据元素之间的逻辑关系可以用“链”来表达。
本教程操作环境:windows7系统、Dell G3电脑。
为了克服顺序表存储结构的缺点,充分利用存储空间和提高运行效率,线性表可以采用另一种存储结构——链式存储结构。线性表的链式存储结构简称“链表(link list)”
一、链表概述
链表的数据元素所占的存储单元地址可以是连续的,也可以是不连续的,可根据需要临时、动态地申请分配相应的存储空间,数据元素之间的逻辑关系可以用“链”来表达。
链表的插入和删除不需要移动数据元素,只需要修改链即可实现。
链表分类:
1.按链表内存分配实现的方式分类
①动态链表
②静态链表
2.按链接方式分类
①单链表
②循环链表
③双链表
(它们均为动态链表)
二、单链表的定义
1.定义
为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对于每个数据元素ai,除了存储本身的信息外,还需要存储一个指示其直接后继的信息(后继的存储位置-地址)。
存储数据元素信息的域称为数据域,存储直接后继位置的域称为指针域,指针域中存储的信息称为指针或链。
这两部分信息组成数据元素ai的存储映像,称为结点。
n个结点链成一个链表,即为线性表(a1,a2,a3,...,an)的链式存储结构,因为链表的每个结点中只包含一个指针域,所以称为单链表。
对于线性表来说,总有个头有个尾,链表也不例外。链表中指向单链表第一个结点的指针叫做头指针,整个链表的存取必须从头指针开始进行,之后的每个结点都是上个结点的后继指针指向的位置。链表的最后一个结点的指针为“空(通常用NULL表示)”——空指针。
为了方便实现链表的各种运算,在单链表的第一个数据结点之前设一个类型相同的结点,该结点称为头结点。
头结点的数据域可以存储一个特殊的标志信息如链表的长度,也可以不存储任何数据。
链表的第一个数据结点和最后一个结点又称为首结点和尾结点。
2.头指针和头结点的异同点
头指针:
- 头指针是指链表中指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。
- 头指针具有标识作用,常用头指针冠以链表的名字。
- 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。
头结点:
- 头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意。
- 有了头结点,对在第一元素结点前插入结点和删除第一个结点,其操作与其他结点的操作就统一了。
- 头结点不一定是链表必须要素。
3.代码演示
/*线性表的单链表存储结构*/ /*结点定义*/ typedef struct Node { ElemType data; struct Node *next; }Node; /*单链表定义*/ typedef struct Node *LinkList;
三、单链表的操作
1.插入操作
1)插入模拟
假设存储元素e的结点为s,将s插入到ai结点后面,如何操作?
思考:两句插入代码能否交换?
不能,如果调换过来,会导致ai+1等后面的元素无法找到,因为s的指针域没有指向ai+1的地址。
2)单链表第i个数据插入结点的算法思路
- 声明一个结点p指向链表的第一个结点,初始化j=1;
- 当j
- 若到链表末尾p为空,则说明第i个元素不存在;若查找成功,生成一个空节点s(使用malloc函数)
- 将数据元素e赋值給s->data,即为s->data=e;
- 插入标准语句:s->next=p->next;p->next=s;
- 返回成功。
2.删除操作
1)删除模拟
假设存储元素ai的结点为q,要实现将结点q删除单链表的操作。
2)单链表删除第i个数据结点的算法思路
- 声明一个结点p指向链表的第一个结点,初始化j=1;
- 当j
- 若到链表末尾p为空,则说明第i个元素不存在;若查找成功,将删除结点p->next赋值給q
- 插入标准语句:p->next=q->next;
- 将q结点赋值給e,即为e=q->data;
- 释放q结点
- 返回成功。
四、单链表结构和顺序表结构对比
存储方式:
- 顺序表用一段连续的存储单元依次存储线性表中的数据元素
- 单链表采用链式存储结构,用一组任意的存储单元存放线性表元素
时间性能:
①查找
- 顺序表O(1)
- 单链表O(n)
②插入和删除
- 顺序表O(n)
- 单链表O(1)
空间性能:
- 顺序表需要预分配存储空间,分大了,浪费,分小了易发生上溢
- 单链表不需要预分配存储空间,需要多少都可以分配,元素个数不受限制
更多相关知识,请访问常见问题栏目!
以上是链表是一种采用什么存储结构存储的线性表的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Linuxext2文件系统是一种在大部分Linux操作系统上使用的文件系统,它采用了一种高效的磁盘存储结构来管理文件和目录的存储。在深入探讨Linuxext2文件系统的物理存储结构之前,我们首先需要了解一些基本概念。在ext2文件系统中,数据存储在数据块(block)中,数据块是文件系统中最小的可分配单位。每个数据块有固定的大小,通常为1KB、2KB或4

给定一个单链表和正整数N作为输入。目标是使用递归找到给定列表中从末尾算起的第N个节点。如果输入列表有节点a→b→c→d→e→f并且N为4,那么倒数第4个节点将是c。我们将首先遍历直到列表中的最后一个节点以及从递归(回溯)增量计数返回时。当count等于N时,则返回指向当前节点的指针作为结果。让我们看看此的各种输入输出场景-输入-List:-1→5→7→12→2→96→33N=3输出−倒数第N个节点为:2解释−第三个节点是2。输入−列表:-12→53→8→19→20→96→33N=8输出-节点不存

PHPSPL数据结构库概述PHPSPL(标准php库)数据结构库包含一组类和接口,用于存储和操作各种数据结构。这些数据结构包括数组、链表、栈、队列和集合,每个数据结构都提供了一组特定的方法和属性,用于操纵数据。数组在PHP中,数组是存储一系列元素的有序集合。SPL数组类提供了对原生的PHP数组进行加强的功能,包括排序、过滤和映射。以下是使用SPL数组类的一个示例:useSplArrayObject;$array=newArrayObject(["foo","bar","baz"]);$array

数组和链表的算法时间复杂度比较:访问数组O(1),链表O(n);插入数组O(1),链表O(1)/O(n);删除数组O(1),链表O(n);搜索数组O(n),链表O(n)。

数字的链表表示是这样提供的:链表的所有节点都被视为数字的一位数字。节点存储数字,使得链表的第一个元素保存数字的最高有效位,链表的最后一个元素保存数字的最低有效位。例如,数字202345在链表中表示为(2->0->2->3->4->5)。要向这个表示数字的链表添加1,我们必须检查列表中最低有效位的值。如果小于9就可以了,否则代码将更改下一个数字,依此类推。现在让我们看一个示例来了解如何做到这一点,1999表示为(1->9->9->9)并添加1应该将其

链表是一种数据结构,采用一系列带有数据和指针的节点组织元素,特别适合处理大型数据集和频繁的插入/删除操作。它的基本组成部分包括节点(数据和指向下一个节点的指针)和头节点(指向链表中第一个节点)。常见链表操作包括:添加(尾部插入)、删除(特定值)和遍历。

在Python中,链表是一种线性数据结构,它由一系列节点组成,每个节点包含一个值和对链表中下一个节点的引用。在本文中,我们将讨论如何在Python中将元素添加到链表的第一个和最后一个位置。LinkedListinPython链表是一种引用数据结构,用于存储一组元素。它在某种程度上类似于数组,但是在数组中,数据存储在连续的内存位置中,而在链表中,数据不受此条件限制。这意味着数据不是按顺序存储,而是以随机的方式存储在内存中。Thisraisesonequestionthatis,howwecanac

链表(LinkedList)是一种常见的数据结构,它由一系列结点(Node)组成,每一个结点包含两个关键属性:数据域(Data)和指针域(Next)。其中,数据域用于存储实际数据,指针域则指向下一个结点。通过这种方式,链表以一种灵活的方式存储数据,适用于许多不同的应用场景中。在Go语言中,链表结构也得到了良好的支持。Go的内置标准库中提供了cont