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

数据结构——顺序表(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工程&#xff08;不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客&#xff09;&#xff0c;工程目录如图 ​​​​​​​ js文件可以上up网盘提取 链接&#xff1a;https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…...

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面&#xff1a; 千呼万唤始出来&#xff0c;环信Web端终于出UIKit了&#xff01;&#x1f389;&#x1f389;&#x1f389; 文档地址&#xff1a;https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…...

Anaconda如何切换国内镜像源

一、anaconda如何切换阿里镜像源 在Anaconda中切换到阿里云镜像源可以通过以下步骤进行&#xff1a; 1、打开终端&#xff08;Windows&#xff09;或者命令行界面&#xff08;macOS/Linux&#xff09;。 2、执行以下命令来配置阿里云镜像源&#xff1a; conda config --add…...

Android 14.0 添加自定义服务,并生成jar给第三方app调用

1.概述 在14.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 …...

解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题

开发产品时采用了沁恒ch592&#xff0c;做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题&#xff0c;可以正常使用。 如果接入某些特定方案的USB Hub&#xff08;例如GL3510、GL3520&#xff09;&#xff0c;可能会出现以下2种情况&#xf…...

nvm保姆级安装使用教程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…...

大语言模型LLM《提示词工程指南》学习笔记02

文章目录 大语言模型LLM《提示词工程指南》学习笔记02设计提示时需要记住的一些技巧零样本提示少样本提示链式思考&#xff08;CoT&#xff09;提示自我一致性生成知识提示 大语言模型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手机解锁实践 参考&#xff1a;https://www.realmebbs.com/post-details/1255473809142591488 1 下载apk…...

攻防世界 wife_wife

在这个 JavaScript 示例中&#xff0c;有两个对象&#xff1a;baseUser 和 user。 baseUser 对象定义如下&#xff1a; baseUser { a: 1 } 这个对象有一个属性 a&#xff0c;其值为 1&#xff0c;没有显式指定原型对象&#xff0c;因此它将默认继承 Object.prototype。 …...

Visual Studio安装下载进度为零已解决

因为在安装pytorch3d0.3.0时遇到问题&#xff0c;提示没有cl.exe&#xff0c;VS的C编译组件&#xff0c;可以添加组件也可以重装VS。查了下2019版比2022问题少&#xff0c;选择了安装2019版&#xff0c;下面是下载安装时遇到的问题记录&#xff0c;关于下载进度为零网上有三类解…...

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…...

《QT实用小工具·十三》FlatUI辅助类之各种炫酷的控件集合

1、概述 源码放在文章末尾 FlatUI辅助类之各种炫酷的控件集合 按钮样式设置。文本框样式设置。进度条样式。滑块条样式。单选框样式。滚动条样式。可自由设置对象的高度宽度大小等。自带默认参数值。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifnd…...

dm8 备份与恢复

dm8 备份与恢复 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…...

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…...

ASTM C1186-22 纤维水泥平板

以无石棉类无机矿物纤维、有机合成纤维或纤维素纤维&#xff0c;单独或混合作为增强材料&#xff0c;以普通硅酸盐水泥或水泥中添加硅质、钙质材料代替部分水泥为胶凝材料&#xff0c;经制浆、成型、蒸汽或高压蒸汽养护制成的板材&#xff0c;俗称水泥压力板。 ASTM C1186-22纤…...

NoSQL概述

NoSQL概述 目录 一、为什么用NoSQL 二、什么是NoSQL 三、经典应用分析 四、N o S Q L 数 据 模 型 简 介 五、NoSQL四大分类 六、CAP BASE 一、为什么用NoSQL 1、单机MySQL的美好年代 在90年代&#xff0c;一个网站的访问量一般不大&#xff0c;用单个数据库完全可以轻松应…...

爬虫实战一、Scrapy开发环境(Win10+Anaconda3)搭建

#前言 在这儿推荐使用Anaconda进行安装&#xff0c;并不推荐大家用pythonpip安装&#xff0c;因为pythonpip的坑实在是太多了。 #一、环境中准备&#xff1a; Win10&#xff08;企业版&#xff09;Anaconda3-5.0.1-Windows-x86_64&#xff0c;下载地址&#xff0c;如果打不开…...

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两种基本请求方法有什么区别

在我面试时&#xff0c;在我招人面试别人时&#xff0c;10次能遇到7次这个问题&#xff0c;我听过我也说回答过&#xff1a; Get&#xff1a; 一般对于从服务器取数据的请求可以设置为get方式 Get方式在传递参数的时候&#xff0c;一般都会把参数直接拼接在url上 Get请求方法…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...