顺序表(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属性介…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...