数据结构与算法(2)顺序表的初始化、插入、打印、删除、查找元素——C语言版

目录
1.前言
2.头文件的定义
3.菜单栏的设置
4.顺序表的初始化
5.添加元素
6.打印元素
7.查找元素
8.删除元素
9.插入元素
10.主函数
11.完整的代码实现

1.前言

数据结构包括三个方面

  • 逻辑结构
  • 存储结构
  • 运算

而线性表有两种典型的存储结构

  • 顺序存储结构
  • 链式存储结构

具体关系可参考上一篇博客
https://blog.csdn.net/krotox/article/details/137092821

本节我们学习的是线性表的顺序存储结构

线性表的顺序存储是指使用连续的存储空间,按照数据元素在线性表中的序号依次存储数据元素。
采用这种存储结构的线性表称为:顺序表。
(类似与数组的存储)

主要实现以下目标

  • 初始化顺序表
  • 添加元素
  • 打印元素
  • 查找元素
  • 删除元素
  • 插入元素

2.头文件的定义

#define _CRT_SECURE_NO_WARNINGS//VS2022中防止scanf返回值被忽略
//顺序表操作(顺序表是将所有的元素存放在一个一维数组里面,每个元素都连续存放,但存储方式是随机存放)
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;typedef struct SeqList
{int n;//该长度表示顺序表的实际长度int maxLength;//该长度表示顺序表的最大长度ElemType* element;//表示指针类型(动态分配)//也可表示为:ElemType element [maxLength];(静态分配)
}SeqList;SeqList sq;

2.1函数的声明

void init(SeqList* L, int maxLength);//初始化
void add(SeqList* L);//添加元素
void Print(SeqList* L);//打印元素
void Search(SeqList* L);//查找元素
void Delete(SeqList* L);//删除元素
void Insert(SeqList* L);//插入元素

3.菜单栏的设置

void menu()
{int option;printf("----顺序表的基本操作---\n");printf("----0.初始化顺序表----\n");printf("----1.添加元素--------\n");printf("----2.打印元素--------\n");printf("----3.查找元素--------\n");printf("----4.删除元素--------\n");printf("----5.插入元素--------\n");printf("请输入选择的操作:");scanf_s("%d", &option);switch (option) {case 0:init(&sq, 100);break;case 1:add(&sq);break;case 2:Print(&sq);break;case 3:Search(&sq);break;case 4:Delete(&sq);break;case 5:Insert(&sq);break;default:printf("你选择的菜单项不存在,请重新选择\n");}system("pause");//暂停,不然控制台程序会一闪即过,你来不及看到执行结果//system("cls");清屏
}

4.顺序表的初始化

void init(SeqList* L, int maxLen)
{L->maxLength = maxLen;//指定顺序表的最大长度是maxLenL->n = 0;//顺序表的实际长度为nL->element = (ElemType*)malloc(sizeof(ElemType) * maxLen);if (L->element == NULL)printf("顺序表初始化失败!\n");elseprintf("顺序表初始化成功!\n");
}
  • malloc(m)函数:开辟m字节长度的空间地址,并返回这段空间的首地址

5.添加元素

void add(SeqList* L)
{ElemType x;//定义一个变量存放输入的元素int m;//定义一个变量存放输入元素个数printf("*********添加元素*********\n");printf("请输入要添加元素的个数:");scanf("%d", &m);for (int i = 0; i < m; i++){printf("请输入要添加的元素:");scanf("%d", &x);if (L->n < L->maxLength){L->element[L->n] = x;L->n++;printf("恭喜,添加成功\n");}else if (L->n == L->maxLength){printf("该顺序表已满,无法添加元素\n");}else{printf("添加元素失败\n");}}}

6.打印元素

void Print(SeqList* L)
{ElemType i;printf("*****打印元素*****\n");if (L->n > 0){for (i = 0; i < L->n; i++){printf("%d  ", L->element[i]);}}else{printf("该顺序表是空表,无元素!\n");}
}

7.查找元素

void Search(SeqList* L)
{ElemType i, x;printf("********查找元素********\n");printf("请输入查找元素的位置:\n");scanf("%d", &x);//x是查找元素的位置if (x > L->maxLength || x < 0){printf("输入的位置超过了顺序表的长度\n");}else if (L->element[x] != NULL){printf("您查找的元素是%d", L->element[x-1]);}elseprintf("该顺序表是空表\n");}

8.删除元素

void Delete(SeqList* L)
{int i,k,x,flag=0;printf("********删除元素********\n");printf("请输入要删除元素的个数:");scanf("%d", &x);for(int s=0;s<x;s++){printf("请输入要删除元素的位置:");scanf("%d", &k);if (k < L->n){for (i = k - 1; i < L->n - 1; i++){L->element[i] = L->element[i + 1];//将后面的元素往前面移1位}L->n--;printf("恭喜您,删除成功\n");}else {printf("该位置没有元素,删除失败\n");}}
}

9.插入元素

void Insert(SeqList* L)
{int k;printf("*******插入元素*******\n");printf("请输入要插入的元素个数:\n");scanf("%d", &k);for (int i = 0; i < k; i++){int n;printf("请输入要插入元素的位置:");scanf("%d", &n);if (n<1 || n>L->maxLength){printf("抱歉,该位置超出了顺序表的范围\n");}else if (L->n == L->maxLength){printf("抱歉,顺序表已经溢出了\n");}else if (L->n < L->maxLength && n >= 1 && n <= L->n){printf("请输入要插入的元素:");int m = 0;scanf("%d", &m);int j = 0;for (j = L->n; j >= n; j--){L->element[j] = L->element[j - 1];//将前面的元素往后面移1位}L->element[n - 1] = m;L->n++;printf("恭喜您,插入成功\n");}elseprintf("插入失败\n");}
}

10.主函数

int main()
{while (1){menu();//使程序可以一直进行}return 0;
}

11.完整的代码实现

#define _CRT_SECURE_NO_WARNINGS
//顺序表操作(顺序表是将所有的元素存放在一个一维数组里面,每个元素都连续存放,但存储方式是随机存放)
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;typedef struct SeqList
{int n;//该长度表示顺序表的实际长度int maxLength;//该长度表示顺序表的最大长度ElemType* element;//表示指针类型(动态分配)//也可表示为:ElemType element [maxLength];(静态分配)
}SeqList;SeqList sq;void init(SeqList* L, int maxLength);//初始化
void add(SeqList* L);//添加元素
void Print(SeqList* L);//打印元素
void Search(SeqList* L);//查找元素
void Delete(SeqList* L);//删除元素
void Insert(SeqList* L);//插入元素void menu()
{int option;printf("----顺序表的基本操作---\n");printf("----0.初始化顺序表----\n");printf("----1.添加元素--------\n");printf("----2.打印元素--------\n");printf("----3.查找元素--------\n");printf("----4.删除元素--------\n");printf("----5.插入元素--------\n");printf("请输入选择的操作:");scanf_s("%d", &option);switch (option) {case 0:init(&sq, 100);break;case 1:add(&sq);break;case 2:Print(&sq);break;case 3:Search(&sq);break;case 4:Delete(&sq);break;case 5:Insert(&sq);break;default:printf("你选择的菜单项不存在,请重新选择\n");}system("pause");//暂停,不然控制台程序会一闪即过,你来不及看到执行结果//system("cls");清屏
}void init(SeqList* L, int maxLen)
{L->maxLength = maxLen;L->n = 0;L->element = (ElemType*)malloc(sizeof(ElemType) * maxLen);//malloc(m)函数:开辟m字节长度的空间地址,并返回这段空间的首地址if (L->element == NULL)printf("顺序表初始化失败!\n");elseprintf("顺序表初始化成功!\n");
}void add(SeqList* L)
{ElemType x;//定义一个变量存放输入的元素int m;//定义一个变量存放输入元素个数printf("*********添加元素*********\n");printf("请输入要添加元素的个数:");scanf("%d", &m);for (int i = 0; i < m; i++){printf("请输入要添加的元素:");scanf("%d", &x);if (L->n < L->maxLength){L->element[L->n] = x;L->n++;printf("恭喜,添加成功\n");}else if (L->n == L->maxLength){printf("该顺序表已满,无法添加元素\n");}else{printf("添加元素失败\n");}}}void Print(SeqList* L)
{ElemType i;printf("*****打印元素*****\n");if (L->n > 0){for (i = 0; i < L->n; i++){printf("%d  ", L->element[i]);}}else{printf("该顺序表是空表,无元素!\n");}
}void Search(SeqList* L)
{ElemType i, x;printf("********查找元素********\n");printf("请输入查找元素的位置:\n");scanf("%d", &x);//x是查找元素的位置if (x > L->maxLength || x < 0){printf("输入的位置超过了顺序表的长度\n");}else if (L->element[x] != NULL){printf("您查找的元素是%d", L->element[x-1]);}elseprintf("该顺序表是空表\n");}void Delete(SeqList* L)
{int i,k,x,flag=0;printf("********删除元素********\n");printf("请输入要删除元素的个数:");scanf("%d", &x);for(int s=0;s<x;s++){printf("请输入要删除元素的位置:");scanf("%d", &k);if (k < L->n){for (i = k - 1; i < L->n - 1; i++){L->element[i] = L->element[i + 1];//将后面的元素往前面移1位}L->n--;printf("恭喜您,删除成功\n");}else {printf("该位置没有元素,删除失败\n");}}
}void Insert(SeqList* L)
{int k;printf("*******插入元素*******\n");printf("请输入要插入的元素个数:\n");scanf("%d", &k);for (int i = 0; i < k; i++){int n;printf("请输入要插入元素的位置:");scanf("%d", &n);if (n<1 || n>L->maxLength){printf("抱歉,该位置超出了顺序表的范围\n");}else if (L->n == L->maxLength){printf("抱歉,顺序表已经溢出了\n");}else if (L->n < L->maxLength && n >= 1 && n <= L->n){printf("请输入要插入的元素:");int m = 0;scanf("%d", &m);int j = 0;for (j = L->n; j >= n; j--){L->element[j] = L->element[j - 1];//}L->element[n - 1] = m;L->n++;printf("恭喜您,插入成功\n");}elseprintf("插入失败\n");}
}int main()
{while (1){menu();}return 0;
}

编写程序,实现如下操作:

(1) 从键盘上依次输入 21、18、30、75、42、56,创建顺序表,并输出顺序表中的各元素值。
(2) 分别在顺序表的第 3 个位置和第 9 个位置插入 67 和 10,给出插入成功或失败的信息,并输出顺序表中的各元素值。
(3) 删除顺序表中的第 6 个数据元素和第 8 个数据元素,给出删除成功或失败的信息,并输出顺序表中的各元素值。

运行结果如图所示:
在这里插入图片描述

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

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

相关文章

idea端口占用

报错&#xff1a;Verify the connector‘s configuration, identify and stop any process that‘s listening on port XXXX 翻译&#xff1a; 原因&#xff1a; 解决&#xff1a; 一、重启大法 二、手动关闭 启动spring项目是控制台报错&#xff0c;详细信息如下&#xff…

Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c;赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具&#xff0c;让用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实…

【0day】号卡sql注入

漏洞描述 号卡系统一键即可便捷快速的为您自己打造一个独立的属于你的号卡分销商城。此系统某接口存在SQL注入漏洞。 fofa语句 icon_hash"-795291075" 漏洞复现 构造payload nuclei验证 pocsuite3 验证 verify 验证 attack 验证 github poc总汇地址&#xff1a…

SpringBoot:自定义线程池配置类

文章目录 一、前言二、案例展示1、初始版本2、代码审核意见和优化建议3、潜在问题和风险4、优化建议5、优化后的代码 三、具体使用 一、前言 有时候我们在项目中做一些长链路的跑批任务时&#xff0c;基于Springboot项目的定时任务&#xff0c;我们可以指定一个自定义的线程配…

Python中的全栈开发前端与后端的完美融合【第160篇—全栈开发】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的全栈开发&#xff1a;前端与后端的完美融合 全栈开发已成为当今软件开发领域中的…

华为OD机试 - 查找舆情热词(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/1]

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

HackTheBox-Machines--Topology

文章目录 1 端口扫描2 漏洞探测三 权限提升 Topology 测试过程 1 端口扫描 nmap -sC -sV 10.129.23.122 漏洞探测 端口扫描发现22和80端口&#xff0c;访问80端口&#xff0c;发现LaTeX方程生成器&#xff0c;访问该按钮发现子域&#xff1a; latex.topology.htb。 将域名添加…

超图新建三维数据集继续学习

1 新建三维数据集 之前操作过新建三维数据集&#xff0c;还不熟悉&#xff0c;继续熟悉&#xff1b; 现在有一个文件型的数据源&#xff0c;名为swtest1&#xff1b;它前面小图标上有UDX三个字母&#xff0c;表明这是一个UDX类型的数据源&#xff1b;在此数据源上右击&#x…

SSH端口转发

SSH介绍 SSH通过网络远程访问主机提供保护&#xff0c;可以对客户端和服务端之间的数据传输进行压缩和加密&#xff0c;有身份验证、SCP、SFTP、和端口转发的功能 SSH转发常用的参数介绍&#xff1a; -C请求压缩所有数据-D动态转发、即socks代理-f后台执行SSH指令-g允许远程…

hxp CTF 2021 - A New Novel LFI(新颖的解法)

一、环境 unbentu&#xff0c;docker https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz 二、解析 PHP Filter 当中有一种 convert.iconv 的 Filter &#xff0c;可以用来将数据从字符集 A 转换为字符集 B &#xff0c;其中这两个字符集可以…

蓝桥杯算法题-图形排版

题目描述 小明需要在一篇文档中加入 N 张图片&#xff0c;其中第 i 张图片的宽度是 Wi&#xff0c;高度是 Hi。   假设纸张的宽度是 M&#xff0c;小明使用的文档编辑工具会用以下方式对图片进行自动排版&#xff1a; 1. 该工具会按照图片顺序&#xff0c;在宽度 M 以内&…

企业客户信息反馈平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

《数据结构学习笔记---第九篇》---循环队列的实现

文章目录 1.循环队列的定义 2.循环队列的判空判满 3.创建队列并初始化 4.入队和出队 5. 返回队尾队首元素 6.释放循环队列 1.循环队列的定义 定义&#xff1a;存储队列元素的表从逻辑上被视为一个环。 我们此次实现的循环队列&#xff0c;采用顺序表 typedef struct {int…

Xception模型详解

简介 Xception的名称源自于"Extreme Inception"&#xff0c;它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构&#xff0c;用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…

图像生成:SD lora加载代码详解与实现

文章目录 前言一、SD模型介绍二、模型加载1. 模型架构加载2. safetensors权重加载3. lora权重加载 三、Name匹配四、权重融合1、构建net类2、匹配lora weight和model weight3、基于lora权重创建lora模块4、权重融合 五、整体pipeline总结 前言 SD中lora的加载相信都不陌生&…

VSCode美化

今天有空收拾了一下VSCode&#xff0c;页面如下&#xff0c;个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多&#xff0c;有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网&#xff1a;Maple-Font 我只安装了下图两个字体&#xff0c;使…

Docker部署Nexus Maven私服并且实现远程访问Nexus界面

目录 ⛳️推荐 1. Docker安装Nexus 2. 本地访问Nexus 3. Linux安装Cpolar 4. 配置Nexus界面公网地址 5. 远程访问 Nexus界面 6. 固定Nexus公网地址 7. 固定地址访问Nexus ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&am…

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址&#xff0c;我们通过nginx可以很便捷的将其改为外网访问&#xff0c;但是在外网访问这个地址后&#xff0c…

windows 使用 wsl 安装 linux 子系统

windows 使用 wsl 安装 linux 子系统 介绍使用如何启动设置基本配置安装和配置 SSH 服务 介绍 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软为Windows 10和Windows 11操作系统提供的一个功能&#xff0c;它允许用户在Windows上直接运行GNU/Linux环境。WSL提…