【数据结构】 顺序表的基本操作 (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斯金纳&…

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;并在一场巨大…

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

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

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

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

php基础学习之变量

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

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…

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

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

python写完程序怎么运行

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

Spring MVC的原理

Spring MVC中的MVC即模型-视图-控制器&#xff0c;该框架围绕一个DispatcherServlet设计而成&#xff0c;DispatcherServlet会把请求分发给各个处理器&#xff0c;并支持可配置的处理器映射和视图渲染等功能。Spring MVC的具体工作流程如下&#xff1a; &#xff08;1&#xff…

微服务不死 — 共享变量在策略引擎项目的落地详解

01 背景 1、共享变量的提出 前段时间&#xff0c;来自亚马逊 Prime Video 团队的一个案例研究在开发者社区中掀起了轩然大波。大体是这样一件事&#xff0c;作为一个流媒体平台&#xff0c;Prime Video每天都会向客户提供成千上万的直播流。为了确保客户无缝接收内容&#xff0…

【动态规划】【数学】【C++算法】805 数组的均值分割

作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 动态规划 数学 805 数组的均值分割 给定你一个整数数组 nums 我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中&#xff0c;使得 A 数组和 B 数组不为空&#xff0c;并且 average(A) average(B)…

Java基础(2)

一 String、StringBuffer、StringBuilder String 为什么要设计成不可变的&#xff1f; String是不可变的&#xff08;修改String时&#xff0c;不会在原有的内存地址修改&#xff0c;而是重新指向一个新对象&#xff09;&#xff0c;String用final修饰&#xff0c;不可继承&…

两个bbox的IoU计算步骤分析

IoU&#xff1a;交并比&#xff0c;数值上等于交集面积除以并集面积。 两个bbox的位置关系无外乎以上三种情况&#xff1a;&#xff08;1&#xff09;部分相交。&#xff08;2&#xff09;不相交。&#xff08;3&#xff09;包含。 计算步骤&#xff1a; 计算交集&#xff08…

操作系统-操作系统引导(磁盘 操作系统引导过程)

文章目录 总览一个刚买来的磁盘&#xff08;硬盘&#xff09;往磁盘安装操作系统后操作系统引导过程例&#xff1a;windows操作系统的初始化程序 总览 一个刚买来的磁盘&#xff08;硬盘&#xff09; 此时空空如也 往磁盘安装操作系统后 操作系统在C盘 主引导记录不属于某…

java idea 中的 Scratches and Consoles

IDEA 中&#xff0c;"Scratches and Consoles" 是一个用于临时代码编辑和交互式开发的工具窗口&#xff0c;作用如下&#xff1a;Scratches&#xff08;草稿&#xff09;&#xff1a;Scratches 是一个用于临时编写和运行代码片段的工具&#xff0c;你可以在其中创建临…

Python基础第四篇(Python函数)

文章目录 一、函数介绍二、函数的定义三、函数的参数与返回值四、函数说明文档五、函数的嵌套六、变量域七、函数案例1.源代码2.读出结果 在程序设计领域&#xff0c;函数成为一个不可或缺的角色&#xff0c;它们为我们提供了精练、高效和易于管理的编程方式。本篇博客将带您深…

无人机航迹规划(四):七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖…

【JavaEE】_网络编程基础

目录 1. 网络编程基础 1.1 网络编程定义 1.2 网络编程中的基本概念 1.2.1 API 1.2.2.发送端和接收端 1.2.3 请求和响应 1.2.4 客户端和服务端 2. Socket 套接字 2.1 概念 2.2 分类 3. UDP数据报套接字编程 3.1 DatagramSocket API 3.1.1 含义 3.1.2 构造方法 3…