数据结构——线性表(顺序存储结构和单链表结构)

线性表的定义

线性表(List):由零个或多个数据元素组成的有限序列。

(1)它是一个序列,也就是元素之间有个先来后到的;

(2)若元素有多个,则第一个元素无前驱,最后一个无后继;

(3)线性表是有限的;

按照取值的不同,数据类型可以分为两类:

原子类型:不可以再分解的基本类型,例如整形、浮点型、字符型等

结构类型:由若干个类型组合而成,是可以再分解的,例如整形数组是由若干个整形数据组成的。

抽象数据类型

抽象数据类型是指一个数学模型及定义在该模型上的一组操作;

抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。

描述抽象数据类型的标准格式:

ADT 抽象数据类型名

Data

数据元素之间的逻辑关系的定义

Operation

操作

InitList(*L):初始化操作,建立一个空的线性表L。

ListEmpty(L):判断线性表是否为空表,若线性表为空,返回 true,否则返回false。

ClearList(*L):将线性表清空。

GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。

LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。

ListInsert(*L,i,e):在线性表L中第i个位置插入新元素e;

ListDelete(*L,i, *e):删除线性表L中第i个位置元素,并用e返回其值;

ListLength(L):返回线性表L的元素个数;

endADT

线性表的顺序存储结构

存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置;

线性表的最大存储容量:数组的长度MaxSize;

线性表的当前长度:length。

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数比较稳定,不经常插入和删除元素,而更多的操作是存取数据的应用。

优点:

  • 无需为表示表中元素之间的逻辑关系而增加额外的存储空间;
  • 可以快速地存取表中任意位置的元素;

缺点:

  • 插入和删除操作需要移动大量的元素;
  • 当线性表长度变化较大时,难以确定存储空间的容量;
  • 容易造成存储空间的“碎片”。

线性表的链式存储结构

结点

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

单链表

        此链表的每个结点中只包含一个指针域;我们把第一个结点的存储位置叫做头指针,最后一个结点指针为空。

头指针:是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针;头指针具有标识作用,所以常用头指针冠以链表的名字(指针变量的名字);无论链表是否为空,头指针不为空;头指针是链表的必要元素。

头结点:头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度);有了头结点,对在第一个元素结点前插入结点和删除第一结点的操作与其它结点的操作就统一了;头结点不一定是链表的必须元素。

单链表:

头指针->头结点->第一结点->第二结点(头结点数据域一般无意义)

空链表:

头指针->头结点->NULL

在C语言中可以用结构指针来描述单链表:

typedef struct Node
{ElemType data;      //数据域struct Node *Next;  //指针域
}Node;
typedef struct Node* LinkList;

我们看到结点由存放数据元素的数据域和存放后继结点的指针域组成。

假设p是指向线性表第i个元素的指针,则该结点ai的数据域我们可以用p->data的值是一个数据元素,结点ai的指针域可以用p->next来表示,p->next的值是一个指针。

单链表的读取

-声明一个结点p指向链表第一个结点,初始化j从1开始;

-当j<1时,就遍历链表,让p的指针向后移动,不断指向下一结点,j+1;

-若到链表末尾p为空,则说明第i个元素不存在;

-否则查找成功,返回结点p的数据。

C语言实现GetElem

Status GetElem(LinkList L,int i,ElemType *e)
{int j;LinkList p;p = L->Next;  //p存放第一结点的地址j = 1;while(p && j<i){p = p->Next;  //不断遍历链表++j;}if(!p || j>i)return ERROR;*e = p->data;return OK;
}

由于这个算法的时间复杂度取决于i的位置,当i = 1时,则不需要遍历,而i = n时则遍历n-1次才可以。因此最坏情况的时间复杂度为O(n)。

单链表的插入

要将结点s插入到p和p->Next之间,可以用下面语句实现:

s->Next = p->Next;

p->Next = s;

单链表第i个数据插入结点的算法思路:

-声明一结点p指向链表头结点,初始化j从1开始;

-当j<1时就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;

-若到链表末尾p为空,则说明第i个元素不存在;

-否则查找成功,在系统中生成一个空结点s;

-将数据元素e赋值给s->data;

-单链表的插入两个标准语句,返回成功。

Status ListInsert(LinkList *L,int i,ElemType e)
{int j;LinkList p,s;p = *L;j = 1;while(p && j<i){p = p->Next;++j;}if(!p || j>i)return ERROR;s = (LinkList)malloc(sizeof(Node));s->data = e;s->Next = p->Next;p->Next = s;return OK;
}
单链表的删除
Status ListInsert(LinkList *L,int i,ElemType *e)
{int j;LinkList p,q;p = *L;j = 1;while(p->Next && j<i){p = p->Next;++j;}if(!p->Next || j>i)return ERROR;q = p->Next;p->Next = q->Next;*e = q->data;free(q);return OK;
}
单链表的整表创建

创建单链表的过程是一个动态生成链表的过程,从空表的初始状态起,依次建立各元素结点并逐个插入链表。

-声明一结点p和计数器变量i;

初始化一空链表L;

-让L的头结点的指针指向NULL,即建立一个带头结点的单链表;

-循环实现后继结点的赋值和插入。

头插法建立单链表:

尾插法建立单链表:

void CreateListTail(LinkList *L,int i)
{LinkList p,r;*L = (LinkList)malloc(sizeof(Node));r = *L;for(i = 0;I<n;i++){p = (Node *)malloc(sizeof(Node));p->data = rand()%100+1;r->next = p;r = p;}
}
单链表的整表删除

算法思路如下:

-声明结点p和q;

-将第一个结点赋值给p,下一结点赋值给q;

-循环执行释放p和将q赋值给p的操作;

Status ClearList(LinkList *L)
{LinkList p,q;p = (*L)->next;while(p){q = p->next;free(p);p = q;}(*L)->next = NULL;return OK;
}
单链表结构和顺序存储结构的优缺点

存储分配方式:

-顺序存储结构用一般段连续的存储单元依次存储线性的数据元素。

-单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。

时间性能

-查找

·顺序存储结构O(1)

·单链表O(n)

-插入和删除

·顺序存储结构需要平均移动表长一半的元素,时间为O(n)

·单链表在计算出某位置的指针后,插入和删除时间为O(1)

空间性能

-顺序存储结构需要预分配存储空间,分大了造成浪费,分小了容易造成溢出;

-单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8068 标注数量(xml文件个数)&#xff1a;8068 标注数量(txt文件个数)&#xff1a;8068 标注…

Spring Boot实现文件上传和下载

1.背景 项目中经常会有上传和下载的需求&#xff0c;这篇文章简述一下springboot项目中实现简单的上传和下载。 2.代码工程 实验目标 实现简单的文件上传和下载 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标…

第三次去银行办事,核心是犯了抓不住重点这个毛病

手机银行不小心输错了两次密码&#xff0c;然后就限制了交易&#xff0c;只能在柜台操作。 由此引发了比如提示密码错误、定期转活期、转账等功能的异常。 前两次去银行&#xff0c;竟然只是去解决了这些附带问题。 核心问题是限制非柜面交易啊。 哎 这就是抓不住重点&…

2024年9月最新界面:自己如何在电脑上注册新的Google谷歌账号,图文详解和关键点解析、常见问题

有一些朋友需要通过谷歌账号来工作、学习或娱乐&#xff08;例如很多游戏需要用谷歌账号来注册和使用&#xff09;&#xff0c;但是不知道如何注册谷歌账号&#xff0c;或者知道如何注册&#xff0c;但是对于一些步骤或者注意事项不太熟悉&#xff0c;导致注册不成功&#xff0…

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配&#xff08;Exact Match&#xff09;2. 正则表达式匹配&#xff08;Regex Match&#xff09;3. 前缀匹配&#xff08;Prefix Match&#xff09; 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中&#xff0…

证书学习(四)X.509数字证书整理

目录 一、X.509证书 介绍1.1 什么是 X.509证书?1.2 什么是 X.509标准?1.3 什么是 PKI?二、X.509证书 工作原理2.1 PKI 的基础——加密算法2.2 PKI 证书编码三、X.509证书 结构3.1 证书字段3.2 证书扩展背景: 我们在日常的开发过程中,经常会遇到各种各样的电子证书文件,其…

Ubuntu: 配置OpenCV环境

从从Ubuntu系统安装opencv_ubuntu安装opencv-CSDN博客文章浏览阅读2.3k次&#xff0c;点赞4次&#xff0c;收藏14次。开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。OpenCV的应用领域包括:2D和3D功能工具包、运动估计、面部识别系统、手势识别、人机交互、…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

ChatGPT+Simple Mind Map生成思维导图:快速提升学习效率

一、告别杂乱笔记&#xff0c;一键生成清晰思维导图&#xff01; 最近开始学习网络安全&#xff0c;一头扎进了各种协议、漏洞、防御机制的海洋中。信息量巨大&#xff0c;知识点零散&#xff0c;让我很快便陷入了“知识焦虑”——笔记越记越多&#xff0c;却越来越混乱&#…

第50课 Scratch入门篇:放烟花

放烟花 故事背景: 水在一个宁静的小镇上,生活着一位充满好奇心和创造力的小朋友。   有一天晚上,小镇的天空格外黑暗,星星也躲在了云层后面。小朋友望着黑漆漆的夜空,心想:要是能有一场绚丽的烟花表演,那该多好啊!于是,他决定用自己所学的 Scratch 编程知识来创造一…

通过域名无法访问不到网站,IP可正常访问(DNS污染)

一 DNS被污染 就在刚刚突然访问不到csdn&#xff0c;域名无法访问如下图&#xff1a; 确认DNS是否解析有问题 1 ping 域名 先ping一下域名&#xff0c;ping 域名后得到ip, ping通了如下图&#xff1a; 2 使用IP访问测试 通过ip再访问网站&#xff0c;ip可以正常访问如下图&…

.NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.

实现目标。点击图片上传头像 效果图 前端部分图片上传关键代码 <div class"avatar-wrap"><el-imagestyle"width: 154px; height: 154px":src"form.headPic":fit"fit"/></div><div class"upload-box"…

vllm使用BitAndBytes量化模型失败

ValueError: BitAndBytes quantization with TP or PP is not supported yet 使用加载hf模型时&#xff0c;使用load_in_8bit来量化模型&#xff08;底层其实是调用bitsandbytes来量化&#xff09;&#xff1a; import argparse import os import torchdef parse_arguments()…

RP2040 C SDK RTC功能使用

RP2040 C SDK RTC功能使用 &#x1f4cd;《RP2040 C SDK串口功能使用》&#x1f955;RP2040 RTC API官方文档说明&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_rtc&#x1f955;官方例程参考&#xff1a;https://github.com/…

【MySQL】MySQL中表的增删改查——(基础篇)(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL中CDUD的基础操作&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/fNldO &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目录 …

【Python篇】详细学习 pandas 和 xlrd:从零开始

文章目录 详细学习 pandas 和 xlrd&#xff1a;从零开始前言一、环境准备和安装1.1 安装 pandas 和 xlrd1.2 验证安装 二、pandas 和 xlrd 的基础概念2.1 什么是 pandas&#xff1f;2.2 什么是 xlrd&#xff1f; 三、使用 pandas 读取 Excel 文件3.1 读取 Excel 文件的基础方法…

Git常用命令备忘

Git常用命令备忘 Git已经成为程序员日常工具之一&#xff0c;那些Git基本的命令&#xff0c;每天都要用得命令你都记住了吗&#xff1f;如果还没的话&#xff0c;笔者整理了一份清单&#xff0c;以备不时之需所用。 ####三个基本概念 工作区(Workspace)是计算机中项目的根目…

熬夜后补救措施

人体的肝功能问题 直接体现在体态和容颜上 伤肝 三大坏行为 熬夜后补救 *补充养b族、口、、锌、硒 加强代谢 能力 (1)另外熬夜后一定要多喝水 提升身体代谢能力 (2)谷肤甘肽清肝 肝脏排毒&#xff0c;减轻负拒 (3)水飞前含量高点 &#xff08;4)熬夜出更多油 容易长痘 需要清…