数据结构与算法(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.hqwc.cn/news/578668.html

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

相关文章

提取gdip-yolo与ia-seg中的图像自适应模块进行图像去雾与亮度增强

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

在线随机密码生成器源码

纯HTML&#xff0c;该去的已去掉&#xff0c;该简化的简化&#xff0c;最高支持32位混合随机密码生成。 源码下载&#xff1a;在线随机密码生成器源码

Golang生成UUID

安装依赖 go get -u github.com/google/uuid文档 谷歌UUID文档 示例 函数签名func NewV7() ( UUID ,错误) func (receiver *basicUtils) GenerateUUID() uuid.UUID {return uuid.Must(uuid.NewV7()) } uid : GenerateUUID()

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之RTE模块配置详解(上)

RTE模块配置详解 - 上 一、RTE模块配置实操1.1 打开RTE模块1.2 RTE模块错误消除在这里插入图片描述 这里我们利用工具的自动处理功能。二、Configurator工具Validation总结本节我们就手把手详解RTE配置实现,其实也没有什么过多的操作。。。这个模块更多是工具自动处理的。 一、…

Dockerfile和Docker-compose

一、概述 Dockerfile和Docker Compose是用于构建和管理 Docker 容器的两个工具&#xff0c;但它们的作用和使用方式不同。 Dockerfile Dockerfile 是一个文本文件&#xff0c;用于定义 Docker 镜像的构建规则。它包含一系列指令&#xff0c;如 FROM&#xff08;指定基础镜像…

吴恩达2022机器学习专项课程(一) 4.3 梯度下降的直观理解

问题预览/关键词 本节内容是&#xff1f;J对w求导的含义是&#xff1f;如何确定切线的方向&#xff1f;w在函数J递增处的切线方向是&#xff1f;导数项为正数&#xff0c;w和函数J的关系是&#xff1f;w在函数J递减处的切线方向是&#xff1f;导数项为负数&#xff0c;w和函数…

ES6中的Set集合

Set集合 ES6 提供了新的数据结构Set(集合)。 它类似于数组&#xff0c;但成员的值都是唯一的集合实现了 iterator 接口&#xff0c;所以可以使用「扩展运算符」和[for…of…」进行遍历集合的属性和方法 集合的属性和方法&#xff1a; 1&#xff09;size&#xff0c;返回集合的元…

bizcharts中LineChart时间戳使用moment转化出现Invalid Date

文章目录 一、前言1.1、问题1.2、解决 二、bizcharts三、moment.js四、在线源码五、最后 一、前言 1.1、问题 最近在使用bizcharts绘制折线图LineChart的时候&#xff0c;发现X轴的时间显示成了Invalid Date。如下图所示&#xff1a; 发现是后端返回了时间戳字符串"1572…

matlab 复制点云

目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述

OpenAI发布Voice Engine模型!用AI合成你的声音!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

写作类AI推荐(二)

本章要介绍的写作AI如下&#xff1a; 火山写作 主要功能&#xff1a; AI智能创作&#xff1a;告诉 AI 你想写什么&#xff0c;立即生成你理想中的文章AI智能改写&#xff1a;选中段落句子&#xff0c;可提升表达、修改语气、扩写、总结、缩写等文章内容优化&#xff1a;根据全文…

CTF题型 nodejs(2) Js沙盒vmvm2逃逸原理总结典型例题

CTF题型 nodejs(2) Js沙盒逃逸原理&典型例题 文章目录 CTF题型 nodejs(2) Js沙盒逃逸原理&典型例题一.vm原理以及逃逸1.基本用法2.如何逃逸汇总1)this为对象2)this为null( Object.create(null))a .可用输出直接触发toString方法b.调用属性触发 3)Object.create(null)沙…