数据结构--线性表2-2
目录
一、线性表例题:
二、分配动态内存:
1.动态创建一个空顺序表的算法:
2.动态顺序表的插入算法:
3.动态顺序表的删除
三、线性表的链式表示和实现
例题1:创建链表并插入26个字母
例题2:在链表中取第i个数据元素
例题3:在链表中删除一个结点
四、静态链表:
一、线性表例题:
例题1:求两个线性表的“并”,即LA U LB= ?
算法思路:
注意集合并的含义:
LA和LB都是无序表,则从LB种取元素逐一与LA中所有元素比较,相同则不插入LA中;
Void Union(List &LA,List LB)
{//将所有在线性表Lb中但不在La中的数据元素插入到La中
La_len=Listlength(La);
Lb_len=Listlength(Lb);
for(i=1;i<Le_len;i++)
{
GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e、
if(!LocateElem(La,e,equal))
{
ListInsert(La,++La_len,e);
}
}
}
算法复杂度分析:LocateElem(La,e,equal) 需La_len次比较
则整个算法需O(La_len×Lb_len)
例题2:设正整数a的前驱为PRIOR(a),后继NEXT(a),用递归算法计算a+b。
首先要对加法算法进行描述。不能用简单的加法语句,因为没有加法,要考虑如何用给出的两个特定函数来实现a+b?
思路: 考虑加法的定义,若用数轴来描述a+b,当a不断往"0"移动,b不断往相反方向移动的过程。当a移动到0时,b指向的位置即为a+b。

(a可视为一减计数器,前移过程中不断递减,而b的后移则是不断加1的过程)
平常我们可以用循环来实现,但根据本题题意不能用循环,而要用递归。
设计要点有二:1.递归算法的形式化描述;2.不能无限制递归,一定要有终止条件。
结果:
int add(int a,int b);
if(a==0) return(b);
else return (add(prior(a),next(b)));
若a很大,b很小怎么办?
解决方法:就从小的开始进行减计数。
二、分配动态内存:
(我的C语言专栏中介绍过基础,这里跟数据结构一起编写一些)
#define LIST_INIT_SIZE 100//存储空间的初始分配量
#define LISTINCREMENT 10//存储空间的分配增量
Typedef struct{
ElemType *elem; //表基址(用指针*elem)
int lenght; //表长度(表中有多少个元素)
int listsize; //当前分配的表尺寸(字节单位)
}SqList L;
1.动态创建一个空顺序表的算法:
Status InitList_Sq(SqList &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);//分配失败,结束程序
L.length=0; //暂无元素放入,空表
L.listsize = LIST_INIT_SIZE; //表尺寸=初始分配量
Return OK;
}//InitList_Sq
2.动态顺序表的插入算法:
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{//在顺序线性表中第i个位置之前插入新的元素e
if(i<1||i>L.length+1) return ERROR;//检验i值得合法性
if(L.length>=L.listsize)//若表长超过表尺寸则要增加尺寸
{
newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));//realloc(*p,newsize)函数的意思是:新开一片大小为newsize的连续空间,并把以*p为首地址的原空间数据都拷贝进去。
if(newbase = NULL) exit(OVERFLOW); //分配失败则退出报错
L.elem = newbase; //重置新基址
L.listsize = L.listsize +LISTINCREMENT;}//增加表尺寸
q=&L.elem[i-1]; //q为插入位置。这里没有头结点的情况
for(p=L.elem[L.length-1];p>=q;--p) *(p+1)=*p;
//插入位置及之后的元素统统后移,p为元素位置
*q = e; //插入e
++L.length; //增加1个数据元素,则表长+1
return OK;
}//ListInsert_Sq
}
3.动态顺序表的删除
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{//在顺序表L中删除第i个元素,用e返回其值 if(i<1||L.length) return ERROR;//i值不合法,返回 p=&L.elem[i-1]; //p是被删除元素的位置 e=*p; //被删除元素的值赋给e q=L.elem+L.length-1; //q是表尾的位置 for(++p;p<=q;p++) *(p-1)=*p; //待删除元素后面的统统前移--L.length; //表长-1 return ok;
}//ListDelete_Sq
三、线性表的链式表示和实现
1、链表的表示
(1)链式存储结构特点:
其结点在存储器总的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。
设计效率:牺牲空间效率换取时间效率
头指针:是指向链表中第一个结点(或为头结点、或为首结点)的指针;
头结点:是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息,它不计入表长度;
首元结点:是指链表中存储线性表第一个数据元素a1的结点。
Typedef struct Lnode{
ElemType data; //数据域
struct Lnode *next; //指针域
}Lnode,*LinkList; //*LinkList为Lnode类型的指针
例题1:创建链表并插入26个字母
#include <stdio.h>
#include <stdlib.h>
typedef struct node{char data;struct node *next;
}node;node *p,*q,*head;
int n;
int m=sizeof(node);void build() //字母链表的生成。要一个个慢慢链入
{int i;head=(node*)malloc(m);// p=head;for(i=1;i<26;i++)//因尾结点要特殊处理,故i≠26 {p->data=i+'a'-1;//第一个结点值为字符a p->next=(node*)malloc(m);//为后继结点“挖坑” p=p->next; //让指针变量p指向后一个结点 }p->data=i+'a'-1;//最后一个元素要单独处理 p->next=NULL; //单链表尾结点的指针域要置空 } void display()//字母链表的输出
{p=head;while(p)//当指针不空时循环(仅限于无头结点的情况) {printf("%c",p->data);p=p->next;}} int main(void){build();display();}
例题2:在链表中取第i个数据元素
Status GetElem_L(Linklist L,int i,ElemType &e)
{//L为带头结点的单链表的头指针//当第i个元素存在时,其值赋给e并返回OK,否则返回error p=L->next;j=1;
//初始化,p指向第一个结点,j为计数器 while(p&&j<i){
//顺指针向后查找,直到p指向第i个元素或p为空 p=p->next;++j;}
//第i个元素不存在 if(!p||j>i) return ERROR;e=p->data;//取第i个元素 return ok;
}GetElem_L
例题3:在链表中删除一个结点
Status ListDelete_L(Linklist &L,int i,ElemType e)
{//在带头结点的单链表L中,删除第i个元素,并由e返回其值 p=L;j=0;while(p->next&&j<i-1){//寻找第i个结点,并令p指向其前驱 p=p->next;++j;} if(!(p->next)p||j>i-1) return ERROR;//删除不合理位置 q=p->next;p->next=q->next;//删除并释放结点 e=q->data;free(q);return ok;}
四、静态链表:
定义一个结构型数组(每个元素都含有数据域和指示域),就可以完全描述链表,指示域就相当于动态链表的指针,称为游标。
静态链表的类型定义如下:
#define MAXSIZE 1000 //预分配最大的元素个数(连续空间)
typedef struct {
ElemType data; //数据域
int cur; //指示域
}component,SLinkList[MAXSIZE]; //这是一维结构型数组
例题4:利用静态链表存储s=(zhao,qian,sun,li,zhou,wu)。
其原理跟动态差不多,写法类似,知识不需要在使用指针。
相关文章:
数据结构--线性表2-2
目录 一、线性表例题: 二、分配动态内存: 1.动态创建一个空顺序表的算法: 2.动态顺序表的插入算法: 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1:创建链表并插入26个字母 例题2:在链表中取…...
利用openTCS实现车辆调度系统(一)系统介绍
系统介绍 openTCS简介 官方的回答: openTCS(开放式运输控制系统的缩写)是一种免费的控制系统软件,用于协调自动导引车(AGV)和移动机器人车队,例如在生产工厂中。 通常应该可以控制任何具有通信…...
销存管理系统ssm进销存仓库销售java jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 销存管理系统ssm 系统有1权限:管理员 二…...
【Axure教程】移动端二级滑动选择器
今天教大家制作移动端二级滑动选择器的原型模板,该原型已全国一二级省市选择器为案例,因为该原型用中继器做的,所以制作完成之后使用也很方便,只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…...
PHP操作solr
1,php下载solr(索尔)扩展,phpinfo需要支持solr扩展. 2,安装 Solr。Solr 要求您的系统上有 Java。java –version,Java 的版本大于 1.6 3,下载solr,并安装 D:\solr。 开启solr命令:solr start 关闭solr命令:…...
leetcode 46. Permutations(排列)
返回数组nums中数字的所有可能的排列组合。 思路: 排列组合这种一般会想到DFS。 这个排列中每个数字只能用一次, 可用如下DFS流程 stack.push(num); dfs(nums, num); stack.pop();退出条件: 当stack的size和nums数组一样时,说…...
5、二叉树
二叉树遍历 递归序 public static void f(Node head) {if (head == null) {return;}f(head.left);f(head.right); }前中后遍历_递归 public static void preOrderRecur(Node head) {if (head == null) {return;}System.out.print(head.value + " ");preOrderRecur…...
Doris比MySQL快的原因
简介 在数据存储和数据分析领域,MySQL和Doris是比较流行的数据库管理系统的代表。 在如今的大数据时代,数据量和数据分析的速度是很重要的。 在数据分析和数据处理中,Doris比MySQL快,这个问题一直是许多人关心的问题。 Doris的数…...
Prometheus + Grafana安装
Prometheus是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…...
二十三种设计模式第二十一篇--解释器模式
解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义一种语言的语法结构和解释器,使得可以解释并执行特定的语法规则。该模式可以将复杂的语言表达式分解为更小的语法单元,并定义其解释过程。 解释器模式的…...
PHP8的数据类型转换-PHP8知识详解
什么是数据类型转换? 答:数据从一个类型转换成另外一个类型,就是数据类型转换。 在PHP8中,变量的类型就是由赋值决定的,也就是说,如果 string 赋值给 $var,然后 $var 的类型就是 string。之后…...
2023 电赛 E 题 K210 方案
第一章:K210 介绍 K210芯片是一款基于RISC-V架构的嵌入式人工智能芯片,具备低功耗、高性能的特点。它拥有强大的图像处理和机器学习能力,适用于边缘计算设备和物联网应用。为了方便开发者,K210芯片提供了丰富的外设接口ÿ…...
Python的正则表达式re模块的compile()方法有什么作用?
re模块是Python标准库中的正则表达式模块,它提供了对正则表达式的支持。re.compile()是re模块的一个方法,用于将正则表达式编译成可复用的正则对象。 正则表达式是用来匹配和处理文本模式的强大工具。当你需要在字符串中查找、替换或者提取符合特定模式…...
SQL 语句中 left join 后用 on 还是 where,区别大了!
目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显…...
uni-app 微信小程序自定义导航栏
一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏(就是手机电量显示栏)和小程序的导航栏组成,android手机一般为48px,ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…...
电缆故障检测仪技术参数
一、电缆故障测试仪的技术参数 1.采样方法:低压脉冲法、冲击闪络法、速度测量法 2.电缆长度:50m、300m、1km、2km、5km、10km、30km、60km 3.波速设置:交联乙烯、聚氯乙烯、油浸纸、不滴油和未知类型自设定 4.冲击高压:35kV及以下…...
固定资产管理软件
固定资产全生命周期管理软件采用先进的RFID技术,从采购、入库、借用、总结、清理到损坏等方面准确统计资产,突破过去手工统计的复杂性,节省资产资源,减少调查时间,确保资产管理工作的准确性和快速性。 固定资产管理软…...
云安全攻防(四)之 云原生技术
云原生技术 容器技术 容器与虚拟化 虚拟化(Virtualization)和容器(Container)都是系统虚拟化的实现技术,可实现系统资源的”一虚多“共享。容器技术可以理解成一种”轻量的虚拟化“方式,此处的”轻量“主…...
线上通过Nginx部署前端工程,并且配置SSL
介绍、为了更好的帮助大家学习,减少歧义,IP地址我就不隐藏了,公司也是我自己的公司。你们就别来攻击了。 下面给出步骤: 一、前期准备工作 通过在目标服务器上安装宝塔面板、安装redis、mysql、nginx、jdk环境等 1、 2、前端工程通过npm run build 打…...
直播预告 | 开源运维工具使用现状以及可持续产品的思考
运维平台自上世纪90年代开始进入中国市场,曾形成以传统四大外企:IBM、BMC、CA、HP为代表的头部厂商,还有一众从网管起家的国内厂商。2010年前后,出现了以Zabbix、Nagios、Cacti为代表的开源工具,后来又陆续出现了Prome…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
