数据结构之顺序表及其实现!

目录

​编辑

1. 顺序表的概念及结构

2. 接口的实现

2.1 顺序表的初始化

2.2 检查顺序表容量是否已满

2.3 顺序表的尾插

​编辑

2.4 顺序表的尾删

2.5 顺序表的头插

2.6  顺序表的头删

2.7 顺序表在pos位置插入

2.8  顺序表在pos位置删除

2.9 顺序表的查找

2.10 顺序表的销毁

2.11 顺序表的打印

 3. 我在实现顺序表时的测试代码

4. 完结散花


                                            悟已往之不谏,知来者犹可追  

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~

1. 顺序表的概念及结构

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

1. 静态顺序表:用指定长度数组存储元素~

2. 动态顺序表:用动态开辟的数组存储~

2. 接口的实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空 间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间 大小,所以下面我们实现动态顺序表。

我们创建一个Test.h里面包含了所有的接口函数声明和各种头文件的声明~

这样我们一个一个实现,正所谓天下难事必做于细~

#define _CRT_SECURE_NO_WARNINGS
#pragma once//避免头文件的多次包含
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SLDataType;//便于类型的改动//定义一个动态顺序表的结构体变量
typedef struct SeqList
{SLDataType* arr;size_t num;//记录有效数据的个数size_t capacity;//该顺序表的容量大小
}SL;//将该结构体类型重命名为SL//加入增删查改接口//1. 顺序表初始化
void SeqListInit(SL* p);//2. 检查顺序表容量是否已满
void CheckSeqList(SL* p);//3. 顺序表的尾插
void SeqListPushBack(SL* p, SLDataType x);//4. 顺序表的尾删
void SeqListPopBack(SL* p);//5. 顺序表的头插
void SeqListPushFront(SL* p, SLDataType x);//6. 顺序表的头删
void SeqListPopFront(SL* p);//7. 顺序表在pos位置插入
void SeqListInsert(SL* p, size_t pos,SLDataType x);//8. 顺序表在pos位置删除
void SeqListErase(SL* p, size_t pos);//9. 顺序表的查找
int SeqListFind(SL* p,SLDataType x);//如果该数字存在则返回该数字的下标,否则返回-1//10 顺序表的销毁
void SeqListDestory(SL* p);//11. 顺序表的打印
void SeqListPrint(SL* p);

我们将所有函数的实现放在SeqList.c文件中~

2.1 顺序表的初始化

//1. 顺序表初始化
void SeqListInit(SL* p)
{assert(p);//判断指针的有效性p->arr = NULL;p->capacity = 0;p->num = 0;
}

 注意我们这里一定要传址调用~

2.2 检查顺序表容量是否已满

 注释写的很详细了,这里就不做过多的解释~

//2. 检查顺序表容量是否已满
void CheckSeqList(SL* p)
{assert(p);//判断指针的有效性if (p->num == p->capacity){size_t newcapacity=p->capacity == 0 ? p->capacity = 4 : p->capacity * 2;//如果原来没有空间,就给上4,有的话就扩大为原来的两倍SLDataType* ptr = (SLDataType*)realloc(p->arr, newcapacity * sizeof(SLDataType));//动态扩容if (ptr == NULL){perror("realloc fail;");return;}//也可以用assert断言一下p->arr = ptr;//开辟成功将地址传给arrp->capacity = newcapacity;//更新容量}
}

2.3 顺序表的尾插

//3. 顺序表的尾插
void SeqListPushBack(SL* p, SLDataType x)
{assert(p);//判断指针的有效性CheckSeqList(p);//尾插前先判断有没有容量或容量够不够p->arr[p->num] = x;//尾部插入数据p->num++;//有效数加一
}

2.4 顺序表的尾删

//4. 顺序表的尾删
void SeqListPopBack(SL* p)
{assert(p);//判断指针的有效性assert(p->num > 0);//断言存在有效数据p->num--;//尾删一个数据
}

 

2.5 顺序表的头插

//5. 顺序表的头插
void SeqListPushFront(SL* p, SLDataType x)
{assert(p);//判断指针的有效性CheckSeqList(p);//先判断容量是否满了size_t end = p->num;while (end){p->arr[end] = p->arr[end - 1];//整体向后移动end--;}p->arr[0] = x;//头插p->num++;//有效数据加一
}

 

2.6  顺序表的头删

//6. 顺序表的头删
void SeqListPopFront(SL* p)
{assert(p);//判断指针的有效性assert(p->num > 0);//有数据才删除size_t begin = 1;while (begin<p->num){p->arr[begin - 1] = p->arr[begin];//整体向前移动begin++;}p->num--;// 有效数据减一}

 整体往前挪,把头覆盖~

2.7 顺序表在pos位置插入

//7. 顺序表在pos位置插入
void SeqListInsert(SL* p, size_t pos, SLDataType x)
{assert(p);//判断指针的有效性assert(p->num > pos);//pos必须小于num并且大于0CheckSeqList(p);//判断容量是否满了for (int i = p->num; i >pos-1 ; i--){p->arr[i] = p->arr[i - 1];//将pos后面的元素往后挪}p->arr[pos - 1] = x;//在pos位置加入数据p->num++;//有效个数加一
}

 

2.8  顺序表在pos位置删除

//8. 顺序表在pos位置删除
void SeqListErase(SL* p, size_t pos)
{assert(p);//判断指针的有效性assert(p->num > pos);//pos必须小于num并且大于0assert(p->num > 0);//有数据才能删除for (int i = pos; i <p->num; i++){p->arr[i-1] = p->arr[i];//将pos后面的元素往后挪}p->num--;//有效个数减一
}

2.9 顺序表的查找

遍历数组查找~

//9. 顺序表的查找
int SeqListFind(SL* p, SLDataType x)//如果该数字存在则返回该数字的下标,否则返回-1
{assert(p);//断言for (int i = 0; i < p->num; i++){if (p->arr[i] == x){return i;//查到返回下标}}return -1;//没有查到
}

2.10 顺序表的销毁

//10 顺序表的销毁
void SeqListDestory(SL* p)
{assert(p);//判断指针的有效性free(p->arr );//释放动态内存开辟的空间p->arr = NULL;p->capacity = 0;//容量置为0p->num = 0;//有效个数置为0
}

2.11 顺序表的打印

//11. 顺序表的打印
void SeqListPrint(SL* p)
{assert(p);//判断指针的有效性if (p->num == 0){printf("顺序表为空!\n");return;}for (int i = 0; i < p->num; i++){printf("%d ", p->arr[i]);//打印数据}printf("\n");
}

 3. 我在实现顺序表时的测试代码

我创建了一个Test.c来测试各个部分的功能~

#define _CRT_SECURE_NO_WARNINGS
#include"Test.h"void TestSeqList()
{SL s1;SeqListInit(&s1);//初始化SeqListPushBack(&s1, 1);//尾插一个1;SeqListPushBack(&s1, 2);//尾插一个2;SeqListPushBack(&s1, 3);//尾插一个3;SeqListPushBack(&s1, 4);//尾插一个4;SeqListPushBack(&s1, 5);//尾插一个5;SeqListInsert(&s1, 3, 9);//在第三个位置插入9SeqListErase(&s1, 3);//删除第三个位置int ret=SeqListFind(&s1, 3);if (ret != -1)printf("你要查找的数据的下标为:%d\n", ret);elseprintf("抱歉,你要查找的数据没有找到!\n");//SeqListPopBack(&s1);//尾删一个数据//SeqListPushFront(&s1,30);//头插一个数据//SeqListPopFront(&s1);//头删一个数据SeqListPrint(&s1);//打印数据
}int main()
{//测试顺序表TestSeqList();return 0;
}

4. 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270286.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【硬件设计】光耦HCNR200基本原理及应用(资料摘抄)

【仅作自学记录&#xff0c;不出于任何商业目的。如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01;】 本文摘抄翻译自&#xff1a; https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…

静态住宅代理IP选择攻略

静态住宅代理IP&#xff0c;是一种在网络通信过程中提供固定IP地址的代理服务。与动态代理IP相比&#xff0c;静态代理IP提供的是持久且不变的IP地址。这种稳定性使得静态代理IP在需要长期稳定网络身份的场景中&#xff0c;如跨境电商/社媒养号、网络监控、品牌保护、长期数据爬…

【web安全】实战 批量横扫springboot命令执行漏洞

天命&#xff1a;这次目标批量横扫&#xff0c;但是没完全成功&#xff0c;也没完全失败 步骤1&#xff1a;磨刀准备 这次先针对漏洞来寻找目标&#xff0c;所以寻找这种 springboot 的目标 利用CVE漏洞&#xff0c;进行命令执行攻击 先找靶场训练一波&#xff0c;叠加反弹sh…

惯性导航 | 航迹推算与gazebo仿真

惯性导航 | 航迹推算与gazebo仿真 IMU数据进行短时间航迹推算代码gazebo中进行仿真测试 IMU数据进行短时间航迹推算 代码 声明一个用与 IMU积分的类 &#xff0c;来实现 短时间内的航迹推算 类的名字叫 IMUIntegration 构造函数 有三个变量进行私有变量初始化 重力、初始陀螺…

制作一个简单的HTML个人网页

制作一个简单的HTML个人网页 1.1 硬件1.1.1 一台电脑1.1.2 配置要求 1.2 系统1.3 软件 二、制作一个简单的HTML个人网页1.创建一个HTML网页1.1 新建文本文档1.2 另存文本文档1.3 命名为index.html 2.编写HTML代码2.1 打开HTML2.2 复制HTML代码2.3 粘贴HTML代码2.4 保存HTML 3.预…

Map集合体系——遍历,HashMap,TreeMap,LikedHashMap

认识Map集合 Map集合体系特点 方法 代码示例 package com.zz.Map;import java.util.*;public class Test {public static void main(String args[]){Map<String, Integer> map new HashMap <>();//经典代码&#xff0c;按照键 无序 不重复 无索引map.put("…

阻塞队列、生产者消费者模型、阻塞队列的模拟实现等干货

文章目录 &#x1f490;生产者消费者模型&#x1f490;模拟实现阻塞队列&#x1f4a1;注意点一&#x1f4a1;注意点二 阻塞队列是一种“特殊”的数据结构&#xff0c;但是也遵循队列的“先进先出”特性&#xff0c;它的特殊在于&#xff1a; 阻塞队列的两个特性&#xff1a; 1…

学习基于 JavaScript 语言 的计算机界三大神书”之一 ——SICP

如何阅读“计算机界三大神书”之一 ——SICP 《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算…

C switch 语句

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case&#xff0c;且被测试的变量会对每个 switch case 进行检查。 语法 C 语言中 switch 语句的语法&#xff1a; switch(expression){case constant-expression :statement(s);break; /* 可选的 */ca…

【小白友好】LeetCode 打家劫舍 III

https://leetcode.cn/problems/house-robber-iii/description/ 前言 建议还是先看看动态规划的基础题再看这个。动态规划是不刷题&#xff0c;自己100%想不出来的。 基础题&#xff1a; 最大子数组和乘积最大子数组最长递增子序列 最大升序子数组和 小白想法 现在我们想遍…

前端语义化标签及实例

常用的语义化标签的以下几种&#xff1a; header、nav、article、section、aside、footer、abbr、dfn、address、del、ins、pre、meter、progress <header> 定义文章的页眉信息 <header><h1>我的网站标题</h1><nav><ul><li><a …

[GYCTF2020]EasyThinking --不会编程的崽

看标题就知道&#xff0c;这大概率是关于thinkphp的题目。先尝试错误目录使其报错查看版本号 thinkphp v6.0.0&#xff0c;在网上搜索一下&#xff0c;这个版本有一个任意文件上传漏洞。参考以下文章。 https://blog.csdn.net/god_zzZ/article/details/104275241 先注册一个账…

【Android】位置修改相关

获取位置服务总开关状态 //获取LOCATION_MODE值&#xff0c;但adb状态下无法获取 //0为关闭&#xff0c;1 gps、2 network、3 高精度等 int state Settings.Secure.getInt(mContext.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_HIGH_…

three.js可以对3D模型做什么操作和交互,这里告诉你。

Three.js 提供了多种交互功能&#xff0c;可以对 3D 模型进行各种操作和交互。以下是一些常见的交互功能&#xff1a; 鼠标交互 通过鼠标事件&#xff0c;可以实现模型的拖拽、旋转、缩放等操作。例如&#xff0c;可以通过鼠标拖拽来改变模型的位置或角度。 触摸交互 对于支…

PackagesNotFoundError:学习利用报错信息找到解决方法

反思&#xff1a;之前看到报错经常是直接复制报错信息去网上搜&#xff0c;但很多情况下报错信息里其实就给出了解决方案 报错信息&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: unsuccessful initial attempt using frozen …

MySQL 篇-深入了解多表设计、多表查询

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多表设计概述 1.1 多表设计 - 一对多 1.2 多表设计 - 一对一 1.3 多表设计 - 多对多 2.0 多表查询概述 2.1 多表查询 - 内连接 2.2 多表查询 - 外连接 2.3 多表查…

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…

【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容 指针2.0 传值调用与传址调用传值调用传址调用 一维数组与指针理解数组名使用指针深入理解一维数组 二级指针指针数组二维数组与指针 传值调用与传址调用 在开始之前&#xff0c;我们需要先了解这个概念&#xff0c;后面才能够正常的学习…

Material UI 5 学习01-按钮组件

Material UI 5 学习01-按钮组件 一、安装Material UI二、 组件1、Button组件1、基础按钮2、variant属性3、禁用按钮4、可跳转的按钮5、disableElevation属性6、按钮的点击事件onClick 2、Button按钮的颜色和尺寸1、Button按钮的颜色2、按钮自定义颜色3、Button按钮的尺寸 3、图…

vulhub中ThinkPHP5 SQL注入漏洞 敏感信息泄露

漏洞原理 传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c;在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码 启动后&#xff0c;访问http://your-ip/index.php?ids[]1&ids[]2…