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

2024-05-14 15:48

本文主要是介绍线性表的存储结构(顺序存储结构),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线性表是最基本、最简单、也是最常用的一种数据结构。线性表有顺序存储结构与链式存储结构两种表示方式,本章主要介绍线性表的顺序存储结构的表示方式。
线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表的数据元素。其原理大致如下图所示:
这里写图片描述
在此线性表中,可以定义创建线性表,插入、删除元素等操作。其原理如下图:
这里写图片描述

以下是实现的具体代码:

定义结构体

#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100  //线性表初始存储空间大小
#define LISTINCREMENT 10    //新增存储空间大小
typedef int ElemType;
typedef int Status;typedef struct{ElemType *elem; //存储空间基地址int length; //存储长度int listsize; //当前存储容量
}SqList;

初始化线性表

Status InitList_Sq(SqList &L){L.elem = (ElemType*)malloc((LIST_INIT_SIZE)* sizeof (ElemType)); //分配初始存储空间if (!L.elem) return ERROR;L.length = 0;   //空表长度为0L.listsize = LIST_INIT_SIZE;  //设置初始容量return OK;
}

插入元素(在第i-1个元素和i的元素之间插入值)

Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase, *p, *q;if(i < 1||i > L.length + 1) return ERROR;  //判断删除位置是否正确if(L.length >= L.listsize){newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)* sizeof (ElemType)); //存储空间不足,申请增加空间L.elem = newbase;  //新基地址L.listsize += LISTINCREMENT; //容量增加}p = &L.elem[i-1];for(q = &L.elem[L.length-1];q >= p; q--){  *(q+1) = *q;        //插入位置之后的元素后移}*p = e;  //插入eL.length++; //表长+1return OK;
}

删除元素

Status ListDelete_Sq(SqList &L,int i,ElemType e)
{if(i < 1 || i > L.length)return ERROR;ElemType *p,*q;p = &L.elem[i-1];  //获取删除位置的地址e = *p;   //获取地址对应值p++;   //把地址往后移q = &L.elem[L.length-1];  //获取表尾地址for(p ;p <= q; ++p)*(p-1) = *p;   //被删除元素后的元素往前移L.length--;  //表长-1return OK;
}

笔者的经验:
看代码可能会枯燥难懂,动手画图思路就会清晰很多啦  ̄▽ ̄

这篇关于线性表的存储结构(顺序存储结构)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989166

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示