【数据结构与算法】二、线性表的顺序表示【硬核】

news2024/11/26 12:36:20

文章目录

  • 二、线性表
    • 2.1 线性表的定义和特点
    • 2.2 线性表的顺序表示和实现
    • 2.3 类C语言有关操作补充
    • 2.4 线性表基本操作的实现
      • 2.4.1 线性表的基本操作:
      • 2.4.2 线性表L的初始化
      • 2.4.3 销毁和清空线性表L
      • 2.4.4 求线性表L的长度以及判断线性表L是否为空
      • 2.4.5 顺序表的取值(根据位置i获取相应位置数据元素的内容)
      • 2.4.6 顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)
      • 2.4.7 顺序表的插入(在第i个位置插入指定的元素)
      • 2.4.8 顺序表的删除(删除第i个位置的元素)
    • 2.5 顺序表(线性表的顺序存储结构)的特点
    • 2.6 C++实现代码

二、线性表

2.1 线性表的定义和特点

在这里插入图片描述

2.2 线性表的顺序表示和实现

图书表的顺序存储结构类型定义:
在这里插入图片描述

#define OK	1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define MAXSIZE  10000 //能够存储的最大图书数量

//1、图书表的顺序存储结构类型定义
//1.1、图书的存储结构
typedef struct{
	char isbn[20];//图书的isbn编号
	char name[50];//图书的名称
	double price;//图书的价格
}Book;
typedef Book ElemType;//元素数据的类型
//1.2、图书表的顺序存储结构
typedef struct{
	ElemType* books;//存储图书数组结构的基地址
	int length;//当前有多少本图书
}BookList;

2.3 类C语言有关操作补充

在调用函数的过程中,当形参为引用类型时,实参和形参占用了相同的空间
在这里插入图片描述

2.4 线性表基本操作的实现

2.4.1 线性表的基本操作:

在这里插入图片描述

2.4.2 线性表L的初始化

在这里插入图片描述

// 顺序表的存储结构
typedef struct {
	ElemType* elems;//存储基本元素的数组基地址
	int length;//当前基本元素的个数
}SqList;
typedef int Statu;
//1、顺序表L的初始化
Statu initSqList(SqList &L) {
	L.elems = new ElemType[MAXSIZE];//为存储数据的数组开辟空间
	if (!L.elems) exit(OVERFLOW);//空间开辟失败
	L.length = 0;//空表长度置为0
	return OK;
}

2.4.3 销毁和清空线性表L

在这里插入图片描述

//2、销毁和清空线性表L
//2.1 销毁顺序表L
void destroySqList(SqList &L) {
	if (L.elems) delete L.elems;
	L.length = 0;
}
//2.2 清空线性表L
void clearSqList(SqList &L) {
	L.length = 0;
}

2.4.4 求线性表L的长度以及判断线性表L是否为空

在这里插入图片描述

//3、求线性表L的长度以及判断线性表L是否为空
//3.1 求线性表L的长度
int getLength(SqList L) {
	return L.length;
}
//3.2 判断线性表L是否为空
Statu isEmpty(SqList L) {
	if (L.length == 0) return TRUE;
	return FALSE;
}

2.4.5 顺序表的取值(根据位置i获取相应位置数据元素的内容)

在这里插入图片描述

//4、顺序表的取值(获取第i个位置数据元素的内容)
Statu getElem(int i, SqList L,ElemType &e) {
	if (i<1 || i>L.length) return ERROR;//数组越界
	e=L.elems[i - 1];
	return OK;
}

2.4.6 顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)

在这里插入图片描述

//5、判断两个数据元素是否相等
Statu isEqual(ElemType a, ElemType b) {
	if (strcmp(a.isbn,b.isbn)==0) return TRUE;
	return FALSE;
}
//6、顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)
int LocateElem(ElemType e, SqList L) {
	for (int i = 0; i < L.length; i++) {
		if (isEqual(L.elems[i],e)) return i+1;
	}
	return 0;
}

顺序表的查找算法分析

在这里插入图片描述

2.4.7 顺序表的插入(在第i个位置插入指定的元素)

在这里插入图片描述

Statu insertSqList(SqList &L, int i,ElemType e) {
	if (i<1 || i>L.length + 1) return ERROR;//插入位置不合法
	if (L.length == MAXSIZE) return ERROR;//元素已满,无法插入
	for (int j = L.length-1; j >=i-1; j--) {
		L.elems[j+1] = L.elems[j];
	}
	L.elems[i - 1] = e;
	L.length++;
	return OK;
}

2.4.8 顺序表的删除(删除第i个位置的元素)

在这里插入图片描述

Statu deleteSqList(SqList& L, int i) {
	if (i<1 || i>L.length) return ERROR;//删除位置不合法
	for (int j = i; j < L.length; j++) {
		L.elems[j - 1] = L.elems[j];
	}
	L.length--;
	return OK;
}

2.5 顺序表(线性表的顺序存储结构)的特点

  • (1)利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致

  • (2)在访问线性表时,可以快速地计算出任何一个数据元素的存储地址。因此可以粗略地认为,访问每个元素所花时间相等

  • 这种存储元素的方法被称为随机存取法
    在这里插入图片描述

2.6 C++实现代码

main.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Sqlist.h"


int main() {
	test();
	return 0;
}

Sqlist.h

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK	1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define MAXSIZE  10000 //能够存储的最大图书数量

//1、图书表的顺序存储结构类型定义
//1.1、图书的存储结构
typedef struct{
	char isbn[20];//图书的isbn编号
	char name[50];//图书的名称
	double price;//图书的价格
}Book;
typedef Book ElemType;//元素数据的类型
//1.2、图书表的顺序存储结构
typedef struct{
	ElemType* books;//存储图书数组结构的基地址
	int length;//当前有多少本图书
}BookList;

// 顺序表的存储结构
typedef struct {
	ElemType* elems;//存储基本元素的数组基地址
	int length;//当前基本元素的个数
}SqList;
typedef int Statu;

//函数声明===========================================
//2、顺序表L的初始化
Statu initSqList(SqList &L);
//3、销毁线性表L
void destroySqList(SqList &L);
//4、清空线性表L
void clearSqList(SqList& L);
//5、求线性表L的长度
int getLength(SqList L);
//6、判断线性表L是否为空
Statu isEmpty(SqList L);
//7、顺序表的取值(根据位置i获取相应位置数据元素的内容)
Statu getElem(int i, SqList L, ElemType& e);
//8、顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)
//8.1 //判断两本图书是否相等
Statu isEqual(ElemType a, ElemType b);
//8.2 顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)
int LocateElem(ElemType e, SqList L);
//9、顺序表的插入(在第i个位置插入指定的元素)
Statu insertSqList(SqList& L, int i, ElemType e);
//10、顺序表的删除(删除第i个位置的元素)
Statu deleteSqList(SqList& L, int i);
//11、打印单个元素
void displayElem(ElemType e);
//12、打印整个线性表
void displaySqList(SqList L);
//13、从txt文件中读取数据元素数据
Statu readDataFromTxt(SqList& L, const char* filename);

//================================================

//2、顺序表L的初始化
Statu initSqList(SqList& L) {
	L.elems = new ElemType[MAXSIZE];//为存储数据的数组开辟空间
	if (!L.elems) exit(OVERFLOW);//空间开辟失败
	L.length = 0;//空表长度置为0
	return OK;
}
//3、销毁线性表L
void destroySqList(SqList& L) {
	if (L.elems) delete L.elems;
	L.length = 0;
}
//4、清空线性表L
void clearSqList(SqList& L) {
	L.length = 0;
}
//5、求线性表L的长度
int getLength(SqList L) {
	return L.length;
}
//6、判断线性表L是否为空
Statu isEmpty(SqList L) {
	if (L.length == 0) return TRUE;
	return FALSE;
}
//7、顺序表的取值(根据位置i获取相应位置数据元素的内容)
Statu getElem(int i, SqList L,ElemType &e) {
	if (i<1 || i>L.length) return ERROR;//数组越界
	e=L.elems[i - 1];
	return OK;
}

//8、顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)
//8.1 判断两本图书是否相等
Statu isEqual(ElemType a, ElemType b) {
	if (strcmp(a.isbn,b.isbn)==0) return TRUE;
	return FALSE;
}
//8.2 顺序表的查找(在线性表L中查找与指定值e相同的数据元素的位置)
int LocateElem(ElemType e, SqList L) {
	for (int i = 0; i < L.length; i++) {
		if (isEqual(L.elems[i], e)) return i + 1;
	}
	return 0;
}
//9、顺序表的插入(在第i个位置插入指定的元素)
Statu insertSqList(SqList &L, int i,ElemType e) {
	if (i<1 || i>L.length + 1) return ERROR;//插入位置不合法
	if (L.length == MAXSIZE) return ERROR;//元素已满,无法插入
	for (int j = L.length-1; j >=i-1; j--) {
		L.elems[j+1] = L.elems[j];
	}
	L.elems[i - 1] = e;
	L.length++;
	return OK;
}
//10、顺序表的删除(删除第i个位置的元素)
Statu deleteSqList(SqList& L, int i) {
	if (i<1 || i>L.length) return ERROR;//删除位置不合法
	for (int j = i; j < L.length; j++) {
		L.elems[j - 1] = L.elems[j];
	}
	L.length--;
	return OK;
}
//11、打印单个元素
void displayElem(ElemType e) {
	printf("isbn编号是:%s\n", e.isbn);
	printf("图书的名称是:%s\n", e.name);
	printf("图书的价格是:%lf\n", e.price);
}
//12、打印整个线性表
void displaySqList(SqList L) {
	for (int i = 0; i < L.length; i++) {
		displayElem(L.elems[i]);
	}
}
//13、从txt文件中读取数据元素数据
Statu readDataFromTxt(SqList &L, const char* filename) {
	FILE* file = freopen(filename, "r", stdin);
	if (!file) {
		printf("文件读取失败\n");
		return ERROR;
	}
	ElemType e;
	int i = 0;
	while (scanf("%s%s%lf", e.isbn, e.name, &e.price)!=EOF&&i<MAXSIZE) {
		L.elems[i++] = e;
		L.length++;
	}
	return OK;
}
//14、测试函数
void test() {
	SqList L;//定义一个线性表
	initSqList(L);//初始化线性表
	//判断线性表是否为空
	if (isEmpty(L)) printf("线性表是空的\n");
	else{
		printf("线性表的长度是: %d\n", L.length);
	}
	printf("======1、从文件中读取图书表数据========\n");
	//从文件中读取图书表数据
	readDataFromTxt(L, "data.in.txt");
	displaySqList(L);
	//往线性表中插入元素
	printf("======2、往线性表中插入元素========\n");
	ElemType e1;
	strcpy(e1.isbn, "00X");
	strcpy(e1.name, "安徒生童话");
	e1.price = 88.8;

	insertSqList(L, 3, e1);

	//判断线性表是否为空
	if (isEmpty(L)) printf("线性表是空的\n");
	else {
		printf("线性表的长度是: %d\n", L.length);
	}
	printf("=======3、取第三个元素=======\n");

	//取第三个元素
	ElemType e;
	getElem(3, L, e);
	displayElem(e);
	printf("========4、在第三个位置插入元素e========\n");

	//在第三个位置插入元素e
	insertSqList(L, 3, e);
	//打印线性表
	displaySqList(L);
	printf("=========5、删除第三个位置的元素========\n");

	//删除第三个位置的元素
	deleteSqList(L, 3);
	displaySqList(L);
	printf("=========6、查看元素e在线性表的哪个位置=======\n");

	//查看元素e在线性表的哪个位置
	int index=LocateElem(e, L);
	printf("元素e在线性表中的位置: %d\n", index);

}

data.in.txt

001 平凡的世界 22.2
002 活着 66.5
003 天之下 33.2

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

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

相关文章

Docker --- Docker-Compose、镜像仓库

一、Docker-Compose Docker Compose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器&#xff01; 1.1、初识DockerCompose Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。格式如下&#xff1a; v…

手术机器人企业密集IPO 国产替代寻求突破

原创 | 文 BFT机器人 2023年或为手术机器人国产化元年&#xff0c;谁将成为中国的“达芬奇”&#xff1f;各路资本对中国手术机器人产业热情高涨。 今年以来&#xff0c;多家手术机器人企业启动首次公开发行&#xff08;IPO&#xff09;进程&#xff0c;精锋医疗冲刺港股&#…

09-Node.js—express框架

目录 1、express 介绍2、express 使用2.1 express 下载2.2 express 初体验 3、express 路由3.1 什么是路由3.2 路由的使用3.2.1使用Ajax发送一次post请求 3.3 获取请求参数3.4 获取路由参数3.5 路由参数练习 4、express 响应设置5、express 中间件5.1 什么是中间件5.2 中间件的…

echarts 环形图_圆环动画

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、环形动画二、环形图…

(原创)Flutter基础入门:手把手教你搭建Flutter混合项目:AAR方式集成

前言 上一篇博客讲了如何用“模块代码依赖模式”这种方式去搭建Flutter混合项目 因为篇幅原因&#xff0c;AAR集成方式来搭建项目的步骤和注意点放到这篇博客来讲 如果你没看过上篇博客&#xff0c;建议先阅读上一篇&#xff1a; &#xff08;原创&#xff09;Flutter基础入门…

快来看看这些前端开发技巧你掌握多少吧

文章目录 一、代码整洁推荐1.1 三元(三目)运算符1.2 短路判断简写1.3 变量声明简写1.4 if真值判断简写1.5 For循环简写1.6 对象属性简写1.7 箭头函数简写1.8 隐式返回简写1.9 模板字符串1.10 默认参数值1.11 解构赋值简写1.12 多条件判断简写1.13 多变量赋值简写1.14 解构时重命…

easyExcel动态导出,合并指定单元格

如上图所示&#xff0c;需要使用easyExcel动态导出上述表格并指定合并其中的单元格&#xff0c;日期是动态的&#xff0c;每个月不相同&#xff0c;直接上实现代码&#xff0c;以demo形式展现&#xff0c;更好理解 /** * 考勤记录动态导出测试 */ GetMapping(&q…

【Kotlin学习】R2DBC与MyBatis性能对比

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、测试框架选取Spring Webflux VS Spring MVCSpring Data R2DBC VS MyBatis 二、测试代码编写1. 项目1核心代码1.1 引入依赖1.2 接口代码 2. 项目2核心代码2.…

Layui图片上传

前端代码&#xff1a; <div class"layui-upload"> <button type"button" class"layui-btn" id"test1">上传图片</button> <div class"layui-upload-list"> <img class"lay…

如何一次性生成大量结构相同、内容不同的二维码

使用 批量模板数据 的方式&#xff0c;可 一次性生成大量结构相同&#xff0c;内容不同的活码 &#xff0c;大幅提升制码效率。 模板的样式&#xff0c;关联的表单状态等所有内容均可进行修改&#xff0c;修改后所有子码都将批量更新&#xff0c;且模板可重复使用&#xff0c;让…

页面加载进度条(VUE3)

通常我们希望在页面跳转加载中&#xff0c;页面顶部出现进度条。 &#xff08;1&#xff09; 下载依赖 npm install nprogress --save &#xff08;2&#xff09;在router中得index.js中引入 import NProgress from nprogress import nprogress/nprogress.css &#xff08;…

C++——类和对象(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年4月25日 内容&#xff1a;C类和对象讲解 目录 前言&#xff1a; 1.this指针&#xff1a; 2.默认成员函数&#xff1a; 3.构造函数&#xff1a; 4.析构函数&#xff1a; 5.构造函数的问题&#xff1a; 结尾&#xff…

Transformer 代码详细解析

Transformer 代码详细解析 文章目录 Transformer 代码详细解析一、Transformer 背景介绍1.1 Transformer 的诞生1.2 Transformer 的优势1.3 Transformer 的市场 二、Transformer架构解析2.1 认识 Transformer 架构2.1.1 Transformer模型的作用2.1.2 Transformer 总体架构图 2.2…

全国计算机等级三级网络技术试卷详解(一)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1.下列关于RPR技术的描述中&#xff0c;错误的是&#xff08;&#xff09;。 A) RPR与FDDI一样使用双环结构 B) 在RPR环中&#xff0c;源节点向目的节点成功发出…

2023常用的10款电力电子系统仿真分析软件推荐

市场上有许多电子仿真器&#xff0c;那么对于电力电子项目来说&#xff0c;哪种仿真器最好呢&#xff1f;或者因为期望任何软件包在各个方面都是最好的是不合理的&#xff0c;那么用户如何确定哪个软件是项目的最佳选择&#xff1f; PSIM PSIM是一种模块化封装&#xff0c;专为…

华为认证实验篇-ENSP的安装(附下载地址)

ENSP&#xff08;Enterprise Network Simulation Platform&#xff09;是华为公司开发的一款网络仿真软件&#xff0c;它可以帮助网络工程师进行网络拓扑设计、网络配置、网络测试等工作。本篇文章将介绍如何在Windows操作系统上安装ENSP。后续会在专栏陆续更新ENSP的实验&…

MACH SYSTEMS操作手册 SAEJ2716(SENT) to RS-232/CAN Gateway怎么使用?

双通道SAE J2716 (SENT)至RS-232/CAN总线网关&#xff0c;具有两个双向SENT通道和RS-232 (SENT-RS232) 或CAN总线 (SENT-CAN) 接口。两种变体还提供两个模拟输出&#xff0c;可以直接将输入SENT数据转换为模拟电压。该网关配备了一个免费的PC应用程序&#xff0c;用于SENT通信分…

VS同时调试主程序和子程序工具

VS要想要实现同时调试主程序和子程序&#xff0c;可使用工具 Microsoft Child Process Debugging power Tool 来实现。 我的环境和官方使用说明 环境&#xff1a;VS2019 官方使用说明&#xff1a;Introducing the Child Process Debugging Power Tool - Azure DevOps Blogh…

Swagger 版本控制 注释展示(.NET)

版本控制 项目创建 以Visual Studio 2022为例&#xff0c;创建Web API项目&#xff0c;如下图所示。 在创建时勾选启用OpenAPI支持&#xff0c;默认安装Swashbuckle.AspNetCore库&#xff0c;并配置相关信息。 创建版本枚举类 /// <summary>/// 版本枚举/// </su…

新版Fluent默认保存的h5文件无法用Tecplot打开的解决办法(亲试有效,评论区是重点)

文章目录 Ansys Fluent简介Fluent 输入/出 文件格式新版Fluent的输出压缩文件&#xff08;.cas.h5文件&#xff09;解决办法 Ansys Fluent简介 Ansys Fluent &#xff0c;是国际上比较流行的商用CFD软件包&#xff0c;在美国的市场占有率为60%&#xff0c;凡是和流体、热传递和…