数据结构——线性表(二)

线性表顺序存储结构的优缺点

优点:1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间

        2.可以快速的存取表中的任一位置的元素

缺点:1.插入和删除操作需要移动大量的元素

        2.当线性表长度变化较大的时候,难以确定存储空间的容量

        3.造成存储空间的"碎片"

所以我们有了另外一种线性表的存储结构——链式存储结构

链式存储结构

我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域,指针域中存储的信息称作指针或链.这两部分信息组成数据元素ai的存储映像,称为结点(Node)

链表中只含有一个指针域,所以叫做单链表

对于线性表来说,总得有头有尾,链表也不例外,所以我们把链表中的第一个节点的存储位置叫做头指针,整个链表的存取就必须从头指针开始了

而最后一个结点的指针域因为没有指向任何地方所以我们把其置为空,即(NULL)

有时候,我们为了更加方便的对链表进行操作,会在单链表的第一个结点前附设一个结点,成为头结点,头结点的数据域不存储任何数据

头指针与头结点的异同点

1.头指针是指链表指向第一个结点的指针,若链表有头结点,那头指针就是指向头结点的指针,而头结点是为了操作的统一和方便而设立的,其数据域一般无意义,也可以存放链表的长度

2.头指针具有标志作用,所以常用头指针冠以链表的名字

3.无论链表是否为空,头指针均不为空,头指针是链表的必要元素,但是头结点不是链表的必须要素

单链表的定义

typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

单链表的读取

Status GetElem(LinkList L,int i,ElemType *e)
{
    int j;
    LinkList p;        //声明一结点p
    p=L->next;         //让p指向链表L的第一个结点
    j=1;               //j为计数器
    while(p && j<i)    //p不为空或者计数器j还没有等一i时,循环继续
    {
        p=p->next;     //让p指向下一个结点
        ++j;
    }
    if(!p || j>i)
        return ERROR;  //第i个元素不存在
    *e=p->data;        //取第i个元素的数据
    return OK;
}

说白了就是从头开始找,直到第i个结点为止,因此最坏情况的时间复杂度为O(n)

单链表的插入

Status LinkInsert(LinkList *L,int i,ElemType e)
{
    int j;
    LinkList p,s;
    p=*L;
    j=1;
    while(p && j<i)                    //寻找第i个结点
    {
        p=p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;                  //第i个元素不存在
    s=(LinkList)malloc(sizeof(Node));  //生成新结点
    s->data=e;
    s->next=p->next;                   //将p的后继结点赋值给s的后继
    p->next=s;                         //将s赋值给p的后继
    return OK;
}

单链表的删除

Status LinkDelete(LinkList *L,int i,ElemType *e)
{
    int i;
    LinkList p,q;
    p=*L;
    j=1;
    while(p->next && j<i)        //遍历寻找第i个元素
    {
        p=p->next;
        ++j;
    }
    if(!(p->next) || j>i)
        return ERROR;            //第i个元素不存在
    q=p->next;
    p->next=q->next;             //将q的后继赋值给p的后继
    *e=q->data;                  //将q结点中的数据给e
    free(q);                     //让系统回收此结点,释放内存
    return OK;
}

对于插入或删除数据越频繁的操作,单链表的效率优势就越明显

单链表整表创建

头插法

void CreateListHead(LinkList *L,int n)
{
    LinkList p;
    int i;
    srand(time(0));                        //初始化随机数种子
    *L=(LinkList)malloc(sizeof(Node));     
    (*L)->next=NULL;                       //先建立一个带头结点的单链表
    for(i=0;i<n;i++)
    {
        p=(LinkList)malloc(sizeof(Node));  //生成新结点
        p->data=rand()%100+1;              //随机生成100以内的数字
        p->next=(*L)->next;
        (*L)->next=p;                      //插入到表头
    }
}
尾插法

void CreateListTall(LinkList *L,int n)
{
    LinkList p,r;
    int i;
    srand(time(0));                        //初始化随机数种子
    *L=(LinkList)malloc(sizeof(Node));     //L为整个线性表
    r=*L;                                  //r为指向尾部的结点
    for(i=0;i<n;i++)
    {
        p=(Node*)malloc(sizeof(Node));     //生成新结点
        p->data=rand()%100+1;              //随机生成100以内的数字
        r->next=p;                         //将表尾终端结点的指针指向新结点
        r=p;                               //将当前新结点定义为表尾的终端结点
    }
    r->next=NULL;                          //表示当前链表结束
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang线上内存爆掉问题排查(pprof)

Golang线上内存爆掉问题排查&#xff08;pprof&#xff09; 1 问题描述 某天&#xff0c;售后同事反馈&#xff0c;我们服务宕掉了&#xff0c;客户无法预览我们的图片了。 我们预览图片是读取存储在我们S3服务的数据&#xff0c;然后返回给前端页面展示。因为客户存在几百M的…

【Python】你真的了解爬虫吗?初识爬虫

什么是爬虫&#xff1f; 简单来说&#xff1a;代替人去模拟浏览器进行网页操作。 它能解决什么问题&#xff1f; 自动高效地获取互联网中我们感兴趣的信息并为我们所用。 即&#xff1a;为其他程序提供数据源 如搜索引擎(百度、Google等)、数据分析、大数据等等。 爬虫的分…

基于MS的水分子径向分布函数(RDF)计算

​​​​​​ 构建水分子结构 新建一个3D Atomistic.xsd文件&#xff0c;命名为H2O&#xff0c;点击 新建水分子结构。 图1 水分子构建 构建AC模型 步骤如下图所示&#xff0c;单击选择Modules中的Amorphous Call&#xff0c;Calculation&#xff1b;计算精度Quality选择 U…

python爬虫之selenium4使用(万字讲解)

文章目录 一、前言二、selenium的介绍1、优点&#xff1a;2、缺点&#xff1a; 三、selenium环境搭建1、安装python模块2、selenium4新特性3、安装驱动WebDriver驱动选择驱动安装和测试 基础操作1、属性和方法2、单个元素定位通过id定位通过class_name定位一个元素通过xpath定位…

首页HF粗排模型优化

[work rus_env]$ pwd /home/work/xx/du-rus/offline-tools/du_rus/rus_env [work rus_env]$ python buildenv_rus.py 5a0e771e938a486df3b8b3e1cde1a39c2006882d 5f3241963a3e39a8e1eae05d7075fc5b9278a7c7 打开日志级别 [workxx conf]$ vim /home/work/xx/du-rus/du_rus_…

代码随想录算法训练营DAY11|C++栈和队列Part.2|LeetCode:20.有效的括号、 1047.删除字符串中所有相邻重复项、150.逆波兰表达式

文章目录 20.有效的括号思路CPP代码 1047.删除字符串中所有相邻重复项思路CPP代码 150.逆波兰表达式思路什么是逆波兰表达式本题的思路 CPP代码 20.有效的括号 力扣题目链接 文章链接&#xff1a;20.有效的括号 视频链接&#xff1a;LeetCode&#xff1a;20. 有效的括号 状态&a…

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍&#xff0c;将它与action自动化流程结合&#xff0c;可以实现一些小游戏 例如&#xff1a;2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

搜索与图论——Prim算法求最小生成树

在最小生成树问题里&#xff0c;正边和负边都没问题 朴素版prim算法 时间复杂度O(n^2) 生成树&#xff1a;每一次选中的t点&#xff0c;它和集合的距离对应的那条边&#xff0c;就是生成树的一条边 算法流程和dijkstra算法非常相似 #include<iostream> #include<cs…

浏览器工作原理与实践--栈空间和堆空间:数据是如何存储的

对于前端开发者来说&#xff0c;JavaScript的内存机制是一个不被经常提及的概念 &#xff0c;因此很容易被忽视。特别是一些非计算机专业的同学&#xff0c;对内存机制可能没有非常清晰的认识&#xff0c;甚至有些同学根本就不知道JavaScript的内存机制是什么。 但是如果你想成…

039—pandas 不规则表头转换为规整DataFrame

使用步骤 读入数据 代码如下&#xff08;示例&#xff09;&#xff1a; import pandas as pd import numpy as np df pd.DataFrame({0: [姓名, 性别],1: [张三, 男],2: [年龄,np.nan],3: [18,np.nan]}) dfdf.values.reshape([4,2])r len(df.columns)(pd.DataFrame(df.valu…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

24.WEB渗透测试-BurpSuite关于app抓包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;23.WEB渗透测试-BurpSuite&#xff08;二&#xff09; 方法一&#xff1a;使用模拟器&am…

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

工作常用设计模式

设计模式分类 创建者模式&#xff08;5种&#xff09; 单例模式原型模式工厂方法模式抽象工厂模式建造者模式 结构型模式&#xff08;7种&#xff09; 代理模式适配器模式桥接模式装饰者模式外观模式享元模式组合模式 行为型模式&#xff08;11种&#xff09; 模板方法模…

qdrant

文章目录 一、关于 qdrantFeaturesFiltering and PayloadHybrid Search with Sparse Vectors Vector Quantization and On-Disk StorageDistributed DeploymentHighlighted Features Integrations 二、快速上手1、下载和运行安装 qdrant-clientdocker 2、初始化 client3、创建 …

在.Net6中用gdal实现第一个功能

目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称&#xff0c;然后选择 "Manage NuGet Packages"&#xff08;管理 NuGet 包&#xff09;。N…

用docker搭建的Vulfocus镜像管理界面不能同步解决办法

之前拉取的Vulfocus镜像同步功能失效&#xff0c;最简单的解决办法就是换一个能同步的版本 # 修改镜像源 sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://dockerproxy.com/"] } EOFsudo syste…

EasyDarwin 、ffmpeg 音视频推流拉流;OBS视频推理软件、obs-rtspserver服务器

参考&#xff1a;https://blog.csdn.net/N71FS1/article/details/130019563 一、EasyDarwin ffmpeg ffmpeg 推送音视频流到rtsp流服务器 EasyDarwin 作为rtsp流服务器 &#xff08;下载&#xff1a;https://www.easydarwin.org/p/easydarwin.html&#xff09;OBS 直播音视频录…

N9010A安捷伦N9010A信号分析仪

181/2461/8938产品概述&#xff1a; Keysight N9010A EXA 信号分析仪是最大限度提高生产线吞吐量的最快方法。从测量速度到代码兼容性&#xff0c;它让每一毫秒都很重要&#xff0c;并帮助您降低总体测试成本。 我们无法预测未来&#xff0c;但安捷伦可以利用我们面向未来的测…

test7

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…