当前位置: 首页 > news >正文

顺序表(C语言版)

 

前言:本篇文章我们来详细的讲解一下顺序的有关知识,这篇文章中博主会以C语言的方式实现顺序表。以及用顺序表去实现通讯录的代码操作。

目录

一.顺序表的概念

二.顺序表的分类

1.静态顺序表

三.动态顺序表的实现 

1.顺序表的初始化

2.顺序表的尾插 

3.顺序表的尾删

4.顺序表的头插 

5.顺序表的头删

6.打印顺行表

7.查找表内元素

​编辑 8.指定位置插入

9.指定位置删除 

10.销毁顺序表

四.顺序表所有实现代码 

五.结言


一.顺序表的概念

在学习顺序表之前我们要了解顺序表的概念:

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删。

笼统的说就是顺序表是一种存储结构,也就是我们所说的数据结构。

那么什么是数据结构呢?

其实我们最早接触到的数据结构就是数组,一种在连续的空间内存储数据的结构。

简单来说存储数据的结构就是数据结构,在日常生活中我们避免不了的要对数据进行增删查改,那么这就要基于我们的数据结构来实现了。

二.顺序表的分类

1.静态顺序表

所谓的静态顺序表就是:使用定长数组存储元素。

也就是使用一个固定的空间来存放。

2.动态顺序表 

所谓的静态顺序表就是:使用动态开辟的数组存储。

在后续的操作中如果空间不够则会扩容。

三.动态顺序表的实现 

动态顺序表就是基于静态顺序表的改造升级款,所以我们只对动态顺序表进行讲解,下面会有代码以及详细的讲解。

1.顺序表的初始化

首先我们需要做好对于我们顺序表的准备工作,以防随机值以及其他意外情况的发生:

void SLinit(SL* sl)
{assert(sl);sl->a = NULL;sl->capacity = sl->size = 0;
}

首先防止的就是向我们的函数传递一个空指针,所以在这里断言一下。

并把我们顺序表的内容进行初始化。、

2.顺序表的尾插 

void SLbackpush(SL* sl, SLType x)
{assert(sl);if (sl->capacity == sl->size){int newcapacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;SLType* temp = (SLType*)realloc(sl->a,sizeof(SLType) * newcapacity);if (temp == NULL){perror("malloc error!");return;}sl->capacity = newcapacity;sl->a = temp;}sl->a[sl->size] = x;sl->size++;
}

在进行插入的同时我们需要进行对空间的判断判断是否还有空间,之后再进行插入。由于我们后续还要进行我们的头插,以及指定位置插入所以我们可以将判断是否还有空间包装成一个函数,方便后续的使用。

void IfCapacity(SL* sl)
{assert(sl);if (sl->capacity == sl->size){int newcapacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;SLType* temp = (SLType*)realloc(sl->a, sizeof(SLType) * newcapacity);if (temp == NULL){perror("malloc error!");return;}sl->capacity = newcapacity;sl->a = temp;}
}
void SLbackpush(SL* sl, SLType x)
{assert(sl);IfCapacity(sl);sl->a[sl->size] = x;sl->size++;
}

就像这样。 

3.顺序表的尾删

void SLbackpop(SL* sl)
{assert(sl);sl->size--;
}

这个就简单很多了,就是将 size-- 这样当插入下一个数据的时候就会将要删除的数据覆盖,以达到尾删的目的。

4.顺序表的头插 

void SLheadpush(SL* sl, SLType x)
{assert(sl);IfCapacity(sl);for (int i = sl->size; i >0; i--){sl->a[i] = sl->a[i - 1];}sl->a[0] = x;sl->size++;
}

与尾删不一样的就是需要将原有的数据像后挪动一格,之后再进行头插也没有什么可以说的。

5.顺序表的头删

void SLhedpop(SL* sl)
{assert(sl);for (int i = 0; i < sl->size-1; i++){sl->a[i] = sl->a[i + 1];}sl->size--;
}

 时我们也只是需要将后面的数据向前挪动一格将第一个数据覆盖即可。

6.打印顺行表

void SLprint(SL* sl)
{assert(sl);for (int i = 0; i < sl->size; i++){printf("%d->", sl->a[i]);}printf("\n");
}

这个就是很简单的打印函数了没有什么好讲的。

7.查找表内元素

int SLfind(SL* sl,SLType x)
{assert(sl);int i = 0;while (sl->a[i]!=x&&i<sl->size){i++;}if (i == sl->size){return 0;}return i;
}

同样这也没有什么好说的遍历顺序表当遇到寻找元素时退出循环,返回元素所在的位置。没有找到则返回0。 

 8.指定位置插入

void Slrandompush(SL* sl, int flag, SLType x)
{assert(sl);assert(flag < sl->size);IfCapacity(sl);for (int i = sl->size; i >= flag; i--){sl->a[i] = sl->a[i - 1];}sl->a[flag] = x;sl->size++;
}

9.指定位置删除 

void SLrandompop(SL* sl, int flag)
{assert(sl);assert(flag < sl->size);for (int i = flag; i < sl->size-1; i++){sl->a[i] = sl->a[i + 1];}sl->size--;
}

10.销毁顺序表

void SLdestory(SL* sl)
{assert(sl);free(sl->a);sl->a = NULL;sl->capacity = 0;sl->size = 0;
}

以防空间的浪费要将使用完的空间free掉。 

四.顺序表所有实现代码 

SL.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>#define CP 20
//typedef int SLType;//typedef strcuct SL
//{
//	SLType* a[CP];
//	int size;
//}SL;
typedef int SLType;typedef struct SL
{SLType* a;int size;int capacity;
}SL;void SLinit(SL* sl);
void SLbackpush(SL* sl, SLType x);
void SLbackpop(SL* sl);
void SLheadpush(SL* sl, SLType x);
void SLhedpop(SL* sl);
void SLprint(SL* sl);
int SLfind(SL* sl,SLType);
void Slrandompush(SL* sl, int flag,SLType x);
void SLrandompop(SL* sl, int flag);
void SLdestory(SL* sl);SL.c
#include"SL.h"void SLinit(SL* sl)
{assert(sl);sl->a = NULL;sl->capacity = sl->size = 0;
}
void IfCapacity(SL* sl)
{assert(sl);if (sl->capacity == sl->size){int newcapacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;SLType* temp = (SLType*)realloc(sl->a, sizeof(SLType) * newcapacity);if (temp == NULL){perror("malloc error!");return;}sl->capacity = newcapacity;sl->a = temp;}
}
void SLbackpush(SL* sl, SLType x)
{assert(sl);IfCapacity(sl);sl->a[sl->size] = x;sl->size++;
}
void SLbackpop(SL* sl)
{assert(sl);sl->size--;
}
void SLheadpush(SL* sl, SLType x)
{assert(sl);IfCapacity(sl);for (int i = sl->size; i >0; i--){sl->a[i] = sl->a[i - 1];}sl->a[0] = x;sl->size++;
}
void SLhedpop(SL* sl)
{assert(sl);for (int i = 0; i < sl->size-1; i++){sl->a[i] = sl->a[i + 1];}sl->size--;
}
void SLprint(SL* sl)
{assert(sl);for (int i = 0; i < sl->size; i++){printf("%d->", sl->a[i]);}printf("\n");
}
int SLfind(SL* sl,SLType x)
{assert(sl);int i = 0;while (sl->a[i]!=x&&i<sl->size){i++;}if (i == sl->size){return 0;}return i;
}
void Slrandompush(SL* sl, int flag, SLType x)
{assert(sl);assert(flag < sl->size);IfCapacity(sl);for (int i = sl->size; i >= flag; i--){sl->a[i] = sl->a[i - 1];}sl->a[flag] = x;sl->size++;
}
void SLrandompop(SL* sl, int flag)
{assert(sl);assert(flag < sl->size);for (int i = flag; i < sl->size-1; i++){sl->a[i] = sl->a[i + 1];}sl->size--;
}
void SLdestory(SL* sl)
{assert(sl);free(sl->a);sl->a = NULL;sl->capacity = 0;sl->size = 0;
}test.c#include "SL.h"void Test()
{SL sl = { 0 };SLbackpush(&sl, 1);SLheadpush(&sl, 0);SLbackpush(&sl, 2);SLbackpush(&sl, 3);SLbackpush(&sl, 4);SLbackpush(&sl, 5);SLprint(&sl);//if (SLfind(&sl, 100))//{//	printf("找到了\n");//}//else//{//	printf("没有找到\n");//}int flag = SLfind(&sl, 4);Slrandompush(&sl, flag, 9);SLprint(&sl);//SLrandompop(&sl, flag);//SLprint(&sl);}
int main()
{Test();return 0;
}

五.结言

这就是我们顺序表的实现内容了,当然还有一些其他的功能,但都是万变不离其中。无非就是插入与删除其中要注意我们元素的位置移动。但有了这些功能对于大部分的问题都可以解决了。

下一篇给大家详细讲解一下基于顺序表对通讯录的实现。

如果有喜欢的大家请一键三连感谢了!!!

看到之后肯定会回的。拜拜了!!!

相关文章:

顺序表(C语言版)

前言&#xff1a;本篇文章我们来详细的讲解一下顺序的有关知识&#xff0c;这篇文章中博主会以C语言的方式实现顺序表。以及用顺序表去实现通讯录的代码操作。 目录 一.顺序表的概念 二.顺序表的分类 1.静态顺序表 三.动态顺序表的实现 1.顺序表的初始化 2.顺序表的尾插…...

Python高质量函数编写指南

The Ultimate Guide to Writing Functions 1.视频 https://www.youtube.com/watch?vyatgY4NpZXE 2.代码 https://github.com/ArjanCodes/2022-funcguide Python高质量函数编写指南 1. 一次做好一件事 from dataclasses import dataclass from datetime import datetimedatacl…...

探索Spring、Spring Boot和Spring Cloud的奇妙关系(二)

本系列文章简介&#xff1a; 在当今快节奏、高竞争的软件开发世界中&#xff0c;构建可靠、高效的应用程序是至关重要的。而Spring框架一直以来都是业界领先的Java开发框架之一&#xff0c;帮助开发者简化了复杂的任务&#xff0c;并提供了丰富的功能和强大的支持。 然而&#…...

Mysql的事务隔离级别以及事务的四大特性。

MySQL 的事务隔离级别是数据库管理系统中的一个重要概念&#xff0c;它决定了事务如何隔离和影响其他并发事务。MySQL 支持四种事务隔离级别&#xff0c;分别是&#xff1a;读未提交&#xff08;READ UNCOMMITTED&#xff09;、读已提交&#xff08;READ COMMITTED&#xff09;…...

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159

先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…...

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度&#xff0c;这两个锁面对锁冲突的态度是相反的。 乐观锁&#xff1a;认为不存在很多的并发操作&#xff0c;因此不需要加锁。悲观锁&#xff1a;认为存在很多并发操作&#xff0c;因此需…...

蓝桥杯备考day2

1.1 map及其函数 map 提供一对一的数据处理能力&#xff0c;由于这个特性&#xff0c;它完成有可 能在我们处理一对一数据的时候&#xff0c;在编程上提供快速通道。map 中的第一 个值称为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff0c;第二个称为该 关…...

Mac电脑安装蚁剑

1&#xff1a; github 下载源码和加载器&#xff1a;https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面&#xff1a;antSword为源码…...

品牌百度百科词条创建多少钱?

百度百科作为国内最具权威和影响力的知识型平台&#xff0c;吸引了无数品牌和企业争相入驻。一个品牌的百度百科词条&#xff0c;不仅是对品牌形象的一种提升&#xff0c;更是增加品牌曝光度、提高品牌知名度的重要途径。品牌百度百科词条创建多少钱&#xff0c;这成为了许多企…...

Linux安装及管理程序

目录 一.Linux应用程序基础 1.应用程序与系统命令的关系 2.典型应用程序的目录结构 3.常见的Linux软件包封装类型 二.RPM 软件包管理工具 1.RPM 软件包管理器 Red-Hat Package Manger 2.RPM软件包 3.RPM命令 三.源代码编译安装 1. yum 软件包管理器&#xff1a; 配…...

Mybatis generate xml 没有被覆盖

添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>...

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#x…...

Unity TextMeshProUGUI 获取文本尺寸·大小

一般使用ContentSizeFitter组件自动变更大小 API 渲染前 Vector2 GetPreferredValues(string text)Vector2 GetPreferredValues(string text, float width, float height)Vector2 GetPreferredValues(float width, float height) 渲染后 Vector2 GetRenderedValues()Vector…...

Sonar下启动发生错误,elasticsearch启动错误

Download | SonarQube | Sonar (sonarsource.com) 1.首先我的sonar版本为 10.4.1 &#xff0c;java版本为17 2.sonar启动需要数据库,我先安装了mysql, 但是目前sonar从7.9开始不支持mysql&#xff0c;且java版本要最少11,推荐使用java17 3.安装postsql,创建sonar数据库 4.启…...

Git常用命令以及异常信息汇总

常用命令&#xff1a; 查看本地分支&#xff1a; git branch 创建一个新仓库 git clone 仓库地址xxxxx cd 目标目录 git switch -c main touch README.md git add README.md git commit -m "add README" git push -u origin main 推送现有文件夹 cd 目标目录 git in…...

解释Python中的RESTful API设计和实现

解释Python中的RESTful API设计和实现 RESTful API&#xff0c;即符合REST&#xff08;Representational State Transfer&#xff0c;表述性状态转移&#xff09;架构风格的Web服务接口&#xff0c;已成为现代Web应用程序通信的标准。Python作为一种灵活且强大的编程语言&…...

一、Nginx部署

Nginx部署 一、Docker部署1.复制Nginx配置文件2.启动Nginx容器 一、Docker部署 1.复制Nginx配置文件 # 1.拉取镜像 docker pull nginx # 2.启动nginx容器 docker run --restartalways --namenginx -p 80:80 -d nginx # 3.宿主机创建挂载目录 mkdir /root/docker/nginx -p # 4…...

C语言基础---指针的基本语法

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实…...

记录--病理切片图像处理

简介 数字病理切片&#xff0c;也称为全幻灯片成像&#xff08;Whole Slide Imaging&#xff0c;WSI&#xff09;或数字切片扫描&#xff0c;是将传统的玻片病理切片通过高分辨率扫描仪转换为数字图像的技术。这种技术对病理学领域具有革命性的意义&#xff0c;因为它允许病理…...

Android使用shape属性绘制边框内渐变色

目录 先上效果图实现方法shape属性介绍代码结果 先上效果图 这是使用AndroidStudio绘制的带有渐变色的边框背景色 实现方法 项目中由于UI设计需求&#xff0c;需要给按钮、控件设置带有背景色效果的。以下是UI效果图。 这里我们使用shape属性来绘制背景效果。 shape属性介…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...