当前位置: 首页 > news >正文

数据结构--线性表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

目录 一、线性表例题&#xff1a; 二、分配动态内存&#xff1a; 1.动态创建一个空顺序表的算法&#xff1a; 2.动态顺序表的插入算法&#xff1a; 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1&#xff1a;创建链表并插入26个字母 例题2&#xff1a;在链表中取…...

利用openTCS实现车辆调度系统(一)系统介绍

系统介绍 openTCS简介 官方的回答&#xff1a; openTCS&#xff08;开放式运输控制系统的缩写&#xff09;是一种免费的控制系统软件&#xff0c;用于协调自动导引车&#xff08;AGV&#xff09;和移动机器人车队&#xff0c;例如在生产工厂中。 通常应该可以控制任何具有通信…...

销存管理系统ssm进销存仓库销售java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 销存管理系统ssm 系统有1权限&#xff1a;管理员 二…...

【Axure教程】移动端二级滑动选择器

今天教大家制作移动端二级滑动选择器的原型模板&#xff0c;该原型已全国一二级省市选择器为案例&#xff0c;因为该原型用中继器做的&#xff0c;所以制作完成之后使用也很方便&#xff0c;只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…...

PHP操作solr

1&#xff0c;php下载solr(索尔)扩展&#xff0c;phpinfo需要支持solr扩展. 2&#xff0c;安装 Solr。Solr 要求您的系统上有 Java。java –version&#xff0c;Java 的版本大于 1.6 3&#xff0c;下载solr,并安装 D:\solr。 开启solr命令&#xff1a;solr start 关闭solr命令:…...

leetcode 46. Permutations(排列)

返回数组nums中数字的所有可能的排列组合。 思路&#xff1a; 排列组合这种一般会想到DFS。 这个排列中每个数字只能用一次&#xff0c; 可用如下DFS流程 stack.push(num); dfs(nums, num); stack.pop();退出条件&#xff1a; 当stack的size和nums数组一样时&#xff0c;说…...

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快的原因

简介 在数据存储和数据分析领域&#xff0c;MySQL和Doris是比较流行的数据库管理系统的代表。 在如今的大数据时代&#xff0c;数据量和数据分析的速度是很重要的。 在数据分析和数据处理中&#xff0c;Doris比MySQL快&#xff0c;这个问题一直是许多人关心的问题。 Doris的数…...

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…...

二十三种设计模式第二十一篇--解释器模式

解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它用于定义一种语言的语法结构和解释器&#xff0c;使得可以解释并执行特定的语法规则。该模式可以将复杂的语言表达式分解为更小的语法单元&#xff0c;并定义其解释过程。 解释器模式的…...

PHP8的数据类型转换-PHP8知识详解

什么是数据类型转换&#xff1f; 答&#xff1a;数据从一个类型转换成另外一个类型&#xff0c;就是数据类型转换。 在PHP8中&#xff0c;变量的类型就是由赋值决定的&#xff0c;也就是说&#xff0c;如果 string 赋值给 $var&#xff0c;然后 $var 的类型就是 string。之后…...

2023 电赛 E 题 K210 方案

第一章&#xff1a;K210 介绍 K210芯片是一款基于RISC-V架构的嵌入式人工智能芯片&#xff0c;具备低功耗、高性能的特点。它拥有强大的图像处理和机器学习能力&#xff0c;适用于边缘计算设备和物联网应用。为了方便开发者&#xff0c;K210芯片提供了丰富的外设接口&#xff…...

Python的正则表达式re模块的compile()方法有什么作用?

re模块是Python标准库中的正则表达式模块&#xff0c;它提供了对正则表达式的支持。re.compile()是re模块的一个方法&#xff0c;用于将正则表达式编译成可复用的正则对象。 正则表达式是用来匹配和处理文本模式的强大工具。当你需要在字符串中查找、替换或者提取符合特定模式…...

SQL 语句中 left join 后用 on 还是 where,区别大了!

目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数&#xff0c;只会根据and后的条件是否显示 B表的记录&#xff0c;A表的记录一定会显…...

uni-app 微信小程序自定义导航栏

一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏&#xff08;就是手机电量显示栏&#xff09;和小程序的导航栏组成&#xff0c;android手机一般为48px&#xff0c;ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…...

电缆故障检测仪技术参数

一、电缆故障测试仪的技术参数 1.采样方法&#xff1a;低压脉冲法、冲击闪络法、速度测量法 2.电缆长度&#xff1a;50m、300m、1km、2km、5km、10km、30km、60km 3.波速设置&#xff1a;交联乙烯、聚氯乙烯、油浸纸、不滴油和未知类型自设定 4.冲击高压&#xff1a;35kV及以下…...

固定资产管理软件

固定资产全生命周期管理软件采用先进的RFID技术&#xff0c;从采购、入库、借用、总结、清理到损坏等方面准确统计资产&#xff0c;突破过去手工统计的复杂性&#xff0c;节省资产资源&#xff0c;减少调查时间&#xff0c;确保资产管理工作的准确性和快速性。 固定资产管理软…...

云安全攻防(四)之 云原生技术

云原生技术 容器技术 容器与虚拟化 虚拟化&#xff08;Virtualization&#xff09;和容器&#xff08;Container&#xff09;都是系统虚拟化的实现技术&#xff0c;可实现系统资源的”一虚多“共享。容器技术可以理解成一种”轻量的虚拟化“方式&#xff0c;此处的”轻量“主…...

线上通过Nginx部署前端工程,并且配置SSL

介绍、为了更好的帮助大家学习&#xff0c;减少歧义,IP地址我就不隐藏了&#xff0c;公司也是我自己的公司。你们就别来攻击了。 下面给出步骤: 一、前期准备工作 通过在目标服务器上安装宝塔面板、安装redis、mysql、nginx、jdk环境等 1、 2、前端工程通过npm run build 打…...

直播预告 | 开源运维工具使用现状以及可持续产品的思考

运维平台自上世纪90年代开始进入中国市场&#xff0c;曾形成以传统四大外企&#xff1a;IBM、BMC、CA、HP为代表的头部厂商&#xff0c;还有一众从网管起家的国内厂商。2010年前后&#xff0c;出现了以Zabbix、Nagios、Cacti为代表的开源工具&#xff0c;后来又陆续出现了Prome…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...