【数据结构】 顺序表的基本操作 (C语言版)

一、顺序表

1、顺序表的定义:

线性表的顺序存储结构,即将表中的结点按逻辑顺序依次存放在一组地址连续的存储单元里。这种存储方式使得在逻辑结构上相邻的数据元素在物理存储上也是相邻的,可以通过数据元素的物理存储位置来反映其逻辑关系。

数据结构中的顺序表是一种线性表,它在计算机内存中以数组的形式保存。顺序表采用顺序存储结构,即将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。这种存储方式使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

2、顺序表的优缺点:

顺序表的优点是便于随机访问查找,时间复杂度为O(1)。缺点是不便于插入和删除操作,尤其是中间或头部的插入和删除操作,时间复杂度为O(n)。因此,顺序表适用于需要大量访问元素,尾部插入和删除较多的场景。

顺序表的优点:
  1. 存储密度大:数据元素在内存中紧密排列,空间利用率高。
  2. 存取速度快:可以通过下标直接访问任意位置的元素,时间复杂度为O(1)。
  3. 空间连续:一次性申请一定大小的存储空间,便于管理和控制。
顺序表的缺点:
  1. 插入和删除操作效率低下:需要移动大量数据元素,特别是当插入或删除的位置位于中间或头部时,时间复杂度为O(N)。
  2. 长度固定:无法自由扩展或收缩,当元素个数超过预先分配的空间时会导致溢出,而元素个数远少于预先分配的空间时则会造成空间浪费。
  3. 动态调整困难:顺序表的空间必须预先分配,无法根据实际需求动态调整。

二、顺序表的基本操作算法(C语言)

1、宏定义
typedef int Status;
typedef char ElemType;
2、创建结构体
//定义类型
typedef struct {char *elem;int length;
}SqList;
3、顺序表初始化
//初始化
Status InitList_sq(SqList &L){//引用型参数
//	L.elem=new char[10];L.elem=new ElemType[10];if(!L.elem){//exit (-1);exit (OVERFLOW);}L.length=0;return OK;
}
4、顺序表插入

在顺序表L的第 i 个元素之前插入新的元素e

1.找到第i-1个位置   

2.将元素e插入

时间复杂度T(n)=O(n)

顺序表的空间复杂度S(n)=O(1)    没有占用辅助空间

//插入
Status InsertList_sq(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.elem[j+1]=L.elem[j];}L.elem[i-1] = e;L.length++;return OK;
}
4、顺序表取值 
//取值
Status GetElem(SqList L, int i, ElemType &e){if(i<1 || i>L.length) {return ERROR;}e = L.elem[i-1];return OK;
}
5、求顺序表的长度
//求长度
int GetLength(SqList L){return L.length;
}
6、顺序表查找

//查找
Status LocateElem(SqList L,ElemType e)
{for (int i = 0; i < L.length; i++) {if (L.elem[i] == e)return i + 1;}return 0;
}
7、顺序表删除

插入i-1个位置,删除第i个位置的元素

//删除
Status ListDelete(SqList &L,int i,ElemType &e)
{if ((i<1) || (i>L.length+1)) return ERROR;
//    if (L.length==MAXSIZE) return 0;       //不用判空e = L.elem[i - 1];for (int j=i;j<=L.length-1;j++)             //for (j=i-1;j<=L.length-1;j++)L.elem[j-1]=L.elem[j];             // L.elem[j]=L.elem[j+1];--L.length;return  OK;
}

四、顺序表的全部代码(C语言)

#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10typedef int Status;
typedef char ElemType;//定义类型
typedef struct {char *elem;int length;
} SqList;//顺序表初始化
//int InitList_sq(SqList &L){   //引用型参数
Status InitList_sq(SqList &L) {
//	L.elem=new char[10];L.elem = new ElemType[10];if (!L.elem) {//exit (-1);exit(OVERFLOW);}L.length = 0;
//	return 1;return OK;
}//功能菜单
int choice() {printf("==================================\n");printf("         顺序表操作功能菜单        \n");printf("          1、插入元素            \n");printf("          2、查询表长            \n");printf("          3、按位查找            \n");printf("          4、按值查找            \n");printf("          6、批量插入            \n");printf("          7、退出程序            \n");printf("==================================\n");return 0;
}//顺序表插入
Status InsertList_sq(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.elem[j + 1] = L.elem[j];}L.elem[i - 1] = e;L.length++;return OK;
}//顺序表取值
Status GetElem(SqList L, int i, ElemType &e) {if (i < 1 || i > L.length) {return ERROR;}e = L.elem[i - 1];return OK;
}//求顺序表长度
int GetLength(SqList L) {return L.length;
}//顺序表查找
Status LocateElem(SqList L, ElemType e) {for (int i = 0; i < L.length; i++) {//printf("%c",L.elem[i]);if (L.elem[i] == e)return i + 1;}return 0;
}//顺序表删除
Status ListDelete(SqList &L, int i, ElemType &e) {if ((i < 1) || (i > L.length + 1)) return ERROR;e = L.elem[i - 1];for (int j = i; j <= L.length - 1; j++)         //j=i-1L.elem[j - 1] = L.elem[j];             // L.elem[j]=L.elem[j+1];L.length--;return OK;
}int main() {//printf("Hell Word");//struct List list;SqList sqList;printf("顺序表正在初始化....\n");Status returnStatus = InitList_sq(sqList);if (returnStatus == OK) {printf("顺序表初始化成功!\n");} else {printf("顺序表初始化失败!\n");}choice();while (1) {int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//插入// printf("length = %d \n", sqList.length);// int listLength = GetLength(sqList);// printf("%d ", listLength);int insertLocation;ElemType insertElem;printf("请输入插入元素位置及插入元素(请在英文状态下输入例如:1,a): \n");scanf("%d,%c", &insertLocation, &insertElem);Status insertStatus = InsertList_sq(sqList, insertLocation, insertElem);if (insertStatus == OK) {printf("向顺序表中第%d个位置,插入元素%c成功!\n", insertLocation, insertElem);} else {printf("向顺序表中插入元素失败!\n");}choice();}break;case 2: {//求顺序表的长度printf("顺序表的长度为:%d  。\n", GetLength(sqList));choice();}break;case 3: {//取值Status no;printf("请输入需要查询的元素的位置:\n");scanf("%d", &no);ElemType element;Status GetElemStatus = GetElem(sqList, no, element);//printf("element = %c ", element);printf("在顺序表中第%d个元素为:%c 。 \n", no, element);if (GetElemStatus = OK) {printf("在顺序表中第%d个元素为:%c 。 \n", no, element);} else {printf("查找顺序表中第%d个元素失败。 \n", no);}choice();}break;case 4: {//查找ElemType findElem;printf("请输入想要查找元素:\n");getchar();    //用于接收回车scanf("%c", &findElem);int locate = LocateElem(sqList, findElem);if (locate != 0) {printf("所需查找的元素%c存在于顺序表中,它的在第%d位置。  \n", findElem, locate);} else {printf("所需查找的元素%c不存在于顺序表中!  \n", findElem);}//printf("locate = %d ", locate);choice();}break;case 5: {//删除//ListDelete_DuL(list,1);Status delindex;ElemType delElem;printf("请输入想要删除元素的位置:\n");scanf("%d", &delindex);Status delreturn = ListDelete(sqList, delindex, delElem);if (delreturn == OK) {printf("在顺序表中删除第%d个元素为:%c 。 \n", delindex, delElem);} else {printf("在顺序表中删除第%d个元素失败! \n", delindex);}printf("顺序表的长度为:%d  \n", GetLength(sqList));//printf("delindex = %d ", delindex);choice();}break;case 6: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);ElemType array[on];for (int i = 1; i <= on; i++) {getchar();printf("向顺序表第%d个位置插入元素为:", (i));scanf("%c", &array[i]);}for (int i = 1; i <= on; i++) {Status insertStatus = InsertList_sq(sqList, i, array[i]);if (insertStatus == OK) {printf("向顺序表中第%d个位置,插入元素%c成功!\n", i, array[i]);} else {printf("向顺序表中第%d个位置插入元素失败!\n", i);}}choice();}break;case 7: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}
}

五、结果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSL证书DV和OV的区别

SSL证书是数字证书的一种&#xff0c;配置在服务器上&#xff0c;起到文件信息传输加密的作用。由受信任的数字证书颁发机构CA在验证服务器身份后颁发&#xff0c;防止第三方窃取或篡改信息。 在选择SSL证书的过程中&#xff0c;一般要注意选择的SSL证书的等级。常见有DV和OV证…

单片机面向对象思维的架构:时间轮片法

今天分享一篇单片机程序框架的文章。 程序架构重要性 很多人尤其是初学者在写代码的时候往往都是想一点写一点&#xff0c;最开始没有一个整体的规划&#xff0c;导致后面代码越写越乱&#xff0c;bug不断。 最终代码跑起来看似没有问题(有可能也真的没有问题)&#xff0c;但…

清越 peropure·AI 国内版ChatGP新功能介绍

当OpenAI发布ChatGPT的时候,没有人会意识到,新一代人工智能浪潮将给人类社会带来一场眩晕式变革。其中以ChatGPT为代表的AIGC技术加速成为AI领域的热门发展方向,推动着AI时代的前行发展。面对技术浪潮,清越科技(PeroPure)立足多样化生活场景、精准把握用户实际需求,持续精确Fin…

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …

255:vue+openlayers 加载tomtom地图(多种形式)

第255个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

vue3和vite项目在scss中因为本地图片,不用加~

看了很多文章说要加~&#xff0c;真的好坑哦&#xff0c;我的加了~反而出不来了&#xff1a; 304 Not Modified 所以需要去掉~&#xff1a; /* 默认dark主题 */ :root[themered] {--bg-color: #0d1117;--text-color: #f0f6fc;--backImg: url(/assets/images/redBg.png); }/* …

鸿蒙开发踩坑之dataPreferences数据存储后获取为空

问题 在开发中通过PreferencesUtil.setValue(name, 旺财)设置后&#xff0c;通过IDE运行App后获取之前存储的数据都为空。 问题原因 查看控制台&#xff0c;发现如下&#xff1a; $ hdc shell am force-stop com.happy.xxx $ hdc shell bm uninstall com.happy.xxx$ hdc fi…

Java PDFBox 提取页数、PDF转图片

PDF 提取 使用Apache 的pdfbox组件对PDF文件解析读取和转图片。 Maven 依赖 导入下面的maven依赖&#xff1a; <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version> &l…

数据结构之二叉树的遍历

数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0c;分析和研究计算机加工的数据的特性&#xff0c;以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法…

SpringBoot+Email发送邮件

引言 邮件通知是现代应用中常见的一种通信方式&#xff0c;特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能&#xff0c;使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送&#xf…

【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、std::shared_ptr的循环引用1. 概念2. 示例分析 二、std::weak_ptr1. 简介2. weak_ptr模板类提供的成员方法3. 使用示例&#xff08;1&#xff09;weak_ptr指针的创建&#xff08;2&#xff09;完整示例&#xff08;解决上面循环引用问题&#xff09; 4. C模拟…

微信小程序(九)轮播图

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.轮播容器的基本属性 2.轮播图片的尺寸处理 index.wxml <view class"navs"><text class"active">精选</text><text>手机</text><text>食品</text…

应用案例:Ruff工业设备数据采集,为生产制造企业数字化转型赋能

导读&#xff1a;某金属材料生产制造企业&#xff0c;引进了整套Ruff数据采集方案&#xff0c;将Ruff网关采集到的PLC数据接入到Ruff IoT管理云平台&#xff0c;帮助客户实现覆盖全厂区、车间所有设备的数字化、可视化管理&#xff0c;避免了意外停机风险&#xff0c;IT运维工作…

C# 实现 Word 加盖骑缝章效果

目录 实现效果 范例运行环境 Office DCOM 配置 设计实现 创建stamp图章类 电子章图片的计算与定位 旋转图片方法 总结 实现效果 在OA的自动化处理系统中&#xff0c;通过审批的最终节点&#xff0c;可能会对WORD文件加盖电子章&#xff0c;比如定位带有指定文字的Ra…

洛谷刷题-【入门2】分支结构

目录 1.苹果和虫子 题目描述 输入格式 输出格式 输入输出样例 2.数的性质 题目描述 输入格式 输出格式 输入输出样例 3.闰年判断 题目描述 输入格式 输出格式 输入输出样例 4.apples 题目描述 输入格式 输出格式 输入输出样例 5.洛谷团队系统 题目描述 …

MySQL(基础篇)——SQL

一.SQL分类 二.DDL(数据定义语言) 1.DDL——数据库操作 ① 查询 查询所有数据库 SHOW DATABASES 查询当前所处数据库 SELECT DATABASE() ② 创建 CREATE DATABASE [IF NOT EXISTS] 数据库名(通常以db结尾) [DEFAULT CHARSET 字符集] [COLLATE 排序规则] ③ …

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 &#xff08;一&#xff09;.信息安全概述 &#xff08;二&#xff09;.防火墙组网

第04章_IDEA的安装与使用(上)(认识,卸载与安装,JDK相关设置,详细设置,工程与模块管理,代码模板的使用)

文章目录 第04章_IDEA的安装与使用&#xff08;上&#xff09;本章专题与脉络1. 认识IntelliJ IDEA1.1 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA的主要优势&#xff1a;(vs Eclipse)1.4 IDEA 的下载 2. 卸载与安装2.1 卸载过程2.2 安装前的准备2.3 安装过程2.4 注册2…

逻辑回归中的损失函数梯度下降

一、引言 逻辑回归中的损失函数通常采用的是交叉熵损失函数&#xff08;cross-entropy loss function&#xff09;。在逻辑回归中&#xff0c;我们通常使用sigmoid函数将线性模型的输出转换为概率值&#xff0c;然后将这些概率值与实际标签进行比较&#xff0c;从而计算损失。 …

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

文章目录 第 2章感知机2.1 感知机模型2.2 感知机学习策略2.2.1 数据集的线性可分性2.2.2 感知机学习策略 2.3 感知机学习算法2.3.1 感知机学习算法的原始形式2.3.2 算法的收敛性2.3.3 感知机学习算法的对偶形式 实践&#xff1a;二分类模型&#xff08;iris数据集&#xff09;数…