探索顺序表:数据结构中的秩序之美(c语言实现常见功能接口)

在我们的数据结构探索中,我们已经探讨时间复杂度、空间复杂度。大家可以移步到我的上篇文章:

打开数据结构大门:深入理解时间与空间复杂度

今天,我们将深入研究另一个重要的主题——顺序表

全部的源代码大家可以去我github主页进行浏览:Nerosts/just-a-try: 学习c语言的过程、真 (github.com)


文章目录

    • @[toc]
  • 一.线性表
  • 二.顺序表
    • 2.1概念和结构
    • 2.2项目文件方面规划
    • 2.3基本功能实现
      • 各接口总体一览
      • 初始化、销毁、打印
      • 尾插
      • 头插
      • 头删
      • 尾删
      • 查找
      • 插入
      • 删除
    • 2.4测试

在介绍顺序表前,先来了解一下线性表的概念,后面一段时间讲到的数据结构也都属于线性表。

一.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使

用的数据结构,常见的线性表:顺序表、链表、栈、字符串…

  • 线性表在==逻辑上(我们想象它是)==是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储

顺序表
链表


二.顺序表

2.1概念和结构

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

  1. 静态顺序表:使用定长数组存储元素
#define N 7
typedef int SLDataTypt;
struct SeqList
{int a[N];//数组长度固定int size;//有效数据的个数//因为数组长度固定,也不需要capacity来表示容积
};
  1. 动态顺序表:使用动态开辟的数组存储
typedef int SLDataType;typedef struct SeqList
{SLDataType* a;int size;//the number of valid dataint capacity;//the size of volumetric space
}SL;

2.2项目文件方面规划

请添加图片描述

  • 头文件SquList.h:用来基础准备,顺序表的基本框架,函数的声明
  • 源文件SeqList.h:用来各种接口函数的具体实现
  • 源文件test.h:用来测试功能是否有问题

2.3基本功能实现

各接口总体一览

void SLInit(SL* ps); //初始化
void SLDestroy(SL* ps);//销毁
void SLPrint(SL* ps);//打印void SLPushBack(SL* ps, SLDataType x);//尾插
void SLPushFront(SL* ps, SLDataType x);//头插
void SLPopFront(SL* ps);//头删
void SLPopBack(SL* ps);//尾删// 顺序表查找
int SLFind(SL* ps, SLDataType x);//返回下标索引
// 顺序表在pos位置插入x
void SeqListInsert(SL* ps, int pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SL* ps, int pos);

初始化、销毁、打印

void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->size = ps->capacity = 0;
}void SLDestroy(SL* ps)
{assert(ps);free(ps->a);//pa->a 是realloc动态开辟的ps->a = NULL;ps->size = ps->capacity = 0;
}void SLPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++)//size means the number of valid data{printf("%d ", ps->a[i]);}printf("\n");
}

尾插

void CheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* new = realloc(ps->a,sizeof(SLDataType) * newcapacity);if (new == NULL){perror("realloc");return -1;}ps->a = new;ps->capacity = newcapacity;}
}void SLPushBack(SL* ps, SLDataType x)
{assert(ps);CheckCapacity(ps);//检查此时容积是否存满ps->a[ps->size] = x;ps->size++;
}

SLPushBack函数用于向单链表尾部添加元素

  • 首先使用assert宏判断ps是否为空指针
  • 然后调用CheckCapacity函数检查容量是否已满,若已满则进行扩容操作
  • 接着将元素x添加到单链表数组的末尾,然后更新单链表的大小

CheckCapacity函数用于检查单链表的容量是否已满,如果已满则进行扩容操作

  • 首先使用assert宏判断ps是否为空指针
  • 然后判断如果单链表的大小等于容量,说明已满,需要进行扩容操作。新的容量设置为原容量的两倍,如果原容量为0,则新容量设置为4
  • 然后使用realloc函数重新分配内存,将原数组指针ps->a指向的内存空间扩展到新的容量大小,如果内存分配失败则输出错误信息并返回-1
  • 最后更新ps->a指向新的内存空间,同时更新容量为新的容量值

这两个函数结合起来可以实现向单链表尾部添加元素并在需要时自动扩容的功能

头插

void SLPushFront(SL* ps, SLDataType x) //将所有元素向后迁移一个,把第一个位置空出来
{assert(ps);CheckCapacity(ps);memmove(ps->a + 1, ps->a, sizeof(SLDataType) * ps->size);ps->a[0] = x;ps->size++;
}

函数的作用是将所有元素向后移动一个位置,从而空出第一个位置,然后在第一个位置插入新的元素x

  • 首先使用assert宏判断ps是否为空指针,然后调用CheckCapacity函数检查容量是否已满,若已满则进行扩容操作
  • 接着使用memmove函数将数组中的元素整体向后移动一个位置,从ps->a的位置开始,移动sizeof(SLDataType) * ps->size个字节的数据,移动到ps->a + 1的位置,即每个元素向后移动一个位置。
  • 然后将新元素x插入到第一个位置ps->a[0],并更新单链表的大小

头删

void SLPopFront(SL* ps)//整体向前偏移
{assert(ps);assert(ps->size > 0);//保证有元素来删memmove(ps->a, ps->a+1, sizeof(SLDataType) * ps->size);ps->size--;
}

尾删

void SLPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);ps->size--;
}

查找

int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (x == ps->a[i]){return i;}}return -1;
}

插入

void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);CheckCapacity(ps);memmove(ps->a + pos + 1, ps->a + pos, sizeof(SLDataType) * (ps->size - pos));ps->a[pos] = x;ps->size++;
}

删除

void SeqListErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int start = pos;while (start < ps->size){ps->a[start] = ps->a[start + 1];start++;}ps->size--;
}

2.4测试

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void test1()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);printf("尾插三个:");SLPrint(&s);SLPushFront(&s, 0);SLPushFront(&s, 0);printf("头插2个:");SLPrint(&s);SLPopFront(&s);SLPopFront(&s);printf("头删2个:");SLPrint(&s);SLPopBack(&s);SLPopBack(&s);printf("尾删2个:");SLPrint(&s);SLDestroy(&s);
}int main()
{test1();return 0;
}

结果如下:

请添加图片描述

可见功能都正常运行


这次顺序表的内容就先到这里啦!感谢大家支持

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

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

相关文章

web服务器之——www服务器的基本配置

目录 一、www简介 1、什么是www 2、www所用的协议 3、WEB服务器 4、主要数据 5、浏览器 二、 网址及HTTP简介 1、HTTP协议请求的工作流程 三、www服务器的类型(静态网站&#xff08;HTML&#xff09;&#xff0c; 动态网站(jsp python,php,perl)) 1、 仅提供…

Windows设备管理

1、前言 熟悉Windows系统的都应该使用过设备管理器。设备管理器将操作系统中所有已安装的设备分类展现出来。同时提供了安装、卸载、启用和禁用的功能。 那么&#xff0c;我们应该如何通过C编程的方式实现这种功能呢&#xff1f;答案很简单&#xff0c;那就是使用SetupDi函数族…

Lumerical 选项------superimpose structure

Lumerical 选项------superimpose structure 简介正文 简介 这里给大家介绍一下 Modal analysis 计算中的 superimpose structure 选项的作用。 正文 当我们勾选上 superimpose structure 选项时&#xff0c; 当我们取消勾选时 通过对比我们得到&#xff0c;勾选 superimp…

Windows11环境下配置深度学习环境(Pytorch)

目录 1. 下载安装Miniconda2. 新建Python3.9虚拟环境3. 下载英伟达驱动4. 安装CUDA版Pytorch5. CPU版本pytorch安装 1. 下载安装Miniconda 下载安装包&#xff1a;镜像文件地址 将Miniconda相关路径添加至系统变量的路径中。 打开Anaconda Powershell Prompt&#xff0c;输入…

计算机组成原理-指令系统CISC和RISC

文章目录 总览CISC和RISC 总览 CISC和RISC 存储程序就是用一个电路再加上存储部件构成 可访存指令不同 RISC更自由&#xff0c;因为很多函数没有固定&#xff0c;是自己写的 由于CISC各个指令执行时间不一样&#xff0c;要实现指令流水线比较困难 由于CISC可访存指令没有限制…

游戏、算法竞赛与退役(流水账版)

写在前面 不出意外的话&#xff0c;这东西本该咕到翻年之后再发的&#xff0c;但好像催稿催的有点厉害&#xff0c;于是就找个机会把他写了&#xff08;笑&#xff09; 最初是只想写个算法竞赛退役记的&#xff0c;后面发觉写起来就有点收不住&#xff0c;算法竞赛牵扯到太多…

CSS margin-trim

margin-trim 主角登场主角的局限性兼容性 margin-trim &#x1f9ea;这是一个实验性的属性, 目前仅有 Safari 支持 看这个属性的名字就知道, 外边距修剪. 平常都会遇到一些排版上的问题, 比如垂直排列的元素之间增加下外边距 <div><li>123</li><li>…

JAVA序列化(创建可复用的 Java 对象)

JAVA 序列化(创建可复用的 Java 对象) 保存(持久化)对象及其状态到内存或者磁盘 Java 平台允许我们在内存中创建可复用的 Java 对象&#xff0c;但一般情况下&#xff0c;只有当 JVM 处于运行时&#xff0c;这些对象才可能存在&#xff0c;即&#xff0c;这些对象的生命周期不…

算法竞赛备赛进阶之树形DP训练

目录 1.树的最长路径 2.树的中心 3.数字转换 4.二叉苹果树 5.战略游戏 6.皇宫守卫 树形DP是一种动态规划方法&#xff0c;主要用于解决树形结构的问题。在树形DP中&#xff0c;通常会使用动态规划的思想来求解最优化问题。其核心在于通过不断地分解问题和优化子问题来解决…

2023年国家基地“楚慧杯”网络空间安全实践能力竞赛 Web方向 题解wp

前言&#xff1a;三小时的比赛&#xff0c;和强网同时结束还要当场交wp&#xff0c;汗流浃背&#xff0c;烧起来了啊啊啊啊~ eaaeval 目录扫出备份文件 源码如下 <?php class Flag{public $a;public $b;public function __construct(){$this->a admin;$this->b …

c++字符串和日期基础

一&#xff0c;字母三角形 #include<string> #include<iostream> using namespace std; int main() {int n 0;cin >> n;for (int i 1; i < n; i)//i代表行数{string spacestring(n - i, );//前半部分空格string ch string(2 * i - 1, A i - 1);cout…

工具在手,创作无忧:一键下载安装Auto CAD工具,让艺术创作更加轻松愉悦!

不要再浪费时间在网上寻找Auto CAD的安装包了&#xff01;因为你所需的一切都可以在这里找到&#xff01;作为全球领先的设计和绘图软件&#xff0c;Auto CAD为艺术家、设计师和工程师们提供了无限的创作潜力。不论是建筑设计、工业设计还是室内装饰&#xff0c;Auto CAD都能助…

《Linux C编程实战》笔记:文件属性操作函数

获取文件属性 stat函数 在shell下直接使用ls就可以获得文件属性&#xff0c;但是在程序里应该怎么获得呢&#xff1f; #include<sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *file_name,struct stat *buf); int fstat(i…

【eNSP实验项目】eNSP实验配置项目教程,ensp安装步骤

eNSP安装教程 附安装包 eNSP介绍安装教程1.安装 VirtualBox2.安装 WinPcap3.安装 Wireshark4.eNSP安装 eNSP介绍 eNSP是华为提供的一款功能强大的网络仿真平台&#xff0c;适用于学习、实践和测试企业网络场景&#xff0c;可以帮助用户深入理解网络知识和技术。 eNSP安装,需要…

Tektronix泰克TCP303示波器电流探头

主要特点和优点&#xff1a; ● 交流/直流测量功能 ● DC~100MHz电流探头放大器&#xff08;TCPA300&#xff09;&#xff0c;当使用&#xff1a; - DC~100MHz, 30A DC&#xff08;TCP312&#xff09; - DC~50MHz, 50A DC&#xff08;TCP305&#xff09; - DC~5MHz, 150A DC&a…

关于多重背包的笔记

多重背包可以看作01背包的拓展&#xff0c; 01背包是选或者不选。多重背包是选0个一直到选s个。 for (int i 1; i < n; i) {for (int j m; j > w[i]; --j){f[j] max(f[j], f[j - 1*w[i]] 1*v[i], f[j - 2*w[i]] 2*v[i],...f[j - s*w[i]] s*v[i]);} } 由上述伪代码…

Mybatis-plus是使用,告别繁琐的CRUD编写,自动生成直接使用

目录 一、简介 1. 是什么 2. 特性 3. 框架结构 4. 常用注解 二、搭建使用 1. 依赖 2. 生成器 3. 生成 4. 引用 5. 路径访问 三、测试 四、雪花ID 每篇一获 Mybatis-plus&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;…

VRRP协议

一.基本概念 1.概念 VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。协议版本&#xff1a;VRRPv2&#xff08;常用&#xff09;和VRRPv3&#xff1a;VRRPv2仅适用于…

【基于卷积神经网络的疲劳检测与预警系统的设计与实现】

基于卷积神经网络的疲劳检测与预警系统的设计与实现 引言数据集介绍技术与工具1. OpenCV2. TensorFlow3. 卷积神经网络&#xff08;CNN&#xff09; 系统功能模块1. 视频采集模块2. 图像预处理模块3. 人脸识别模块4. 疲劳程度判别模块5. 报警模块 系统设计创新点1. 实时监测与预…

【LeetCode刷题笔记(6-1)】【Python】【三数之和】【哈希表】【中等】

文章目录 引言三数之和题目描述示例示例1示例2示例3 提示 解决方案1&#xff1a;【三层遍历查找】解决方案2&#xff1a;【哈希表】【两层遍历】结束语 三数之和 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的…