目录
一、链表概述
二、单链表的定义
1.定义
 2.头指针和头结点的异同点
 3.代码演示
三、单链表的操作
1.插入操作
1)插入模拟
2)单链表第i个数据插入结点的算法思路
2.删除操作
1)删除模拟
2)单链表删除第i个数据结点的算法思路
四、单链表结构和顺序表结构对比
首页 常见问题 链表是一种采用什么存储结构存储的线性表

链表是一种采用什么存储结构存储的线性表

Nov 22, 2021 pm 03:04 PM
存储结构 链表

链表是一种采用“链式”存储结构存储的线性表。链表的数据元素所占的存储单元地址可以是连续的,也可以是不连续的,可根据需要临时、动态地申请分配相应的存储空间,数据元素之间的逻辑关系可以用“链”来表达。

链表是一种采用什么存储结构存储的线性表

本教程操作环境: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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

深入探讨Linux ext2文件系统的物理存储结构 深入探讨Linux ext2文件系统的物理存储结构 Mar 14, 2024 pm 09:06 PM

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

使用递归方法在C++中找到链表倒数第n个节点 使用递归方法在C++中找到链表倒数第n个节点 Sep 15, 2023 pm 05:53 PM

给定一个单链表和正整数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输出-节点不存

PHP SPL 数据结构:为你的项目注入速度和灵活性 PHP SPL 数据结构:为你的项目注入速度和灵活性 Feb 19, 2024 pm 11:00 PM

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

PHP 数组和链表的算法时间复杂度比较 PHP 数组和链表的算法时间复杂度比较 May 07, 2024 pm 01:54 PM

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

将一个以链表表示的数字加1 将一个以链表表示的数字加1 Aug 29, 2023 pm 09:17 PM

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

PHP数据结构:链表的魅力,探索动态数据组织 PHP数据结构:链表的魅力,探索动态数据组织 Jun 04, 2024 pm 12:53 PM

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

Python程序:在链表的第一个和最后一个位置添加元素 Python程序:在链表的第一个和最后一个位置添加元素 Aug 23, 2023 pm 11:17 PM

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

Go 语言中的链表操作怎样实现? Go 语言中的链表操作怎样实现? Jun 10, 2023 pm 10:55 PM

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