【数据结构学习2】线性表、顺序表、C/C++补充

news2024/11/25 22:41:14

目录

  • 线性表
    • 线性表的定义和特点
    • 线性表类型定义
    • 线性表的存储结构
      • 顺序存储结构
        • 顺序表基本操作的实现
        • 顺序表的查找
          • 算法分析:平均查找长度ASL(Average Search Length)
        • 顺序表的插入
        • 顺序表的删除
  • 补充 C/C++
    • C++中的参数传递
    • 引用类型做形参的三点说明

线性表

线性表的定义和特点

  1. 线性表
  • 线性表是具有相同特性的数据元素的一个有限序列
  • 由n(n>=0)个数据元素(结点)组成
  • 其中数据元素的个数n定义为表的长度
  1. 逻辑特征
  • 在非空的线性表,有且仅有一个开始结点a1,没有直接前趋,只有一个直接后继
  • 有且仅有一个终端结点an,没有直接后继,只有一个直接前趋
  • 其余 内部结点ai(2<=i<=n-1) 有且仅有一个直接前趋ai-1一个直接后继ai+1
    在这里插入图片描述

线性表类型定义

  1. 稀疏多项式的运算
线性表A = ((7,0),(3,1),(9,8),(5,17))
线性表B = ((8,1),(22,7),(-9,8))
  • 创建一个新数组C
  • 分别从头遍历比较a和b的每一项
    • 指数相同,对应系数相加,若其和不为0,则在c中增加一个新项(0则省去)
    • 指数不相同,则将指数较小的项复制到c中
  • 一个多项式已遍历完毕时,将另一个剩余项依次复制到c中即可
  1. 抽象数据类型线性表定义
    在这里插入图片描述
  2. 基本操作
1.InitList(&L) (Initialization List) 
//操作结果:构造一个空的线性表L
2.DestoryList(&L)
//初始条件:线性表L已经存在
//操作结果:销毁线性表L
3.ClearList(&L)
//初始条件:线性表L已经存在
//操作结果:将线性表L重置位空表
4.ListEmpty(L)
//初始条件:线性表L已经存在
//操作结果:若线性表L为空表,则返回Ture,反之返回false
5.ListLength(L)
//初始条件:线性表L已经存在
//操作结果:返回线性表中L中数据元素个数
6.GetElem(L,i,&e)
//初始条件:线性表L已经存在,1<=i<=ListLength(L)
//操作结果:e返回线性表L中第i个数据元素的值
7.LocateElem(L,e,compare())
//初始条件:线性表L已经存在,compare()是数据元素判定函数
//操作结果:返回L中第1个与e满足compare()的数据元素的位序,若不存在返回0
........

线性表的存储结构

在计算机内,线性表有两种基本的存储结构: 顺序存储结构链式存储结构

顺序存储结构

  1. 顺序表的顺序存储表示
  • 线性表的顺序表示又称为顺序存储结构顺序映像
  • 顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
  • 线性表第一个数据元素a1的存储位置,称为线性表的起始位置基地址
  • 线性表顺序存储结构占用一片连续的存储空间(地址连续,中间没有空出存储单元),知道某个元素的存储位置就可以计算其他元素的存储位置。
  • 特点: 以物理位置相邻表示逻辑关系;任一元素均可随机存取
  1. 顺序表和数组
  • 顺序表(元素)–>地址连续、依次存放、随机存取、类型相同<–数组(元素):用以为数组表示顺序表
  • 线性表长度可变(删除/添加)|数组长度不可动态定义->用一变量表示顺序表的长度属性
顺序表定义需要一个数组+一个整形变量
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
typedef struct{
	ElemType elem[LIST_INIT_SIZE];
	int length; //当前长度
}SqList; //顺序表类型

例子:

1.多项式
在这里插入图片描述

#define MAXSIZE 1000 //多项式可能达到的最大长度
typedef struct { //多项式非零项的定义
	float p; //系数
	int e; //指数
}Polynomial;
typedef struct{
	Plynomial *elem; //elem是是指向Plynomial,线性表内元素类型是Plynomial 
	int length; //多项式中当前项的个数
}SpList; //多项式的顺序存储结构类型为SqList

2.图书表

#define MAXSIZE 10000 //图书表可能达到的最大长度
typedef struct{ //图书信息定义
	char no[20]; //图书ISBN
	char name[50]; //图书名字
	float price; //图书价格
}Book;
typedef struct{
	Book *elem;  //存储空间的基地址
	int length; //图书表中当前图书个数
}SqList; //图书表的顺序存储结构类型为SqList

顺序表基本操作的实现

1.基本操作

1.线性表L的初始化(参数用引用)
Status InitList_Sq(SqList &L){ //构造一个空的顺序表L
	L.elem=new ElemType[MAXSIZE]; //为顺序表分配空间
	if(!L.elem) exit(OVERFLOW); //存储分配失败
	L.length=0; //空表长度为0
	return OK;
}
2.销毁线性表L
void DestoryList(SqList &L){
	if(L.elem) delete L.elem; //释放存储空间
}
3.清空线性表
void ClearList(SqList &L){
	L.length=0; //将线性表的长度设置为0
}
。。。。。

2.随机存储

int GetElem(SqList L,int i,ElemType &e){
	if(i<0||i>L.length)return ERROR;
	e=L.elem[i-1];
	return OK;
}

顺序表的查找

int LocateElem(SqList L,ElemType e){ //在线性表L查找值为e的数据元素,返回其序号(是第几个元素)
	for(i=0;i<L.length;i++)
		if(L.elem[i]==e)return i+1; //查找成功,返回序号
	return 0; //查找失败,返回0
}
算法分析:平均查找长度ASL(Average Search Length)
  • 为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值,叫做查找算法的平均查找长度
  • 对含有n个记录的表,查找成功时在这里插入图片描述
  • 假设每个记录的查找概率相等在这里插入图片描述

顺序表的插入

Status ListInsert_Sq(SqList &L,int i,ElemType e){
	if(i<1||i>L.length+1) return ERROR; //i值不合法
	if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
	for(int j=L.Length-1;j>=i+1;j++)
		L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移
	L.elem[i-1]=e; //将新元素e放入第i个位置
	L.length++; //表长增1
	return OK;
}

平均查找长度在这里插入图片描述

时间复杂度:O(n)

顺序表的删除

Status ListDelete_Sq(SqList &L,int i){
	if(i<1||i>L.length) return ERROR; //i值不合法
	for(int j=i;j<L.length-1;j++)
		L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移
	L.length--; //表长减1
	return OK;
}

平均查找长度:在这里插入图片描述

时间复杂度:O(n)


补充 C/C++

  1. 数组静态/动态分配
typedef struct{	 	//数组静态分配
	ElemType data[MaxSize];
	int length;
}SqList; //顺序表类型
typedef struct{ 	//数组动态分配
	ElemType *data;
	int length;
}SqList; //顺序表类型
  1. C语言的内存动态分配
typedef struct{..}SqList;
SqList L; //定义了变量之后才会占用(开辟)空间
L.data=(ElemType*) malloc (sizeof (ElemType) * MaxSize);
//(ElemType*):强制转换为ElemType类型的指针,这样就可以获得这个数组(内存空间)的基地址
  • malloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址
  • sizeof(x)运算,计算变量x的长度
  • free(*p),释放指针p所指变量的存储空间,即彻底删除一个变量
  1. C++的动态存储分配
  • new 类型名T (初值列表)

功能:申请用于存放T类型对象的内存空间,并依初值列表赋予初值
结果:T类型的指针,指向新分配的内存

int *p1=new int; //从内存中动态的分配一块空间,将这块地址赋值给指针变量
int *p1=new int(10);
  • delete * p

功能:释放指针p所指的内存。p必须是new操作的返回值

C++中的参数传递

  • 函数调用时送给形参表的实参必须与形参三个一致
  • 参数传递有两种方式
    • 传值方式:参数为整形、实型、字符型等
    • 传地址:参数为指针变量、引用类型、数组名
  1. 传值方式

把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。

#include<iostream.h>
void swap(float m,float n){
	float temp;
	temp=m;
	m=n;
	n=temp;
}
void main(){
	float a,b;
	cin>>a>>b;
	swap(a,b);
	cout<<a<<endl<<b<<endl
}//实参a,b的值赋给形参m,n,swap只交换了m,n的值,实参不改变

2.传地址方式–指针变量作为参数

  • 形参变化影响实参

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

void swap(float *m,float *n){
	float temp;
	temp=*m;
	*m=*n;
	*n=temp;
	printf("%f,%f",*m,*n);
}
void main(){
	float a=13.2,b=23.4,*p1,*p2;
	p1=&a;
	p2=&b;
	swap(p1,p2);
	printf("%f,%f",a,b);
}
  • 形参变化不影响实参
#include <stdio.h>
#include <stdlib.h>

void swap(float *m,float *n){ //只是改变了指针的名字,没有改变指针所指的内容
	float *temp;
	temp=m;
	m=n;
	n=temp;
}
void main(){...}
  1. 传地址方式–数组名做参数
  • 传递的是数组的首地址
  • 对形参数组所做的任何改变都将反映到实参数组中
#include<iostream.h>
void sub(char b[]){//不能指明长度,因为传递过来的是地址,可以改成*b
	b[]="world";
}
void main(void){
	char a[10]="hello";
	sub(a);
	printf("%d",a);
}
  1. 传地址方法–引用类型做参数

引用:用来给一个对象提供一个替代的名字

#include<iostream.h>
void main(){
	int i=5;
	int &j=i; //j引用i的地址,相当于i,j指向同一块地址
	i=7;
	printf("%d,%d",i,j);
}

引用类型做形参的三点说明

  • 传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化
  • 引用类型做参数。在内存中并没有产生实参的副本,它直接对实参操作;而一般变量做参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。(引用不会太占空间)
  • 指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。(指针容易乱)

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

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

相关文章

无需公网IP,远程连接SQL Server数据库【内网穿透】

文章目录1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语1.前言 数据库的重要性相信大家都有所了解&#xf…

gpt4人工智能怎么下载-chatgpt哪里下载

GPTChat是一种使用基于深度学习的自然语言处理模型&#xff08;GPT&#xff09;实现的智能对话系统。 GPT模型是一种Transformer模型&#xff0c;由OpenAI实现&#xff0c;可用于生成各种类型的文本&#xff0c;包括对话文本。 GPTChat通过对话实现用户与机器之间的交互。用户…

什么是美股市场?主要的美股交易市场有哪些?

美股市场就是交易股票的场所。美股交易市场不同&#xff0c;也影响着投资者在交易美股时的计划和安排。主要的美股交易市场包含哪些&#xff1f; 美股交易市场一、NYSE NYSE又称纽约证券交易所&#xff0c;是上市公司总市值第一&#xff08;2009年数据&#xff09;&#xff0c…

榜单!智能车控进入「新周期」,BCM份额TOP10供应商都有谁

作为控制车身不同功能及信号通信中转的ECU模块&#xff0c;从广义范畴来说&#xff0c;BCM&#xff08;Body Control Module&#xff09;实际上也是整车最早开始进入「域」整合的部件之一。比如&#xff0c;车身控制多功能的集成&#xff08;1.0&#xff09;、BCM网关&#xff…

Maven + Nexus 私有仓库搭建 + 项目推送 + 其他项目拉取(简记)

序 2022年是比较忙碌的一年&#xff0c;耽误了很多博客积累&#xff0c;这一年开始看的比写得多。后面也发现像原来一样的去写下来的成本太高。后面开始只做一些简记。即减少书写成本&#xff0c;也能巩固知识&#xff0c;提炼精华。 一 、Nexus下载 下载地址&#xff1a; N…

Dubbo知识【高级特性】

目录 1&#xff1a;Dubbo高级特性 1.1&#xff1a;超时与重试 什么是超时&#xff1f; 什么是重试&#xff1f; 如何配置超时与重试&#xff1a; 1.2&#xff1a;启动检查 1.3&#xff1a;多版本 1.4&#xff1a;负载均衡 1.5&#xff1a;序列化 1.6&#xff1a;地址…

夜深敲代码——记录一个优化过程

前言 最近一段时间OpenAI的热度一直不减&#xff0c;ChatGpt带来的极大便利性大家也是深有体会。荔枝也跟风搞了一个来玩玩&#xff0c;感觉还是很不错的哈哈哈哈。这不&#xff0c;最近开始刷题用ChatGpt帮忙找bug就很舒服&#xff0c;它甚至可以为我们提供优化的思路&#xf…

git使用手册——简单实用

常见命令 创建仓库 git init初始化仓库git clone拷贝一份远程仓库&#xff0c;也就是下载一个项目。提交与修改 git add添加文件到仓库git status查看仓库当前的状态&#xff0c;显示有变更的文件。git diff比较文件的不同&#xff0c;即暂存区和工作区的差异。git commit提…

RGB与YUV

什么是YUV YUV也叫YCbCr模型&#xff0c;是相对于RGB模型的一种广泛使用的颜色表示模型&#xff0c;YUV格式是1938年由一个法国通信工程师M. Georges Valensi发明的。 YUV中的Y表示亮度luminance&#xff0c;UV表示色度chrominance&#xff1b; 我们知道人眼是个复杂的器官&a…

vue2.x 学习笔记

div标签&#xff08;HTML&#xff09; div标签的作用是&#xff0c;设定字、画、表格等的摆放位置。 DIV元素&#xff0c;是用来为HTML文档内大块&#xff08;block-level&#xff09;的内容提供结构和背景的元素。 DIV标签&#xff0c;称为区隔标记。 什么是vue vue是响应式…

天猫商品详情数据接口,京东商品详情数据接口,品牌商品数据分析,品牌店铺商品数据分析,监控商品价格销量接口代码封装教程

最近做一个品牌电商公司内部ERP系统分发的采集淘宝、天猫、京东商品详情页API接口的投标工作&#xff0c;集成的接口&#xff0c;其中有一个需求就是监控品牌授权店铺的价格、销量&#xff0c;标题、主图等等&#xff0c;具体需求如下描述&#xff1a;所有授权店铺的公开数据都…

04、SpringBoot运维实用篇

一、配置文件1、临时属性设置目前我们的程序包打好了&#xff0c;可以发布了。但是程序包打好以后&#xff0c;里面的配置都已经是固定的了&#xff0c;比如配置了服务器的端口是8080。如果我要启动项目&#xff0c;发现当前我的服务器上已经有应用启动起来并且占用了8080端口&…

浅谈工厂模式

文章目录01 | 抽象工厂02 | 工厂方法03 | 未完待续创建模式在什么被创建&#xff0c;谁创建它&#xff0c;它是怎么被创建的&#xff0c;以及何时创建这些方面提供了很强的灵活性。通常创建模式允许用结构和功能差别很大的“产品”对象来配置一个系统 01 | 抽象工厂 抽象工厂模…

决策树算法介绍

决策树目录1. 决策树基础1.1 决策树定义1.2 熵以及信息熵介绍2. 决策树的划分依据2.1 信息增益2.1.1信息增益应用举例2.2 信息增益率2.2.1 信息增益率使用举例2.2.2 信息增益率使用举例22.3 基尼值和基尼指数2.3.1 基尼值和基尼指数介绍2.3.2 基尼值和基尼指数实现案例1. 决策树…

e-STUDIO2010AC•2520AC安装步骤

注意!在室内室外温差比较大的情况下,设备需要在室内静置240分钟以上才可以进行安装。

如何训练个人的ChatGpt4

如何在自己的计算机上安装类似 ChatGPT 的个人 AI 并在没有互联网的情况下运行它 个人 AI 的“第一台 PC”时刻 这是个人AI的“第一台PC”时刻&#xff0c;随之而来的是限制&#xff0c;就像在车库里生产第一台Apple 1一样。你是先驱。今天&#xff0c;任何人都可以使用私人和…

一个从培训学校走出来的测试工程师自述....

简单介绍一下我自己&#xff0c;1997年的&#xff0c;毕业一年了&#xff0c;本科生&#xff0c;专业是机械制造及其自动化。 在校度过了四年&#xff0c;毕业&#xff0c;找工作&#xff0c;填三方协议&#xff0c;体检&#xff0c;入职。我觉得我可能就这么度过我平平无奇的…

【LeetCode】剑指 Offer 56. 数组中数字出现的次数 p275 -- Java Version

1. 题目介绍&#xff08;56. 数组中数字出现的次数&#xff09; 面试题56.&#xff1a;数组中数字出现的次数&#xff0c; 一共分为两小题&#xff1a; 题目一&#xff1a;数组中只出现一次的两个数字题目二&#xff1a;数组中唯一只出现一次的数字 2. 题目1&#xff1a;数组中…

学术速运|利用深度学习和分子动力学模拟设计抗菌肽

题目&#xff1a; Designing antimicrobial peptides using deep learning and molecular dynamic simulations 文献来源:Briefings in Bioinformatics, 2023, 1–13 代码&#xff1a;https://github.com/gc-js/Antimicrobial-peptide-generation 简介&#xff1a;随着多药耐…

Springboot实现文件断点续传-基于GridFS

Springboot实现文件断点续传-基于GridFS 需求介绍 我们后台是使用GridFS存储文件对象的&#xff0c;之前客户端都是Web浏览器&#xff0c;网络环境相对较为稳定&#xff0c;所以我们直接提供文件下载就行。但最近新增需求需要在移动端进行文件下载&#xff0c;这就有问题了。…