【数据结构】 顺序表的基本操作 (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.mzph.cn/news/637626.shtml

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

相关文章

漫漫数学之旅009

文章目录 经典格言数学习题古今评注拓展学习&#xff08;一&#xff09;大数定理&#xff08;二&#xff09;伯努利级数 经典格言 真正的问题&#xff0c;不在于机器是否思考&#xff0c;而在于人们是否思考。——BF斯金纳&#xff08;B. F. Skinner&#xff09; BF斯金纳&…

ubuntu双屏扩展

nvidia 驱动安装 安装依赖 sudo apt-get update #更新软件列表 sudo apt-get install g gcc make build-essential libc6-dev禁用nouveau sudo vim /etc/modprobe.d/blacklist.conf #在最后添加如下两行&#xff1a;blacklist nouveauoptions nouveau modeset0 #然后更新…

MVC和MVVM区别和VUE关系

MVC&#xff08;Model-View-Controller&#xff09;和 MVVM&#xff08;Model-View-ViewModel&#xff09;是两种常见的前端架构模式&#xff0c;它们的主要区别在于处理业务逻辑和数据操作的方式。 MVC中&#xff0c;View&#xff08;视图&#xff09;可以直接访问Model&…

低代码+物联网: 重塑智慧社区,开启未来生活新纪元

在数字化时代的推动下&#xff0c;人们对于智能化生活的需求不断增长。而作为连接物理世界和数字世界的重要桥梁&#xff0c;物联网技术发挥着至关重要的作用。最近几年&#xff0c;低代码开发平台的兴起更是给物联网应用开发带来了革命性的改变。本文将探讨低代码和物联网的结…

2024首更---Web Service 教程

Web Services 简介 Web Services 可使您的应用程序成为 Web 应用程序。 Web Services 通过 Web 进行发布、查找和使用。 您应当具备的基础知识 在继续学习之前&#xff0c;您需要对下面的知识有基本的了解&#xff1a; HTMLXML 如果您希望首先学习这些项目&#xff0c;请在…

2024年华数杯国际赛A题:放射性废水处理建模 思路模型代码解析

2024年华数杯国际赛A题&#xff1a;放射性废水处理建模&#xff08;Radioactive Wastewater from Japan&#xff09; 一、问题描述 2011年3月&#xff0c;日本东海岸发生了地震&#xff0c;引发了福岛第一核电站事故&#xff0c;导致三个核反应堆熔毁&#xff0c;并在一场巨大…

MySQL部署

1、卸载mariadb rpm -qi mariadb-libs yum remove mysql-libs -y 2、查看操作系统内核版本及硬件架构 uname -a 3、查看glibc版本 ldd --version 4、下载mysql压缩包 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.35-linux-glibc2.17-x86_64.tar 5、解压到/mnt目录…

[java基础揉碎]基本数据类型转换

介绍 当java程序在进行赋值或者运算时&#xff0c;精度小的类型自动转换为精度大的数据类型&#xff0c; 这个就是自动类型转换。 数据类型按精度&#xff08;容量&#xff09;大小排序为: 自动类型转换注意和细节 1.有多种类型的数据混合运算时&#xff0c;系统首先自动…

如何在浏览器上设置 VPN 网络虚拟专用网络

如何在DT浏览器上设置 VPN 网络 虚拟专用网络&#xff08;VPN&#xff09;是一种用公用网络架设专用网络的技术。如何在DT浏览器上设置 VPN 呢&#xff0c;先下载DT浏览器&#xff0c;建议在官方网站下载最新版&#xff0c;安装&#xff0c;在DT浏览器首页点更多&#xff0c;网…

Stable Diffusion中的Embeddings

什么是Embeddings&#xff1f; Embeddings是一种数学技术&#xff0c;它允许我们将复杂的数据&#xff08;如文本或图像&#xff09;转换为数值向量。这些向量是高维空间中的点&#xff0c;可以捕捉数据的关键特征和属性。在文本处理中&#xff0c;例如&#xff0c;embeddings可…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言&#xff0c;动态语言特点是交互性&#xff0c;会有数据的传递&#xff0c;而 PHP作为“中间人”&#xff0c;需要进行数据的传递&#xff0c;传递的前提就是 PHP 能自己存储数据(临时存储) php变量的使用 定义&#xf…

linux系统nginx工具的访问控制

访问控制 nginx访问控制模块基于ip访问控制配置语法 基于用户的信任登录配置文件更改建立登录用户 nginx访问控制模块 基于IP的访问控制&#xff1a;http_access_module 基于用户的信任登录&#xff1a;http_auth_basic_module 两个同时只能开启一个 基于ip访问控制 配置语法 …

HTML以及CSS相关知识总结(一)

近日就开始回顾html和css相关知识啦&#xff0c;并且会学习html5和css3的新知识&#xff0c;以下是我对记忆不太深刻的地方以及新知识点的总结&#xff1a; Web标准&#xff1a; 结构&#xff1a;用于对网页元素进行整理和分类&#xff0c;即HTML 表现&#xff1a;用于设置网页…

使用 Node 创建 Web 服务器

Node.js 提供了 http 模块&#xff0c;http 模块主要用于搭建 HTTP 服务端和客户端&#xff0c;使用 HTTP 服务器或客户端功能必须调用 http 模块&#xff0c;代码如下&#xff1a; var http require(http); 以下是演示一个最基本的 HTTP 服务器架构(使用 8080 端口)&#x…

「最大化最小值」或者「最小化最大值」采样二分

分割数组的最大值 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组。 设计一个算法使得这 k 个子数组各自和的最大值最小 思路&#xff1a;段数分的越多&#xff0c;最大值就越小&#xff0c;从不分段开始找&#xff0c;l为M…

LeetCode 第381场周赛个人题解

目录 100191. 输入单词需要的最少按键次数 I 原题链接 题目描述 思路分析 AC代码 100188. 按距离统计房屋对数目 I 原题链接 题目描述 思路分析 AC代码 100192. 输入单词需要的最少按键次数 II 原题链接 题目描述 思路分析 AC代码 100213. 按距离统计房屋对数目…

Python实现稳健线性回归模型(rlm算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 稳健回归可以用在任何使用最小二乘回归的情况下。在拟合最小二乘回归时&#xff0c;我们可能会发现一些…

python写完程序怎么运行

python有两种运行方式&#xff0c;一种是在python交互式命令行下运行; 另一种是使用文本编辑器直接在命令行上运行。 注&#xff1a;以上两种运行方式均由CPython解释器编译运行。 当然&#xff0c;也可以将python代码写入eclipse中&#xff0c;用JPython解释器运行&#xff0c…

雪花算法回拨问题解决方案

什么是时间回拨问题 雪花算法通过时间来即将作为id的区分标准之一,对于同一台id生成机器,它通过时间和序号保证id不重复当机器出现问题,时间可能回到之前,此时,时间就不能区分又或者因为闰秒的出现,导致时间回拨 如何解决 方法1 直接抛出异常 不管3X721,直接抛出异常将问题…

力扣208题:实现Tire(前缀树)

【题目链接】 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 【解题代码】 public class Trie {public class TireNode {private int level; // 所在层级private boolean end; // 是否为词尾private HashMap<Character, TireNode> nextChs;…