第二章 线性表
线性表
- 线性表的基本概念
- 线性表的顺序存储
- 线性表顺序存储的类型定义
- 线性表基本运算在顺序表上的实现
- 顺序表实现算法的分析
- 线性表的链接存储
- 单链表的类型定义
- 线性表的基本运算在单链表上的实现
- 其他运算在单链表上的实现
- 建表
- 删除重复结点
- 其他链表
- 循环链表
- 双向循环链表
- 顺序实现与链接实现的比较
- 小试牛刀
线性表的基本概念
- 线性表:是一种线性结构,由n(n>=0)个数据元素组成的有序序列,数组元素称为结点,n称为表长
- 线性表通常可表示为(a1,a2,…,an),a1称为起始结点,an称为终端结点。对任意一对相邻结点ai和·ai+1(1<=i<n),ai称为ai+1的直接前驱,ai+1称为ai的直接后继
- 基本特征:结点具有一对一的关系,结点数不为零,则除起始结点没有直接前驱外,其他每个结点有且仅有一个直接前驱;除终端结点没有直接后继外,其他结点有且仅有一个直接后继
- 线性表的基本运算及其功能描述
- 初始化Initiate(L):建立一个空表L=(),L不含数据元素
- 求表长Length(L):返回线性表L的长度
- 读表元素Get(L,i):返回线性表第i个数据元素,当i不满足1<=i<=Lenght(L)时,返回一特殊值
- 定位Locate(L,x):查找线性表中数据元素等于x的数据结点序号,若有多个,则取第一个
- 插入Insert(L,x,i):在线性表L的第i个元素之前插入一个值为x的新数据元素,表长度加1
- 删除 Delete(L,i):删除线性表L的第i个数据元素ai,表长度减1
线性表的顺序存储
线性表顺序存储的类型定义
- 线性表存储的方法:将表中结点依次存放在计算机内存中一组连续的存储单元中
- 用顺序存储实现的线性表称为顺序表
线性表基本运算在顺序表上的实现
- 插入:在i处插入x,即ai——an向后移一位,将x置于i,表长+1;算法描述如下:
void InsertSeqList L,DataType x,int i)
{
if (L.length==Maxsize) exit("表已满")
if (i<1 || i>L.length+1) exit("位置错")
for(j=L.length;j>=i;j--) //从后往前一个一个挪L.data[i-1]=x;L.length++;
}
图解如下:
- 删除:删除第i个元素,表长减1
void DeleteSeqList(SeqList L,int i)
{
if(i<1||i>L.length)exit("非法位置")
for(j=i;j<L.length;j++)L.data[j-1]=L.data[j];
L.length--;
}
图示如下:
- 定位:查找线性表中值等于x结点序号的最小值,找不到返回0
void LocateSeqlist(Seqlist L,DataType x)
{
int i=0;
while((i<L.length)&&(L.data[i]!=x))i++;
if(i<L.length) return i+1
else return 0;
}
顺序表实现算法的分析
- 插入算法最坏时间复杂度为O(n),平均时间复杂度为O(n)
- 删除算法最坏时间复杂度为O(n),平均时间复杂度为O(n)
- 定位算法最坏时间复杂度为O(n),平均时间复杂度为O(n)
- 求表长和读表元素算法时间复杂度均为O(1)
线性表的链接存储
单链表的类型定义
- 单链表——线性表的数据元素用指针链接起来的存储结构,指针表示数据元素之间的逻辑关系,各个结点在内存中的存储位置并不一定连续
注:单链表可以比作火车,有一个火车头(头指针变量),该变量的值是指向单链表的第一个结点的指针。判断单链表是否为空指针的条件如下:head——>next==NULL或head——>next!=NULL
线性表的基本运算在单链表上的实现
- 初始化——创建一个头指针并将其指针域设为NULL,即创建一个空单链表
LinkList InitiateLinkList()
{
LinkList head; //头指针
head=malloc(sizeof(Node)); //动态构建一结点,为头结点
headhead->next=NULL;
return head;
}
- 求表长——设计一个工作指针p,初始指向头结点,并设置一个计数器cnt,初值设为0,p每移动一个结点cnt加1,直到p->next==NULL
int LengthLinklist(LinkList head)
{
Node *p=head;
int cnt=0;
while(p->next!=NULL)
{p=p->next;cnt++;
}
return cnt;
}
- 读表元素——从头开始直到找到给定序号下的元素
Node * GetLinklist(LinklList head,int i)
{
Node *p;
p=head->next;;
int c=1;
while ((c<i)&&(p!=NULL))
{p=p->next;c++;}
if(i==c) return p;
else return NULL;
}
- 定位——给出值,找到该元素位置(按值查找)
int LocateLinklist(LinkList head,DataType x)
{
Node *p=head;
p=p->next;
int i=0;
while((p!=NULL)&&(p->data!=x))
{
i++;
p=p->next;
}
if(p!=NULL) return i+1;
else return 0;
}
- 插入——值为x的元素插入到第i个结点之前
步骤如下:
1.q指针指向i-1结点,p指针指向待加入结点x
2.p指针指向q的直接后继:p->next=q->next;
3. q指针指向p:q->next=p;
void InsertLinklist(LinkList head,DataType x,int i)
{
Node *p,*q;
if(i==1) q=head;;
else q=GetLinklist(head,i-1);
if(q==NULL)exit("找不到插入位置")
else{p=malloc(sizeof(Node));p->data=x;p->next=q->next;q->next=p;}
}
- 删除:将第i个结点删除
void DeleteLinklist(LinkList head,int i)
{
Node *p;
if(i==1)q=head;
else q=GetLinklist(head,i-1); //找到待删除结点的直接前驱
if(q!=NULL&& q->next!=NULL)
{
p=q-next;
q->next=p->next;
free(p); //释放已经移出结点p的空间
}
else exit("找不到要删除的结点")
}
其他运算在单链表上的实现
建表
- 通过插入算法加入新结点
LinkList CreatLinklist1(){
Linklist head;
int x,i;
head=InitiateLinklist(); //建立空表
i=1;
scanf("%d",&x)
while(x!=0);
{
InsertLinklist(head,x,i);
i++;
scanf("%d",&x); //读下一元素
}
return head;
}
时间复杂度为O(n2)
- 通过一个指向尾结点的指针,将新结点插入到表尾
LinkList CreateLinklist2()
{
Linklist head;
Node *q,*t;
int x;
head=malloc(sizeof(Node)) //生成头结点
q=head;
scanf("%d",%x);
while(x!=0)
{
t=malloc(sizeof(Node));t->data=x; //生成一个新结点
q->next=t; //新结点t链入
q=t //修改尾指针q,指向新的尾结点
scanf("%d",&x);
}
q->next=NULL;return head; //q指向尾结点,置尾结点结束
}
时间复杂度为O(n)
- 始终将新增加的结点插入到头结点之后
LinkList CreateLinklist3()
{
Linklist head;
Node *p;
int x;
head=malloc(sizeof(Node)); //生成头结点
head->next=NULL;
scanf("%d",&x);
while(x)
{
p=malloc(sizeof(Node));
p->data=x;
p->next=head->next; //前插,插入到头结点之后第一个结点之前
head->next=p;
scanf("%d",&x);
}
return head;
}
时间复杂度为O(n)
删除重复结点
- 一个指针用来确定和谁比较,一个指针移动使得每一项都与之比较(永远指向待删结点的直接前驱),一个指针用于删除
void PurgeLinklist(LinkList head)
{
Node *p,*q,*r
q=head->next; //q指向首结点
while(q!=NULL){p=q; //p指向*qwhile(p->next!=NULL)if(p->next->data==q->data) //若重复{r=p->next; //r指向待删除结点p->next=r->next; //p的直接后继等于r的直接后继,移出待删结点free(r); //释放}else p=p->next; //检查下一个q=q->next; //更新检查结点}
}
其他链表
循环链表
尾结点的指针域指向第一个结点即构成循环链表
双向循环链表
在单链表的每个结点中再设置一个指向其直接前驱结点的指针域prior,即为双向循环链表
- 双向循环链表的对称性可以用下列等式表示:
p=p->next=p->next->prior
- 删除(设置一个指针p指向待删结点,待删结点的前驱指向p的直接后继,待删结点的后继指向p的前驱;均由P表示)
p->next->prior=p->next;
p->next->prior=p->prior;
free(p);
- 插入
t->prior=p;
t->next=p->next;
p->next->prior=t;
p->next=t;
顺序实现与链接实现的比较
- 对于按位置查找,顺序表时间复杂度为O(1),单链表是O(n)
- 对于定位运算,时间复杂度均为O(n)
- 对于插入,删除运算,顺序表链表单链表平均时间复杂度均为O(n)
- 单链表每个结点包括数据域和指针域,指针域需要占用额外空间
- 顺序表需要预分配存储空间,过大浪费,过小上溢;单链表不用预先分配空间
小试牛刀
- 设r指向单链表的最后一个结点,要在最后一个结点之后插入s所指的结点,需要执行的语句序列为
______;
r=s;
r->next=NULL;
- 在单链表中,指针p所致结点为最后一个结点的条件是_____;带头结点的双向循环链表L为空的条件是_____。
- 在双向循环链表中,在指针p所指结点前插入指针s所指的结点,需要执行下列语句:
s->next=p;
s->prior=p->prior;
p->prior=s;
_______=s。
- 从逻辑关系 来看,一个数据元素的直接前驱为0个或1个的数据结构只能是______。
- 单链表中,增加头结点的目的是为了______。
相关文章:
第二章 线性表
线性表 线性表的基本概念线性表的顺序存储线性表顺序存储的类型定义线性表基本运算在顺序表上的实现顺序表实现算法的分析 线性表的链接存储单链表的类型定义线性表的基本运算在单链表上的实现 其他运算在单链表上的实现建表删除重复结点 其他链表循环链表双向循环链表 顺序实现…...
Java 超高频常见字符操作【建议收藏】
文章目录 前言1. 字符串拼接2. 字符串查找3. 字符串截取4. 字符串替換5. 字符串分割6. 字符串比较7. 字符串格式化8. 字符串空格处理 总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一…...
MongoDB数据库网站网页实例-编程语言Python+Django
程序示例精选 PythonDjangoMongoDB数据库网站网页实例 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonDjangoMongoDB数据库网站网页实例》编写代码,代码整洁,…...
开箱报告,Simulink Toolbox库模块使用指南(七)——S-Fuction Builter模块
S-Fuction Builter S-Fuction Builter模块,Mathworks官方Help对该部分内容的说明如下所示。 DFT算法的原理讲解和模块开发在前几篇文章中已经完成了,本文介绍如何使用S-Fuction Builter模块一步到位地自动开发DFT算法模块,包括建立C MEX S-Fu…...
spring-boot 操作 mongodb 数据库
如何使用 spring-boot 操作 mongodb 数据库 配置文件: spring:data:mongodb:host: 127.0.0.1database: fly_articleDbport: 27017# 可以采取 mysql 写法# uri: mongodb://127.0.0.1/fly_articleDb依赖信息: <?xml version"1.0" encoding"UTF-…...
JVM篇---第三篇
系列文章目录 文章目录 系列文章目录一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、Java内存结构三、说说对象分配规则一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文…...
建筑施工行业招投标资源众包分包系统站点开发
一款针对建筑、施工行业开发的程序系统平台,运营方可以招募企业发布招投标信息以及招聘信息。 核心功能:一、项目招投标众包发布和投标 企业可以根据自身资源或者实际需求发布参与招投标信息,程序后台可以管理、审核用户发布的信息。参与招…...
【Linux基础】Linux发展史
👉系列专栏:【Linux基础】 🙈个人主页:sunny-ll 一、前言 本篇主要介绍Linux的发展历史,这里并不需要我们掌握,但是作为一个合格的Linux学习者与操作者,这些东西是需要了解的,而且…...
openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务
文章目录 openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务 openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务 在乐观并发控制(OCC)中&…...
【Docker】搭建 Docker 镜像仓库
文章目录 前言:公有仓库和私有仓库公共镜像仓库私有镜像仓库 一、搭建 Docker 镜像仓库1.1 搭建简化版的镜像仓库1.2 搭建带有图形化界面的镜像仓库1.3 配置 Docker 信任地址 二、向私有镜像仓库推送和拉取镜像2.1 推送本地镜像到私有仓库2.2 拉取私有仓库中的镜像 …...
Python数据攻略-Pandas的数据计算、拼接与可视化
如何将数据转化为有用的信息?在数据分析的世界里,仅仅拥有大量数据是不够的。需要有方法去“翻译”这些数据,让它们告诉我们一些有用的信息。 本篇文章要探讨的内容:如何使用Pandas进行数据计算、拼接和可视化,从而让数据“说话”。 文章目录 Pandas的数据计算基本数学运…...
【计算机网络】HTTPS协议详解
文章目录 一、HTTPS协议 介绍 1、1 HTTP协议不安全的体现 1、2 什么是 HTTPS协议 二、加密的一些概念 2、1 怎么理解加密 2、2 为什么要加密 2、3 常见的加密方式 2、2、1 对称加密 2、2、2 非对称加密 三、HTTPS协议探究加密过程 3、1 只使用对称加密 3、2 只是用非对称加密 3…...
Septentrio接收机二进制的BDS b2b改正数解码
Galileo的HAS和BDS B2b改正数为实时PPP提供了可能,要实现实时PPP解算,必须对对应的数据进行解码。由于没有做过解码的工作,现结合qzsl6tool代码对Septentrio的解码代码进行学习。 1. 二进制枕头的识别和解码 定义一个读取数据的类ÿ…...
nvm 管理 node版本
下载地址 https://nvm.uihtm.com/download.html 基础命令 查看所有可安装的node版本 nvm list available 查看本地已经安装的所有版本: nvm list 安装指定的node版本 nvm install 14.18.1 使用指定node版本 nvm use 14.18.1 卸载指定node版本 nvm uninstall …...
LeetCode 15.三数之和
三数之和 问题描述 LeetCode 15.三数之和 给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k,同时还满足 nums[i] nums[j] nums[k] 0。请你返回所有和为 0 且不重复的三元组。 注意:答…...
Linux实用操作(固定IP、进程控制、监控、文件解压缩)
目录 一、快捷键 1、ctrl c强制停止 2、ctrl d退出或登出 3、历史命令搜索history 4、光标移动快捷键 5、清屏 二、软件安装 1、CentOS的yum命令 2、Ubantu的apt命令 三、systemctl命令 四、软连接 五、日期、时区 1、date命令 2、修改Linux时区为东八区 3、nt…...
Redis高可用之哨兵模式、集群
文章目录 一、Redis哨兵模式1.1 简介1.2 哨兵模式的作用1.3 哨兵结构1.4 故障转移机制(重要)1.5 主节点选举机制 二、部署Redis哨兵模式Step1 修改 Redis 哨兵模式的配置文件(所有节点操作)Step2 实现基于VIP(虚拟IP&a…...
Python数据攻略-DataFrame的创建与基础特性
在数据分析、科学计算或者任何需要处理表格数据的领域,DataFrame都是一个非常重要的工具。就像Excel让处理表格数据变得简单一样,DataFrame也有类似的功能,但更加强大,特别是在处理大量数据时。了解DataFrame不仅能帮你更高效地处理数据,还能让你更容易进行数据清洗、可视…...
【word】从正文开始设置页码
在写报告的时候,会要求有封面和目录,各占一页。正文从第3页开始,页码从正文开始设置 word是新建的 分出三节(封面、目录、正文) 布局--->分割符--->分节符--->下一页 这样就能将word分为3节,分…...
计算机网络 快速了解网络层次、常用协议、常见物理设备。 掌握程序员必备网络基础知识!!!
文章目录 0 引言1 基础知识的定义1.1 计算机网络层次1.2 网络供应商1.3 猫、路由器、交换机1.4 IP协议1.5 TCP、UDP协议1.6 HTTP、HTTPS、FTP协议1.7 Web、Web浏览器、Web服务器 2 总结 0 引言 在学习的过程中总是会对IP、TCP、UDP、HTTP、HTTPS、FTP这些常见的协议不熟悉&…...
CUDA 安装
查看自己电脑的cuda版本:见文章 查看CUDA版本 我的是: 他的意思就是说:俺的显卡支持的cuda版本是12.0的(向下兼容) 然后我的项目tensorflow-gpu版本是1.13.2版本的,对应的cuda为10: ÿ…...
Springboot+vue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
演示视频: Springbootvue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的在线试题题库管理系统,采用M&…...
【简单的留言墙】HTML+CSS+JavaScript
目标:做一个简单的留言墙 1.首先我们用HTML的一些标签,初步构造区域 样式。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>留言墙</title><style>/* ...... */ …...
linux 火狐浏览器报错Firefox is already running, but is not responding
Ubuntu环境下打开Firefox报错: Firefox is already running, but is not responding.-CSDN博客 killall firefox...
Python:操作SQLite数据库简单示例
本文用最简单的示例演示python标准库提供的SQLite数据库进行新增、查询数据的过程。 代码文件app.py # -*- coding: UTF-8 -*- from flask import Flask import sqlite3app Flask(__name__)app.route(/) def hello_world():return Hello World!#创建数据库 app.route(/creat…...
第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项
视频教程汇总帖:【学以致用,授人以渔】2023视频教程汇总,DSP第12期,ThreadX第8期,BSP驱动第26期,USB实战第5期,GUI实战第3期(2023-10-01) - STM32F429 - 硬汉嵌入式论坛 …...
【NeurIPS 2023】Backdoor对抗攻防论文汇总
NeurIPS 对抗攻防论文 NeurIPS2022|对抗攻防论文整理 - 知乎 NeurIPS 2023 Papers BIRD: Generalizable Backdoor Detection and Removal for Deep Reinforcement Learning https://neurips.cc/virtual/2023/poster/70618 摘要: 后门攻击对深度强化学习&…...
(Note)在Excel中选中某一行至最后一行的快捷键操作
在 Excel 中,选中一行至最后一行的快捷键是 “Shift 空格 Ctrl 方向键下”。按住 Shift 键,然后按下空格键以选中整行,接着按下 Ctrl 键保持选中状态,并按下方向键下键盘按钮以扩展选中范围至最后一行。 简要步骤如下…...
古记事法:Windows 下 16 位汇编环境搭建指南(DOSBox-X 篇)
文章目录 参考环境DOSBox-XWOWWindows On Windows 产生的原因Windows On Windows 的工作原理WOW16 的结束与 WOW64 的未来 在现代操作系统中运行 16 位应用程序DOSBox-X 16 位汇编环境的搭建应用准备挂载自动挂载dosbox-x.conf配置工具 参考 项目描述搜索引擎Bing、GoogleAI 大…...
云计算基础:理解AWS、Azure和Google Cloud
云计算基础:理解AWS、Azure和Google Cloud 介绍 云计算已经成为现代科技领域的重要驱动力之一。它为企业提供了灵活性、可伸缩性和成本效益,以满足日益增长的计算和存储需求。本文将深入探讨三个主要的云计算提供商:Amazon Web Services (A…...
建设威客网站/seo入门教学
有了它,人人都可开发高可用高伸缩应用。今天小编就为大家介绍一款开发者的“利器”——Service Fabric 。 在介绍它之前,先来了解一下它的背景。 Service Fabric 是一款应用程序平台,可用于构建基于微服务的应用程序。其核心部分是一个分布式…...
烟台网站建设推广/seo关键词首页排名
高考志愿填报后最重要的一件事情就是高考录取通知书的查收了,因为录取通知书才是证明你被录取的有效方式。那么很多考生及家长最关心怎么查询北京舞蹈学院录取通知书?北京舞蹈学院录取通知书寄到哪里了?本文大风车网小编为你整理了关于北京舞…...
深圳企业网站建设费用/提升网页优化排名
先说重点:Azure Database for MySQL 单一服务器即将停用。Azure Database for MySQL 单一服务器计划在 2024 年 9 月 16 日之前停用。 文章目录从单一服务器迁移到灵活服务器(重要!非常重要!非常重要!)&…...
专业重庆房产网站建设/快速建站网站
使用angular框架的时候,之前用的时间控件是引入My97DatePicker组件实现的,但是因为 1.My97DatePicker样式不太好看以及偶尔会出现底部被遮盖的情况、点击不可编辑input框使用backspace按钮会出现格式不符合问题 2.angular-bootstrap 自带兼容第三方ui-da…...
wordpress顶部菜单/昆明自动seo
我的收藏 本节主要讲解我的收藏界面的实现。效果如图15-9所示。 内容的布局分析可以参考12.8节“销售排行”。 实现功能的.wxml文件代码示例如下: <!--收藏-1行2列:左侧图片,右侧3行文本--> <view classtext><view classli…...
个人网站备案要什么/腾讯云服务器
1.序列化序列化是指把一个Java对象变成二进制内容byte[]序列化后可以把byte[]保存到文件中序列化后可以把byte[]通过网络传输一个Java对象要能序列化,必须实现Serializable接口:* Serializable接口没有定义任何方法* 空接口被称为标记接口(Marker Interf…...