数据结构--线性表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…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...