数据结构(Chapter Two -03)—线性表的链式表示

news2024/11/24 10:49:44

在这一部分(数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客)里面,我们知道线性表包括顺序表和链表结构。前面写了顺序表的基本操作,那这部分就写一写线性表叭!

链表特点:不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理地址上也相邻。

优点:插入和删除不需要移动元素(顺序表的缺点是需要移动)

缺点:不可以随机存取。需要额外的存放地址的指针域,浪费空间。

我们可以发现顺序表和链表的缺点和优点似乎恰好相反。来一个单链表结点的结构:

 我们可以看到指针域是存放下一个结点的地址的,每一个结点(除第一个)的读取都需要靠前一个结点读取,这就导致了缺点(不能随机读取)。

头指针:可用于标识一个单链表,如单链表L,头指针为NULL时表示一个空表

头结点:为了操作上面的方便,通常会为单链表附加一个头结点。头结点数据域可以不设置任何信息,也可以记录表长等信息。

头结点和头指针的区别:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头结点的链表中的第一个结点,结点内通常不存储信息。

举个栗子,下图为带了头结点的单链表:

引入头结点两个优点:

1、由于第一个数据结点的位置被存放头结点的指针域中,因此在链表的第一个位置上的操作和在表的其他位置上的操作一致,无需特殊处理。

2、无论链表是否为空,其头指针都指向头结点的非空指针(空表中头结点的指针域为,但是可以存在)。

注意了空表可以存在头结点(不存在的时候就是NULL),但是空表长度为0,因此线性表长度是不包括头结点的。

由以上我们可以写出单链表的结点描述,代码如下:

typedef struct LNode{    //定义单链表结点类型
    ElemType data;      //数据域
    struct LNode* next; //指针域
}LNode,*LinkList;
//头插法构建单链表
LinkList List_HeadInsert(LinkList &L){//逆向建立单链表
    LNode *s;
    int x;                           
    L = (LinkList) malloc(sizeof(LNode));//创建头结点,L指向的那片区域是头结点
    L->next = NULL;                   //初始为空链表
    scanf("%d",&x);                   //输入结点的值
    while(x!=9999){                   //输入9999表示结束
        s=(LNode*)malloc(sizeof(LNode));//创建新结点
        s->data=x;
        s->next=L->next;
        L->next=s;                   //将新结点插入表中,L为头指针
        scanf("%d",&x);
    }
    return L;
}
//尾插法构建单链表
LinkList List_TailInsert(LinkList &L){//正向建立单链表
    int x;
    L = (LinkList)malloc(sizeof(LNode));
    LNode *s,*r =L;                   //r表示尾指针
    scanf("%d",&x);                   //输入结点的值
    while(x!=9999){                   //输入9999表示结束
        s=(LNode*)malloc(sizeof(LNode));
        s->data =x;
        r->next =s;
        r=s;                           //r指向新的表尾结点
        scanf("%d",&x);
    }
    r->next = NULL;                    //尾结点指针设置为空
    return L;
}

其中头插法和尾插法的区别:插入的位置不同,头插法每一次都是在头结点的下一个插入,尾插法就是每一次插入的是链表的末端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow-SQL注入(web214-web220)

时间盲注 (最贴合实际的注入) web214 什么都不存在 使用bp进行抓包看看有没有注入点 在原始页面刷新 抓包发现修改debug为1是返回结果是一个sql的查询语句 id可能存在注入点 发现存在时间注入 使用web193脚本进行修改 python盲注脚本 import requests …

「JavaScript基础」一文彻底搞懂JS的事件流以及事件模型

目录 事件事件机制一、事件绑定二、事件监听三、事件委托 事件流事件流模型DOM事件处理DOM0DOM2IE 事件处理程序 常见的事件 在JavaScript中,事件流和事件模型是处理用户交互的关键概念。深入理解这些概念将使你能够更好地处理和响应用户的动作。本文将详细介绍Java…

冷链温湿度监控解决方案,实时监测,助力运输安全

为了确保药品、生鲜等在冷链运输过程中的安全监管,需要对冷链、仓库等环节的温湿度信息进行实时自动检测和记录,有效防范储运过程中可能影响产品质量安全的各类风险,确保储存和运输过程的产品质量。 冷链温湿度监控系统解决方案,利用智能温湿…

leetcode—— 腐烂的橘子

腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到…

每日一道算法题 15(2023-12-28)TLV解析Ⅰ

package com.tarena.test.B20; import java.util.ArrayList; import java.util.Scanner; import java.util.StringJoiner; /** * TLV解析Ⅰ * author Administrator * 输入: * 第一行 31 * 第二层 32 01 00 AE 90 02 00 21 02 30 03 00 AB 32 31 31 0…

UI自动化测试框架搭建 —— yaml文件管理定位元素

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

万界星空科技mes系统可以为企业带来什么好处

随着信息技术的不断发展,MES生产制造系统的作用不断凸显。万界星空科技MES生产制造可以为企业带来四个方面的好处:提升生产效率、降低生产成本、优化生产过程、提高生产质量。本文将从这四个方面分别进行详细阐述,旨在通过对MES生产制造系统的…

【优先级队列 之 堆的实现】

文章目录 前言优先级队列 PriorityQueue优先队列的模拟实现 堆堆的储存方式堆的创建建堆的时间复杂度堆的插入与删除 总结 前言 优先级队列 PriorityQueue 概念:对列是先进先出的的数据结构,但有些情况,数据可能带有优先级,一般出…

C++11新特性:快速初始化成员变量

在C98中,类成员变量的就地声明通常需要在构造函数中进行初始化。 class MyClass { public:// C98 中的类成员变量声明int myVariable;// 构造函数中初始化MyClass() {myVariable 0;} };并且,C98对类中就地声明要求非常高,如果不是整型或者枚…

java使用easyexcel读取excel内容

java 代码读取excel内容。 使用阿里巴巴easyexcel读取excel内容。 ##excel内容 ##依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.5</version></dependency> ##实体类T…

Adobe Media Encoder 2023下载安装教程,ME 2023安装教程,附安装包和工具,无套路,轻松搞的安装

前言 Adobe Media Encoder是一个视频和音频编码应用程序&#xff0c;可让针对不同应用程序和观众&#xff0c;以各种分发格式对音频和视频文件进行编码。包括专门设计的预设设置&#xff0c;以便导出与特定交付媒体兼容的文件&#xff0c;可以按适合多种设备的格式导出视频&am…

Mybatis集成MySQL使用游标查询处理大批量数据

背景 基于数据的时间范围查询&#xff0c;给符合条件的用户推送积分即将到期的提醒。 初期用户量小使用最普通简单的分页查询扫描数据处理数据没问题。随着用户量的上升表数据已经上千万&#xff0c;每天扫描处理的数量也超百万&#xff0c;limit分页出现了慢sql&#xff0c;…

【EISCOPUS双检索】2024电子、通信与智能科学国际会议(ECIS 2024)征稿通知!

2024年5月24日-27日 中国|长沙 会议重要日期 一轮截稿时间&#xff1a;2024年3月10日 录用通知时间&#xff1a;投稿后7-15天 注册截止时间&#xff1a;2024年5月10日 一、大会背景 随着互联网的不断创新&#xff0c;电子、通信和智能科学已经广泛应用于各个领域。为了为…

HarmonyOS鸿蒙学习基础篇 - 运行第一个程序 Hello World

下载与安装DevEco Studio 古话说得好&#xff0c;“磨刀不误砍柴工”&#xff0c;对于HarmonyOS应用开发&#xff0c;我们首先得确保工具齐全。这就好比要进行HarmonyOS应用开发&#xff0c;我们需要确保已经安装了DevEco Studio&#xff0c;这是HarmonyOS的一站式集成开发环境…

HarmonyOS关于deps、external_deps的使用

在添加一个模块的时候&#xff0c;需要在BUILD.gn中声明它的依赖&#xff0c;为了便于后续处理部件间依赖关系&#xff0c;我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 如上图所示&#xff0c;主要分为部件内依赖&#xff08;图左&#xff09;…

一文(10图)了解Cornerstone3D核心概念(万字总结附导图)

Cornerstone3D介绍 Cornerstone3D是一个专门为处理三维医学影像而设计的JavaScript库。 它是Cornerstone项目的一部分&#xff0c;旨在为医学影像社区提供高性能、可扩展且易于使用的开源Web工具&#xff0c;专注于提供交互式的3D医学图像浏览体验&#xff0c;适用于多种医学…

学习Opencv(蝴蝶书/C++)——4.图形和大型数组类型(下)

文章目录 4.5 通过块访问数组(多行多列等范围访问)4.6 矩阵支持的代数运算(运算符重载)4.7 饱和转换4.8 cv::Mat的其他成员函数7. cv::SparsesMat表示N维稀疏数组7.1 基本介绍7.2 引用或者值访问7.2.1 cv::SparsesMat::ptr()7.2.2 cv::SparsesMat::ref()7.2.3 cv::SparsesM…

人民银行成功实现数字人民币与传统支付的互通

西米支付网&#xff08;45ri.com&#xff09;中国人民银行数字货币研究所10月12日在人民银行网站刊发了题为《扎实开展数字人民币研发试点工作》的文章&#xff0c;截至2022年8月31日&#xff0c;已有15个省市的试点地区共计完成了3.6亿笔的交易&#xff0c;交易金额达到了1000…

大小鼠行为刺激-ZL-034B大小鼠跳台仪/多通道跳台记录仪

小鼠跳台实验是一种常用的学习记忆实验方法&#xff0c;它基于条件反射原理&#xff0c;通过观察小鼠在电栅和平台之间跳跃的行为&#xff0c;来研究药物对学习和记忆过程的影响。它适用于各种增智健脑、提高记忆、抗衰老药物和保健品筛选、开发研制。它是初筛药物的理想工具&a…

ubuntu 20.04 aarch64 平台交叉编译 libffi 库

前言 由于打算交叉编译 python&#xff0c;但是依赖 libffi 库&#xff0c;也就是 libffi 库也需要交叉编译 环境&#xff1a; ubuntu 20.04 交叉编译工具链&#xff1a;这里使用 musl libc 的 gcc 交叉编译工具链&#xff0c;aarch64-linux-musleabi-gcc&#xff0c;gcc 版本…