顺序表(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语言版)
前言:本篇文章我们来详细的讲解一下顺序的有关知识,这篇文章中博主会以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的奇妙关系(二)
本系列文章简介: 在当今快节奏、高竞争的软件开发世界中,构建可靠、高效的应用程序是至关重要的。而Spring框架一直以来都是业界领先的Java开发框架之一,帮助开发者简化了复杂的任务,并提供了丰富的功能和强大的支持。 然而&#…...

Mysql的事务隔离级别以及事务的四大特性。
MySQL 的事务隔离级别是数据库管理系统中的一个重要概念,它决定了事务如何隔离和影响其他并发事务。MySQL 支持四种事务隔离级别,分别是:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)…...

人工智能_大模型023_AssistantsAPI_01_OpenAI助手的创建_API的调用_生命周期管理_对话服务创建---人工智能工作笔记0159
先来说一下一些问题: 尽量不要微调,很麻烦,而且效果需要自己不断的去测试. 如果文档中有图表,大量的图片去分析就不合适了. 是否用RAG搜索,这个可以这样来弄,首先去es库去搜能直接找到答案可以就不用去RAG检索了,也可以设置一个分,如果低于60分,那么就可以去进行RAG检索 微…...

锁策略总结
锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度,这两个锁面对锁冲突的态度是相反的。 乐观锁:认为不存在很多的并发操作,因此不需要加锁。悲观锁:认为存在很多并发操作,因此需…...
蓝桥杯备考day2
1.1 map及其函数 map 提供一对一的数据处理能力,由于这个特性,它完成有可 能在我们处理一对一数据的时候,在编程上提供快速通道。map 中的第一 个值称为关键字(key),每个关键字只能在 map 中出现一次,第二个称为该 关…...

Mac电脑安装蚁剑
1: github 下载源码和加载器:https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面:antSword为源码…...

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

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

Mybatis generate xml 没有被覆盖
添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>...

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)
目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre(美客多)于2021年10月18号上线了新预约入仓系统,在MercadoLibre美客多平台上,新入仓预约系统是一项非常重要的功能&#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 ,java版本为17 2.sonar启动需要数据库,我先安装了mysql, 但是目前sonar从7.9开始不支持mysql,且java版本要最少11,推荐使用java17 3.安装postsql,创建sonar数据库 4.启…...
Git常用命令以及异常信息汇总
常用命令: 查看本地分支: 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,即符合REST(Representational State Transfer,表述性状态转移)架构风格的Web服务接口,已成为现代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语言基础---指针的基本语法
概述 内存地址 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。通俗理解,内存就是房间,地址就是门牌号 指针和指针变量 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。指针的实…...

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

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

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...