数据结构——顺序表(C语言)
目录
一、顺序表概念
二、顺序表分类
1.静态顺序表
2.动态顺序表
三、顺序表的实现
1.顺序表的结构体定义
2. 顺序表初始化
3.顺序表销毁
4.顺序表的检验
5.顺序表打印
6.顺序表扩容
7.顺序表尾插与头插
8.尾删与头删
9.在pos处插入数据
10.在pos处删除数据
11.查找数据
四、全部文件及测试结果
一、顺序表概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。
顺序表:可动态增长的数组,要求数据是连续存储的
二、顺序表分类
1.静态顺序表
概念:使⽤定⻓数组存储元素
2.动态顺序表
使用动态开辟的数组存储元素
动态顺序表可根据我们的需要分配空间大小
size 表示当前顺序表中已存放的数据个数
capacity 表示顺序表总共能够存放的数据个数
我们现在是明白了动态顺序表和动态,那我们在用代码实现顺序表时会用那种呢?相信大家此时都已经有了答案,答案很显然是动态顺序表。因为动态顺序表比静态顺序表更加的灵活,不会那么死板,好话不多说,咱们一起来实现吧!
三、顺序表的实现
1.顺序表的结构体定义
这里说明一下:数据结构这方面主要是:数组、指针、结构体这方面内容,因此数据结构可以让我们更好的理解以上内容。
我们实现顺序表一共会用两个源文件和一个头文件,具体为什么,扫雷里说过可自行查阅。
typedef int seqlist;//大家可想一想把int 命名成seqlist的好处
typedef struct Seqlist
{seqlist* a;int size;//有效数据个数int capacity;//总容量
}sl;//结构体命名
2. 顺序表初始化
当我们拥有了一个顺序表我们必然要对其初始化。
void SLInit(SL* ps)
{ps->a = NULL;//初始化把指针置为空ps->capacity = ps->size = 0;//元素个数均为零
}
3.顺序表销毁
既然把顺序表初始化了,必然要对其销毁
void SLDestroy(SL* ps)
{free(ps->a);//顺序表在后续会使用内存函数需free释放ps->a = NULL;ps->capacity = ps->size = 0;
}
4.顺序表的检验
记住写出一个函数就要对其进行检验。
void test1()
{void SLInit(SL * ps);void SLDestroy(SL * ps);
}
当我们写出此代码时会报错,这是为什么呢?答案是test文件中只包含了头文件的,没包含源文件的(源文件相互包含会报错),这时我们添加以下代码即可:
SL ps;
这个时候我们进行调试即可。
5.顺序表打印
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d", ps->a[i]);}peintf("\n");
}
6.顺序表扩容
众所周知顺序表有这四大功能:增删查改,要进行第一个功能便要对顺序表经行扩容。
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int newcapacity = ps->capacity > 0 ? 2 * ps->capacity : 4;//这里使用了三目操作符//定义一个变量来接收,出第一次外每次扩容二倍//为什么是二倍这里不过多推理,可自行了解SL* p = (SL *)realloc(ps->a, newcapacity*sizeof(seqlist));if (p == NULL){printf("扩容失败\n");exit(1);}ps->a = p;ps->capacity = newcapacity;}
}
大家可自行对其检验,这里不再进行。
7.顺序表尾插与头插
接下来实现顺序表增这个功能:
尾插:
void SLPushBack(SL* ps, seqlist x)
{SLCheckCapacity(ps);//检验元素是否满ps->a[ps->size++] = x;//也可采取以下这种//ps->a[pa->size]=x; //ps->size++;
}
头插:
void SLPushFront(SL* ps, seqlist x)
{SLCheckCapacity(ps);//检验元素是否满for (int i = ps->size-1; i >0; i--){ps->a[i+1] = ps->a[i];}ps->size++;ps->a[0] = x;
}
8.尾删与头删
尾删:
void SLPopBack(SL* ps)
{assert(ps);ps->size--;
}
头删:
void SLPopFront(SL* ps)
{assert(ps);for (int i = 1; i < ps -> size; i--){ps->a[i-1] = ps->a[i];}ps->size--;
}
9.在pos处插入数据
void SLInsert(SL* ps, int pos, seqlist x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size-1; i >= pos; i--){ps->a[i+1] = ps->a[i];}ps->a[pos] = x;ps->size++;
}
10.在pos处删除数据
void SLErase(SL* ps, int pos)
{assert(pos >= 0 && pos < ps->size && ps);for (int i = pos+1; i < ps->size-1; i++){ps->a[i-1] = ps->a[i];}ps->size--;
}
11.查找数据
int SLFind(SL* ps, seqlist x)
{assert(ps);for (int i = 0; i < ps->size - 1; i++){if (ps->a[i] == x){printf("找到了,下标为: %d \n", i + 1);return i;}}printf("没找到\n");return -1;
}
四、全部文件及测试结果
seqlist.h:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int seqlist;//大家可想一想把int 命名成seqlist的好处
typedef struct Seqlist
{seqlist* a;int size;//有效数据个数int capacity;//总容量
}SL;
void SLInit(SL* ps);//顺序表初始化
void SLDestroy(SL* ps);//顺序表销毁
void SLPrint(SL* ps);//顺序表打印
void SLCheckCapacity(SL* ps);//顺序表扩容
void SLPushBack(SL* ps, seqlist x);//尾插
void SLPopBack(SL* ps);//尾删
void SLPushFront(SL* ps, seqlist x);//头插
void SLPopFront(SL* ps);//头删
void SLInsert(SL* ps, int pos, seqlist x);//特定位置插入数据
void SLErase(SL* ps, int pos); //特定位置删除数据
int SLFind(SL* ps, seqlist x);//查找数据
seqlist.c:
#include"seqlist.h"
void SLInit(SL* ps)
{ps->a = NULL;//初始化把指针置为空ps->capacity = ps->size = 0;//元素个数均为零
}
void SLDestroy(SL* ps)
{free(ps->a);//顺序表在后续会使用内存函数需free释放ps->a = NULL;ps->capacity = ps->size = 0;
}
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d", ps->a[i]);}peintf("\n");
}
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int newcapacity = ps->capacity > 0 ? 2 * ps->capacity : 4;//这里使用了三目操作符//定义一个变量来接收,出第一次外每次扩容二倍//为什么是二倍这里不过多推理,可自行了解SL* p = (SL *)realloc(ps->a, newcapacity*sizeof(seqlist));if (p == NULL){printf("扩容失败\n");exit(1);}ps->a = p;ps->capacity = newcapacity;}
}
void SLPushBack(SL* ps, seqlist x)
{SLCheckCapacity(ps);//检验元素是否满ps->a[ps->size++] = x;//也可采取以下这种//ps->a[pa->size]=x; //ps->size++;
}
void SLPushFront(SL* ps, seqlist x)
{SLCheckCapacity(ps);//检验元素是否满for (int i = ps->size-1; i >0; i--){ps->a[i+1] = ps->a[i];}ps->size++;ps->a[0] = x;
}
void SLPopBack(SL* ps)
{assert(ps);ps->size--;
}
void SLPopFront(SL* ps)
{assert(ps);for (int i = 1; i <ps->size; i--){ps->a[i-1] = ps->a[i];}ps->size--;
}
void SLInsert(SL* ps, int pos, seqlist x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size-1; i >= pos; i--){ps->a[i+1] = ps->a[i];}ps->a[pos] = x;ps->size++;
}
void SLErase(SL* ps, int pos)
{assert(pos >= 0 && pos < ps->size && ps);for (int i = pos+1; i < ps->size-1; i++){ps->a[i-1] = ps->a[i];}ps->size--;
}
int SLFind(SL* ps, seqlist x)
{assert(ps);for (int i = 0; i < ps->size - 1; i++){if (ps->a[i] == x){printf("找到了,下标为: %d \n", i + 1);return i;}}printf("没找到\n");return -1;
}
test.c:
#include"seqlist.h"
void menu()
{printf("***********************\n");printf("**1.尾插 2.尾删****\n");printf("**3.头插 4.头删****\n");printf("**5.固定插入 6.固定删除\n");printf("**7.查找 0.删除顺序表\n");printf("**0.销毁并退出*********\n");
}
int main()
{SL ps;SeqListInit(&ps);SeqListPushBack(&ps, 4);SeqListPushBack(&ps, 5);SeqListPushBack(&ps, 6);SeqListPushFront(&ps, 3);SeqListPushFront(&ps, 2);SeqListPushFront(&ps, 1);SeqListPrint(&ps);//顺序表初始化int input;do {menu();printf("please input your choice:");scanf("%d", &input);Seqlist x;int pos;int find;int getfind;switch (input)//顺序表输入测试{case 0:SeqListDestroy(&ps);break;case 1:scanf("%d", &x);SeqListPushBack(&ps, x);SeqListPrint(&ps);break;case 2:SeqListPopBack(&ps);SeqListPrint(&ps);break;case 3:scanf("%d", &x);SeqListPushFront(&ps, x);SeqListPrint(&ps);break;case 4:SeqListPopFront(&ps);SeqListPrint(&ps);break;case 5:scanf("%d", &pos);scanf("%d", &x);SeqListInsert(&ps, pos, x);SeqListPrint(&ps);break;case 6:scanf("%d", &pos);SeqListErase(&ps, pos);SeqListPrint(&ps);break;case 7:scanf("%d", &find);getfind = SeqListFind(&ps, find);printf("%d", getfind);printf("\n");break;default:printf("error input\n");break;}} while (input);return 0;
}
完!
相关文章:
数据结构——顺序表(C语言)
目录 一、顺序表概念 二、顺序表分类 1.静态顺序表 2.动态顺序表 三、顺序表的实现 1.顺序表的结构体定义 2. 顺序表初始化 3.顺序表销毁 4.顺序表的检验 5.顺序表打印 6.顺序表扩容 7.顺序表尾插与头插 8.尾删与头删 9.在pos处插入数据 10.在pos处删除数据 11.查找数据 …...
利用Idea实现Ajax登录(maven工程)
一、新建一个maven工程(不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客),工程目录如图 js文件可以上up网盘提取 链接:https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…...
环信IM集成教程——Web端UIKit快速集成与消息发送
写在前面: 千呼万唤始出来,环信Web端终于出UIKit了!🎉🎉🎉 文档地址:https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…...
Anaconda如何切换国内镜像源
一、anaconda如何切换阿里镜像源 在Anaconda中切换到阿里云镜像源可以通过以下步骤进行: 1、打开终端(Windows)或者命令行界面(macOS/Linux)。 2、执行以下命令来配置阿里云镜像源: conda config --add…...
Android 14.0 添加自定义服务,并生成jar给第三方app调用
1.概述 在14.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 …...
解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题
开发产品时采用了沁恒ch592,做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题,可以正常使用。 如果接入某些特定方案的USB Hub(例如GL3510、GL3520),可能会出现以下2种情况…...
nvm保姆级安装使用教程
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 开发环境篇 ✨特色专栏: M…...
大语言模型LLM《提示词工程指南》学习笔记02
文章目录 大语言模型LLM《提示词工程指南》学习笔记02设计提示时需要记住的一些技巧零样本提示少样本提示链式思考(CoT)提示自我一致性生成知识提示 大语言模型LLM《提示词工程指南》学习笔记02 设计提示时需要记住的一些技巧 指令 您可以使用命令来指…...
【realme x2手机解锁BootLoader(简称BL)】
realme手机解锁常识 https://www.realme.com/cn/support/kw/doc/2031665 realme手机解锁支持型号 https://www.realmebbs.com/post-details/1275426081138028544 realme x2手机解锁实践 参考:https://www.realmebbs.com/post-details/1255473809142591488 1 下载apk…...
攻防世界 wife_wife
在这个 JavaScript 示例中,有两个对象:baseUser 和 user。 baseUser 对象定义如下: baseUser { a: 1 } 这个对象有一个属性 a,其值为 1,没有显式指定原型对象,因此它将默认继承 Object.prototype。 …...
Visual Studio安装下载进度为零已解决
因为在安装pytorch3d0.3.0时遇到问题,提示没有cl.exe,VS的C编译组件,可以添加组件也可以重装VS。查了下2019版比2022问题少,选择了安装2019版,下面是下载安装时遇到的问题记录,关于下载进度为零网上有三类解…...
矩阵空间秩1矩阵小世界图
文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算,矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵,所以为6维矩阵空间上三角矩阵-子空间-有6个3…...
《QT实用小工具·十三》FlatUI辅助类之各种炫酷的控件集合
1、概述 源码放在文章末尾 FlatUI辅助类之各种炫酷的控件集合 按钮样式设置。文本框样式设置。进度条样式。滑块条样式。单选框样式。滚动条样式。可自由设置对象的高度宽度大小等。自带默认参数值。 下面是demo演示: 项目部分代码如下所示: #ifnd…...
dm8 备份与恢复
dm8 备份与恢复 基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…...
Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )
在项目原有vue(例如首页)基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…...
ASTM C1186-22 纤维水泥平板
以无石棉类无机矿物纤维、有机合成纤维或纤维素纤维,单独或混合作为增强材料,以普通硅酸盐水泥或水泥中添加硅质、钙质材料代替部分水泥为胶凝材料,经制浆、成型、蒸汽或高压蒸汽养护制成的板材,俗称水泥压力板。 ASTM C1186-22纤…...
NoSQL概述
NoSQL概述 目录 一、为什么用NoSQL 二、什么是NoSQL 三、经典应用分析 四、N o S Q L 数 据 模 型 简 介 五、NoSQL四大分类 六、CAP BASE 一、为什么用NoSQL 1、单机MySQL的美好年代 在90年代,一个网站的访问量一般不大,用单个数据库完全可以轻松应…...
爬虫实战一、Scrapy开发环境(Win10+Anaconda3)搭建
#前言 在这儿推荐使用Anaconda进行安装,并不推荐大家用pythonpip安装,因为pythonpip的坑实在是太多了。 #一、环境中准备: Win10(企业版)Anaconda3-5.0.1-Windows-x86_64,下载地址,如果打不开…...
llama.cpp运行qwen0.5B
编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…...
【接口】HTTP(3) |GET和POST两种基本请求方法有什么区别
在我面试时,在我招人面试别人时,10次能遇到7次这个问题,我听过我也说回答过: Get: 一般对于从服务器取数据的请求可以设置为get方式 Get方式在传递参数的时候,一般都会把参数直接拼接在url上 Get请求方法…...
金陵科技学院软件工程学院软件工程专业
感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦~~ 感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦~~ 感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦~~ 感兴趣的小伙伴可以私信我哦~~ 是笔者写的各种高质量作业和实验哦…...
Android 关于apk反编译d2j-dex2jar classes.dex失败的几种方法
目录 确认路径正确直接定位到指定目录确定目录正确,按如下路径修改下面是未找到相关文件正确操作 确认路径正确 ,即d2j-dex2jar和classes.dex是否都在一个文件夹里(大部分的情况都是路径不正确) 直接定位到指定目录 路径正确的…...
Django--admin 后台管理站点
Django最大的优点之一,就是体贴的提供了一个基于项目model创建的一个后台管理站点admin。这个界面只给站点管理员使用,并不对大众开放。虽然admin的界面可能不是那么美观,功能不是那么强大,内容不一定符合你的要求,但是…...
JavaScript(六)---【回调、异步、promise、Async】
零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针,函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…...
vue2+elementUi的两个el-date-picker日期组件进行联动
vue2elementUi的两个el-date-picker日期组件进行联动 <template><el-form><el-form-item label"起始日期"><el-date-picker v-model"form.startTime" change"startTimeChange" :picker-options"startTimePickerOption…...
GIN实例讲解
第一个gin程序 package mainimport ("github.com/gin-gonic/gin" )func main() {// 创建一个 Gin 引擎实例r : gin.Default()// 定义一个 GET 请求的路由,当访问 /hello 路径时执行匿名函数r.GET("/hello", func(c *gin.Context) {// 获取查询…...
开源充电桩设备监控系统技术解决方案
开源 | 慧哥充电桩平台V2.5.2(支持 汽车 电动自行车 云快充1.5、云快充1.6 微服务 ) SpringBoot设备监控系统解决方案 一、引言 1.项目背景 随着物联网技术的快速发展,设备的智能化和网络化程度日益提高。在现代工业和信息化的背景下&#x…...
环形链表--极致的简便
一、要求 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…...
WPF中TextWrapping
在 WPF(Windows Presentation Foundation)中,TextWrapping 是一个与文本布局相关的属性,用于控制文本在遇到容器边界时是否自动换行。这个属性常用于文本展示控件,如 TextBlock、TextBox、Label 等,以确保文…...
Win10 下 git error unable to create file Invalid argument 踩坑实录
原始解决方案参看:https://stackoverflow.com/questions/26097568/git-pull-error-unable-to-create-file-invalid-argument 本问题解决于 2024-02-18,使用 git 版本 2.28.0.windows.1 解决方案 看 Git 抛出的出错的具体信息,比如如下都来自…...
服装批发网站建设/沪深300指数是什么意思
psutil模块 1.介绍 psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及…...
义乌开锁做网站哪个好/百度云网盘资源搜索
环境: lnmp,申请了免费的腾讯 ssl 证书, cloudflare 的 crypto 修改 ssl 为 full我的 nginx.conf 配置如下:user www www;worker_processes auto;error_log /home/wwwlogs/nginx_error.log crit;pid /usr/local/nginx/logs/nginx.pid;#Specif…...
北京网站备案拍照地点/怎样制作网站教程
什么是C#中的泛型?(What are generics in C#? [closed])什么是C#中的泛型,用一个简单的例子来说明? 这个主题有哪些相关文章或网站?What are generics in C#, illustrated with a simple example? What a…...
为什么两学一做进不去网站/软文街怎么样
1。在~/.bashrc 的最后加入: ulimit -c unlimited 测了一下,这样对于每个shell都是有效的,可以获取到当机堆栈2。在程序里加入 #include <sys/time.h> #include <sys/resource.h> rlimit sLimit; sLimit.rlim_cur -1; sLimit.…...
武汉网站seo服务/广告网络推广
随着新一轮科技革命浪潮的推进,数据规模呈现爆发式的增长,数据类型愈发丰富,数据应用也在快速深化。值此背景下,数据库的发展呈现出“云原生、国产化、开源共建”三大趋势。 开源代表的是“多方协同、合作共赢、未来共享”的开放…...
网站后台忘记账号密码/网站推广软件ky99
之前一直使用eclipse和myeclipse编辑器,对于idea不太熟悉,听闻周围的前辈说idea用起更方便些,故开始尝试使用idea编辑器,现把我在idea中配置及创建javaweb的一个demo中遇到的问题及解决方案记录下来,供大家参考。1.在i…...