数据结构3——线性表2:线性表的顺序结构

news2024/10/1 9:42:41

顺序结构的基本理解

定义:
把逻辑上相邻的数据元素存储在物理上相邻(占用一片连续的存储单元,中间不能空出来)的存储单元的存储结构

请添加图片描述

存储位置计算:
L O C ( a ( i + 1 ) ) = L O C ( a ( i ) ) + l LOC(a(i+1))=LOC(a(i))+l LOC(a(i+1))=LOC(a(i))+l

L O C ( a ( i ) ) = L O C ( a ( j ) ) + ( i − j ) l LOC(a(i))=LOC(a(j))+(i-j)l LOC(a(i))=LOC(a(j))+(ij)l

其中 l l l为每个元素所需要占用的存储单元

顺序表的优点:
以物理位置相邻表示逻辑关系,任意元素均可随机存取

顺序表的顺序存储表示:

地址连续、依次存放、随机存取、类型相同】==>数组(元素)

所以我们可以用一维数组来表示顺序表。但是顺序表长是可以变化的;而数组长度是不可变的,所以我们会额外使用一个变量来表示当前位置在顺序表中的长度

# define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
typedef struct{                                          
	ElemType elem[LIST_INIT_SIZE];                          
	int lenth;  //当前长度                                 
}SqList                                                  

请添加图片描述

注意:逻辑位序和物理位序相差1(因为数组第一项是a[0])

例子:多项式的顺序存储结构类型定义
P ( x ) = A x a + B x b + C x c + ⋅ ⋅ ⋅ + Z ( i ) x z P(x)=Ax^a+Bx^b+Cx^c+···+Z(i)x^z P(x)=Axa+Bxb+Cxc+⋅⋅⋅+Z(i)xz
其线性表为
P = ( ( A , a ) , ( B , b ) , ( C , c ) , . . . , ( Z , z ) ) P = ( ( A , a ) , ( B , b ) , ( C , c ) , . . . , ( Z , z ) ) P=((A,a),(B,b),(C,c),...,(Z,z))

# define MAXSIZE 1000                          
typedef struct{  //多项式非零项的意义         
	float p;  //系数                              
	int e;  //指数                                
}Polynomial;                                 
typedef struct{                               
	Polynomial *elem;  //存储空间的基地址         
	int length;  //多项式中当前项的系数           
}SqList;  //多项式的顺序存储结构类型为SqList 

补充

补充1:数组静态与动态的区别
数组静态分配数组动态分配
typedef struct{typedef struct{
ElemType data[maxsize];**ElemType *data; **
int length;int length;
}SqList;//顺序表类型}SqList;//顺序表类型

在数组的静态分配中,data[maxsize]本质上存储的是data[0]的地址;而*data这个指针存储的也是地址,本质上相同。而数组动态分配是由申请储存空间完成的:

SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType)×Maxsize) 
补充2:常用函数

需要加载头文件:<stdlib.h>

malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址

sizeof(x)运算:计算变量x的长度

free§函数:释放指针p所指变量的存储空间,即彻底删除一个变量

(ElemType*)malloc···:强制转换类型方法

补充3:a与b的交换问题

引用类型做参数(C++):

int i=5;

int &j=i;

j是一个引用类型,i的值改变的时候,j的值也会随之发生变化

比如交换a,b的函数,可以有如下两种方式:

| 利用指针类型                   | 利用引用类型                 |
| ----------------------------- | --------------------------- |
| #include <iostream.h>         | #include <iostream.h>       |
| void swap(float *m,float *n){ | void swap(float&m,float&n){ |
| float temp;                   | float temp;                 |
| temp = *m;                    | temp=m;                     |
| *m = *n;                      | m=n;                        |
| *n = temp;                    | n=temp;                     |
| }                             | }                           |
| void main(){                  | void main(){                |
| float a,b, *p1, *p2;          | float a,b;                  |
| cin>>a>>b;                    | cin>>a>>b;                  |
| p1=&a; p2=&b;                 | swap(a,b);                  |
| swap(p1,p2);                  | count<<a<<endl<<b<<endl;    |
| count<<a<<endl<<b<<endl;      | }                           |
| }                             |                             |
补充4:宏定义

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

补充5:内存相关
软件CC++
获取内存mallocnew
释放内存freedelete

基本操作的实现

线性表初始化:InitList(&L)

操作结果:构造一个空的线性表L

C++:
请添加图片描述

C:

请添加图片描述


线性表销毁:DestoryList(&L)

初始条件:线性表L已经存在

操作结果:销毁线性表L

C++:

请添加图片描述

C:

请添加图片描述

C(1):

请添加图片描述


线性表清空:ClearList(&L)

初始条件:线性表L已经存在

操作结果:将线性表L重置为空表

C++:

请添加图片描述

C:

请添加图片描述


线性表清空判断:ListEmpty(L)

初始条件:线性表L已经存在

操作结果:若线性表L为空表,则返回TRUE;否则返回FALSE

C++:

请添加图片描述

C:

请添加图片描述


线性表长度:ListLength(L)

初始条件:线性表L已经存在

操作结果:返回线性表L中的数据元素个数

C++:
请添加图片描述

C:

请添加图片描述


线性表查找:GetElem(L,i,&e)

初始条件:线性表L已经存在,1≤i≤ListLength(L)

操作结果:用e返回线性表L中第i个数据元素的值

C++:
请添加图片描述

C:

请添加图片描述


线性表定位:LocateElem(L,e,compare())

**初始条件:**线性表L已经存在,compare()是数据元素的判定函数

**操作结果:**返回L中第1个与e满足compare()的数据元素的位序。这样的元素不存在则返回值为0

C++:

请添加图片描述

C:

请添加图片描述

算法分析:

频度(平均查找长度为)期望值为
( 1 + 2 + 3 + 4 + 5 + 6 + ⋅ ⋅ ⋅ + n − 1 + n ) / n = ( n + 1 ) / 2 (1+2+3+4+5+6+···+n-1+n)/n=(n+1)/2 (1+2+3+4+5+6+⋅⋅⋅+n1+n)/n=(n+1)/2
拓展一下:

请添加图片描述

上图的情况就是当查找概率都相等时的结果。


线性表元素插入:ListInsert(&L,i,e)

初始条件:线性表L已经存在,1≤i≤ListLength(L)+1

操作结果:在L的第i个位置插入新的数据元素e,L的长度加一

算法思想:

1)判断插入位置i是否合法。

2)判断顺序表的存储空间是否已满,若已经满了返回ERROR

C:
请添加图片描述

算法分析:
插入的位置有如下三种情况:

① 插在位置最后,则根本不需要移动,速度较快

② 插在位置中间,则需要移动一定数量的元素,速度适中

③ 插在位置最前,则需要将表中所有元素后移,速度很慢

那么平均的情况如何?

我们知道总共有n+1个插入位置,第i个插入位置需要移动n-i+1次,则
( 1 + 2 + 3 + 4 + 5 + 6 + ⋅ ⋅ ⋅ + n − 1 + n ) / ( n + 1 ) = n / 2 (1+2+3+4+5+6+···+n-1+n)/(n+1)=n/2 (1+2+3+4+5+6+⋅⋅⋅+n1+n)/(n+1)=n/2


线性表元素删除:ListDelete(&L,i,&e)

初始条件:线性表L已经存在,1≤i≤ListLength(L)

操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减一

算法思想:

① 判断删除位置i是否合法(合法值1≤i≤n)

② 将欲删除的元素保留在e中

③ 将第i+1至第n位的元素依次向前移动一个位置

④ 表长减1,删除成功返回OK

C++:

请添加图片描述

C:
请添加图片描述

算法分析:此处的分析与线性表元素的插入十分类似,
( 1 + 2 + 3 + 4 + 5 + 6 + ⋅ ⋅ ⋅ + n − 1 ) / n = ( n − 1 ) / 2 (1+2+3+4+5+6+···+n-1)/n=(n-1)/2 (1+2+3+4+5+6+⋅⋅⋅+n1)/n=(n1)/2


顺序表总结:
优点:

· 存储密度大(结点本身所占储存量/结点结构所占存储量)

· 可以随机存取表中任意元素

缺点:

· 插入删除某元素时需要移动大量元素

· 浪费存储空间

· 属于静态存储形式,数据元素不能自由扩充

附录:顺序表完整C源码

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pyqt】win10下使用pycharm安装并配置pyqt环境,并用其进行界面绘制

目录1.PyQt简介2.PyQt安装2.PyQt中界面绘制工具集在pycharm中的配置2.主程序引入生成的界面类1.PyQt简介 PyQt是一个基于Python语言的开源图形用户界面&#xff08;GUI&#xff09;框架&#xff0c;它是Qt跨平台应用程序框架的Python绑定&#xff0c;可以用于创建各种不同类型…

js 拷贝

一、浅拷贝 对数据拷贝的时候只拷贝一层&#xff0c;深层次的只拷贝了地址 1. &#xff08;1&#xff09;对于数组类型&#xff0c;可以使用slice(start, end)方法&#xff0c;返回一个新的数组。 var arr1 arr.slice(0); &#xff08;备注&#xff1a;slice 方法一直复制到…

(Fabric 超级账本学习【2】)Fabric2.4环境下部署自己编写的链码

&#xff08;Fabric 超级账本学习【2】&#xff09;Fabric2.4环境下部署自己编写的链码 1、前提是搭建好了Fabric 2.4&#xff08;Fabric2.x&#xff09;版本的区块链网络&#xff0c;并在以此环境下部署自己编写的链码&#xff0c;如下图先进入 test-network 文件夹目录下 2、…

23年PMP考试,应试技巧二十五条(含资料)

1.一定要认真阅读答案的全部四个选项。 千万不要看到某个选项是正确的&#xff0c;就不看其他选项&#xff0c;因为可能还有更正确的选项。PMP考的是选项的相对正确程度&#xff0c;而不是绝对正确程度&#xff0c;这与英语水平考试截然不同。可能四个选项都是正确或错误的&am…

Linux进程间通信详解(最全)

进程间的五种通信方式介绍 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。IPC的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享内存、Socket&#xff08;套接字&a…

项目实战典型案例20——内存长期占用导致系统慢

内存长期占用导致系统慢一&#xff1a;背景介绍出现的问题二&#xff1a;思路&方案下面是对于这三个原因的解决方案1.服务启动时分配的堆内存过小2. 具有大量大对象被创建&#xff0c;并且没有及时被GC回收或者由于具有引用GC无法回收3.当GC之后&#xff0c;虽然会清理堆内…

再获认可!腾讯安全NDR获Forrester权威推荐

近日&#xff0c;国际权威研究机构Forrester发布最新研究报告《The Network Analysis And Visibility Landscape, Q1 2023》&#xff08;以下简称“NAV报告”&#xff09;&#xff0c;从网络分析和可视化&#xff08;NAV&#xff09;厂商规模、产品功能、市场占有率及重点案例等…

LeetCode刷题——回溯法

文章目录[中等]全排列[中等]全排列 II[中等]组合总和[中等]组合总和 II[中等]复原 IP 地址[中等]括号生成[中等]子集[中等]单词搜索[中等]组合[中等]全排列 原题链接题解 class Solution { public:vector<vector<int>> ans;vector<int> num;int flag[10];v…

三天吃透消息队列面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

OSPF路由协议总结

OSPF路由协议总结一 OSPF协议的三个工作步骤二 5中OSPF协议报文三 4种网络类型&#xff0c;邻居和邻接3.1 P2P3.2 P2MP3.3 Broadcase3.4 NBMA&#xff08;非广播多路访问&#xff09;四 OSPF协议的度量方式五 LS&#xff08;链路状态&#xff09; LSA&#xff08;链路状态通告&…

JMU软件20 大数据技术复习(只写了对比18提纲的变动部分)

原博主 博客主页&#xff1a;https://xiaojujiang.blog.csdn.net/ 原博客链接&#xff1a;https://blog.csdn.net/qq_43058685/article/details/117883940 本复习提纲只适用于JMU软件工程大数据课程&#xff08;ckm授课&#xff09; 具体内容参考老师提纲的考纲&#xff0c;18和…

使用Tensorflow完成一个简单的手写数字识别

Tensorflow中文手册 介绍TensorFlow_w3cschool 模型结构图&#xff1a; 首先明确模型的输入及输出&#xff08;先不考虑batch&#xff09; 输入&#xff1a;一张手写数字图&#xff08;28x28x1像素矩阵&#xff09; 1是通道数 输出&#xff1a;预测的数字&#xff08;1x10的one…

100种思维模型之信息传递思维模型-028

人与人之间存有 认知偏差和理解偏差 &#xff0c;信息在传递过程中会 衰减、失真以及再加工 &#xff01; 信息传递思维模型 &#xff0c;一个有助于 提高信息传递质量 的思维模型。下面从三个方面进行介绍&#xff0c; 何谓信息传递思维模型、信息传递思模型生活中的运…

JVM系统优化实践(9):G1垃圾回收器

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;在JDK8及其之前&#xff0c;一直用的都是ParNewCMS的组合&#xff1a;ParNew负责年轻代的垃圾回收&#xff0c;而由CMS负责老年代的垃圾回收&#xff0c;但会产生…

脑机接口科普0016——独立BCI与非独立BCI

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 所谓的“独立BCI”与“非独立BCI”仅仅是BCI系统中的一个术语。本章主要是介绍一下这两个术语。 这两个术语是由Wolpaw在2002年提出来的。 独立BCI是指不依赖于中枢神经系统的的输出。 非独立BCI是指那种依赖…

工作5年了,你竟然还不会应用优雅停机?

事情是这样的&#xff0c;小明是一个工作五年的老程序员&#xff0c;半秃着的头已经彰显了他深不可测的技术实力。 这一天&#xff0c;小明收到了领导给过来的一个需求。 领导对小明说&#xff1a;“小明啊&#xff0c;你工作五年了&#xff0c;这个需求我交给你一个人负责很是…

开源写作平台WriteFreely(基础篇)

什么是 WriteFreely ? WriteFreely 是一个专为作家打造的干净、极简主义的出版平台。可以用来创建一个博客&#xff0c;在您的组织内分享知识&#xff0c;或者围绕共同的写作行为建立一个社区。 这里值得一提的是&#xff0c; WriteFreely 支持 ActivityPub 协议&#xff0c;这…

逐句回答,流式返回,ChatGPT采用的Server-sent events后端实时推送协议Python3.10实现,基于Tornado6.1

善于观察的朋友一定会敏锐地发现ChatGPT网页端是逐句给出问题答案的&#xff0c;同样&#xff0c;ChatGPT后台Api接口请求中&#xff0c;如果将Stream参数设置为True后&#xff0c;Api接口也可以实现和ChatGPT网页端一样的流式返回&#xff0c;进而更快地给到前端用户反馈&…

剑指offer在排序数组中的二分法应用总结

排序数组中的搜索问题&#xff0c;首先想到 二分法 解决&#xff0c;本篇详细解析关于二分法边界的问题。 目录 一、二分法概念 二、剑指Offer53.在排序数组中查找数字 三、在排序数组中查找元素的第一个和最后一个位置 一、二分法概念 二分法就是在一个有序递增的数组中进行…

使用RabbitMQ发送短信

1、在项目中分别创建模块financial-core、financial-mq、financial-sms&#xff0c;如图&#xff1a; 模块构成 <modules><module>financial-common</module><module>financial-base</module><module>financial-core</module><mo…