1.顺序表-头插、头删、尾插、尾删

文章目录

  • 简介
    • 1.头插功能
    • 2.头删功能
    • 3.尾插功能
    • 4.尾删功能
    • 5.此程序共包含4个文件,2个.c文件和2个.h文件
      • 5.1 SeqList.h文件
      • 5.2 SeqList.c文件
      • 5.3 test.h文件
      • 5.4 test.c文件
    • 6.测试结果
      • 6.1 测试尾插和尾删的运行结果
      • 6.2 测试头插和头删的运行结果
    • 7.温馨提示

简介

	本文主要介绍顺序表的头插、头删、尾插、尾删,提供全部的.c和.h文件,确保使用者直接复制粘贴到编译器上即可直接运行程序。

1.头插功能

	思路是先找到数组的最后一个元素,然后把元素一个一个都往后挪一位。最后将要插入的数据x放在数组的头的位置。
void SeqListPushFront(SL* ps, SLDataType x)
{/*检查是否扩容*/SeqListCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;return;
}
	检查是否扩容,是在插入元素时,检查数据个数是否超过了最大容量或者是否需要开辟空间,如果是需要进行空间的开辟或扩容。
void SeqListCheckCapacity(SL* ps)
{/*如果没有空间或空间不足,就扩容*/if (ps->capacity == ps->size){int newCapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;SLDataType* temp = (SLDataType*)realloc(ps->a, newCapacity * sizeof(SLDataType));if (NULL == temp){printf("realloc fail!\n");exit(-1);}ps->a = temp;ps->capacity = newCapacity;}return;
}

2.头删功能

	思路是先找到数组的第2个元素,然后从第2个数据开始,每个数据往前挪动一位进行数据覆盖。
void SeqListPopFront(SL* ps)
{assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;return;
}

3.尾插功能

	思路是先检查是否需要扩容,然后将需要插入的数据x直接放到数组的尾部即可。
void SeqListPushBack(SL *ps, SLDataType x)
{/*检查是否扩容*/SeqListCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;return;
}

4.尾删功能

	思路是直接减1有效数据的个数,以此达到删除数组中最后一个元素的目的。
/*尾删*/
void SeqListPopBack(SL* ps)
{assert(ps->size > 0);ps->size--;return;
}

5.此程序共包含4个文件,2个.c文件和2个.h文件

5.1 SeqList.h文件

	文件中包含了函数功能的头文件以及对应的结构体。
#pragma once
#include <stdio.h>
#include <stdlib.h>typedef int SLDataType;	/*存储数据的类型*//*动态顺序表*/
typedef struct SeqList
{SLDataType* a;int size;		/*表示数据中存储了多少个数据*/int capacity;	/*数组实际能存储数据的空间容量是多大*/
}SL;/*接口函数*/
void SeqListInit(SL *ps);
void SeqListPushBack(SL *ps, SLDataType x);		/*尾插*/
void SeqListPopBack(SL *ps);					/*尾删*/
void SeqListPushFront(SL *ps, SLDataType x);	/*头插*/
void SeqListPopFront(SL *ps);					/*头删*/
void SeqListCheckCapacity(SL* ps);				/*检查容量*/
void SeqListFree(SL *ps);						/*释放空间*//*辅助打印函数*/
void SeqListPrint(SL *ps);						/*辅助打印*/

5.2 SeqList.c文件

	文件中包含了功能函数的具体实现方式。
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
#include <assert.h>/*初始化*/
void SeqListInit(SL *ps)
{ps->a = NULL;ps->size = ps->capacity = 0;if ((NULL == ps->a) && (0 == ps->size) && (0 == ps->capacity)){printf("Init Success!\n");}else{printf("Init Fail!\n");}return;
}
/*尾插*/
void SeqListPushBack(SL *ps, SLDataType x)
{/*检查是否扩容*/SeqListCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;return;
}/*尾删*/
void SeqListPopBack(SL* ps)
{assert(ps->size > 0);ps->size--;return;
}/*头插*/
void SeqListPushFront(SL* ps, SLDataType x)
{/*检查是否扩容*/SeqListCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;return;
}/*头删*/
void SeqListPopFront(SL* ps)
{assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;return;
}/*扩容*/
void SeqListCheckCapacity(SL* ps)
{/*如果没有空间或空间不足,就扩容*/if (ps->capacity == ps->size){int newCapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;SLDataType* temp = (SLDataType*)realloc(ps->a, newCapacity * sizeof(SLDataType));if (NULL == temp){printf("realloc fail!\n");exit(-1);}ps->a = temp;ps->capacity = newCapacity;}return;
}/*释放空间*/
void SeqListFree(SL* ps)
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;return;
}/*辅助打印函数*/
void SeqListPrint(SL* ps)
{assert(ps != NULL);int i = 0;for (i = 0; i < (ps->size); i++){printf("a[%d] = %d\n", i, ps->a[i]);}printf("\n");return;
}

5.3 test.h文件

	文件中定义了控制宏的开关,用来测试时方便的控制插入和删除的个数。
#pragma once/*控制插入和删除个数的宏定义开关*/#define SEQ_LIST_PUSH_BACK_NUM				5	/*尾插-插入数据个数*/
#define SEQ_LIST_POP_BACK_NUM				3	/*尾删-删除数据个数*/#define SEQ_LIST_PUSH_FRONT_NUM				15	/*头插-插入数据个数*/
#define SEQ_LIST_POP_FRONT_NUM				3	/*头删-删除数据个数*/

5.4 test.c文件

	用来进行相应功能的测试,TestSeqList1()和TestSeqList2(),分别测试尾插、尾删和头插、头删。使用者可以自己控制注释,来测试不同的功能。
#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
#include "test.h"/*测试尾插和尾删功能*/
void TestSeqList1()
{SL s;int i = 0;/*初始化*/SeqListInit(&s);/*尾插*/for (i = 0; i < SEQ_LIST_PUSH_BACK_NUM; i++){SeqListPushBack(&s, i);}/*打印*/SeqListPrint(&s);/*尾删*/for (i = 0; i < SEQ_LIST_POP_BACK_NUM; i++){SeqListPopBack(&s);}/*打印*/SeqListPrint(&s);/*释放空间*/SeqListFree(&s);return;
}/*测试头插和头删功能*/
void TestSeqList2()
{SL s;int i = 0;/*初始化*/SeqListInit(&s);/*尾插*/for (i = 0; i < SEQ_LIST_PUSH_BACK_NUM; i++){SeqListPushBack(&s, i);}/*打印*/SeqListPrint(&s);/*头插*/for (i = 10; i < SEQ_LIST_PUSH_FRONT_NUM; i++){SeqListPushFront(&s, i);}/*打印*/SeqListPrint(&s);/*头删*/for (i = 0; i < SEQ_LIST_POP_FRONT_NUM; i++){SeqListPopFront(&s);}/*打印*/SeqListPrint(&s);/*释放空间*/SeqListFree(&s);return;
}int main()
{TestSeqList1();	/*测试尾插和尾删*///	TestSeqList2();	/*测试头插和头删*/return 0;
}

6.测试结果

6.1 测试尾插和尾删的运行结果

	从运行结果可以看出,尾插函数插入了5个元素分别是0,1,2,3,4。执行过尾删后,删除了后边的3个元素。

在这里插入图片描述

6.2 测试头插和头删的运行结果

	从运行结果可以看出,通过尾插先插入5个元素分别是0,1,2,3,4。然后执行头插,插入了10,11,12,13,14这5个元素,最后执行了头删,删除了前边的3个元素。

在这里插入图片描述

7.温馨提示

	插入和删除的个数,均是通过test.h中的宏定义来控制的。

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

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

相关文章

【Javascrpt】比较,逻辑运算符

目录 比较运算符 逻辑运算符 &&(与&#xff09; ||&#xff08;或&#xff09; 两真&#xff08;||左侧为真&#xff0c;||右侧为真&#xff09; 两假&#xff08;||左侧为假&#xff0c;右侧为假&#xff09; 一真一假&#xff08;||一侧为假&#xff0c;另一侧为…

解析Apache Kafka中的事务机制

这篇博客文章并不是关于使用事务细节的教程&#xff0c;我们也不会深入讨论设计细节。相反&#xff0c;我们将在适当的地方链接到JavaDocs或设计文档&#xff0c;以供希望深入研究的读者使用。 为什么交易? 我们在Kafka中设计的事务主要用于那些显示“读-进程-写”模式的应用…

使用Kali进行实验---主机发现

主机发现 【实训目的】 掌握主机扫描的工作原理&#xff0c;学会使用ping等扫描工具&#xff0c;发现网络当中活跃的主机。 【场景描述】 在虚拟机环境下配置4个虚拟系统“Win XP1” “Win XP2” “Kali Linux”和“Metasploitable2”&#xff0c;使得4个系统之间能够相互通…

有哪些适用于 Windows 的PDF 阅读器?免费 PDF 阅读器清单

探索适用于 Windows 10 和 11 的最佳 PDF 阅读器 适用于 Windows 10 和 Windows 11 的最佳 PDF 阅读器让您可以在台式计算机上查看和共享文档。 最好的PDF 编辑器和免费的 PDF 编辑器配备了先进的工具&#xff0c;可以跨不同的操作系统工作。但是&#xff0c;当您只需要查看和…

网络入门基础

网络入门基础 文章目录 网络入门基础网络的发展协议的概念网络协议初识协议分层层状结构OSI七层模型TCP/IP五层(或四层)模型TCP/IP模型和计算机软硬体系结构的关系 网络传输基本流程同局域网的两台主机通信不同局域网的两台主机通信 网络中的地址管理认识IP地址认识MAC地址 网络…

【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4

环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.要下载Thread Safe&#xff0c;否则没有php8apache2_4.dll这个文件&#xff1b;如果使用Apache作为服务器…

python 桌面软件开发-matplotlib画图鼠标缩放拖动

继上一篇在 Java 中缩放拖动图片后&#xff0c;在python matplotlib中也来实现一个自由缩放拖动的例子&#xff1a; python matplotlib 中缩放&#xff0c;较为简单&#xff0c;只需要通过设置要显示的 x y坐标的显示范围即可。基于此&#xff0c;实现一个鼠标监听回调&#xf…

Kubernetes技术与架构-Ingress

Ingress是一个流量网关&#xff0c;其根据配置的URI路径路由规则&#xff0c;为运行在Kubernetes集群中的Service分发流量&#xff0c;从系统架构设计的角度看&#xff0c;Ingress位于Service的上层&#xff0c;本文主要描述Ingress的基本使用方式。 如上所示&#xff0c;clien…

Redis --- 安装教程

Redis--- 特性&#xff0c;使用场景&#xff0c;安装 安装教程在Ubuntu下安装在Centos7.6下安装Redis5 特性在内存中存储数据可编程的扩展能力持久化集群高可用快速 应用场景实时数据存储作为缓存或者Session存储消息队列 安装教程 &#x1f680;安装之前切换到root用户。 在…

docker 基本用法-操作镜像

1.下载镜像 docker search centos #默认从 Docker Hub 中搜索镜像 访问 dockerhub&#xff1a;https://registry.hub.docker.com docker pull centos 拉取镜像 如果不能拉取 方法 1.需要配置配置镜像加速器 tee /etc/docker/daemon.json << EOF {"registry-mirro…

1688拍立淘接口,按图搜索商品接口,图片识别接口,图片上传搜索接口,图片搜索API接口,以图搜货接口

1688拍立淘接口的作用是让用户通过上传图片或输入图片链接的方式&#xff0c;调用1688的图片搜索引擎&#xff0c;返回与该图片相关的所有1688商品。 使用该接口需要先获取一个key和secret&#xff0c;然后参考API文档里的接入方式和示例&#xff0c;查看测试工具是否有需要的…

腾讯云创建了jenkins容器,但无法访问

1、首先&#xff0c;查看本机能不能ping通你的腾讯云服务器 如果ping的通那就下一步 2、查看腾讯云服务器的防火墙关了没&#xff0c;没关关掉、 firewall-cmd --state not running 3、那就在云服务器的控制台开放端口

某马机房预约系统 C++项目(二) 完结

8.4、查看机房 8.4.1、添加机房信息 根据案例&#xff0c;我们还是先在computerRoom.txt中直接添加点数据 //几机房 机器数量 1 20 2 50 3 1008.4.2、机房类创建 ​ 同样我们在头文件下新建一个computerRoom.h文件 添加如下代码&#xff1a; #pragma once #include<i…

工具篇之Axure RP 10的使用

引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择Axure。 接下来&#xff0c;我便从Axure RP 10的下载、安装、中文字体、授权等几个方面&#xff0c;来介绍Axure。 一、背景 Axure是一款强大的原型设计…

GO学习之 goroutine的调度原理

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

Zebec Protocol 薪酬支付工具 WageLink 上线,掀新一轮薪酬支付浪潮

Zebec Protocol 正在从多个方面推动流支付的应用&#xff0c;除了作为一种全新的支付手段来对支付领域进行重塑外&#xff0c;其也在以流支付体系为基础&#xff0c;不断地向薪酬发放领域深度的拓展。 在今年早些时候&#xff0c;Zebec Protocol 通过美国投资机构 Payroll Grow…

【FISCO-BCOS】十八、使用docker部署区块链

目录 前言&#xff1a; docker&#xff1a; 一、安装docker docker部署区块链&#xff1a; 一、 搭建单群组4节点区块链 二、启动区块链 三、检查容器 四. 查看节点 前言&#xff1a; 关于FISCOBCOS部署区块链的方式&#xff0c;我们已经学习过了很多种&#xff0c;如多群组部…

现代C++、STL、QTL的使用

0、现代C中最重要的是&#xff1a; 右值引用&&、移动语义std::move、完美转发std::forward、万能引用T&& void Func(int& x) { cout << "左值引用" << endl; } void Func(const int& x) { cout << "const左值引用…

软件测试之【单元测试、系统测试、集成测试】

一、单元测试的概念 单元测试&#xff08;Unit Testing&#xff09;是对软件基本组成单元进行的测试&#xff0c;如函数&#xff08;function或procedure&#xff09;或一个类的方法&#xff08;method&#xff09;。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff…

volatile-可见性案例详解

6.3 volatile特性 6.3.1 保证可见性 保证不同线程对某个变量完成操作后结果及时可见&#xff0c;即该共享变量一旦改变所有线程立即可见 不加volatile&#xff0c;没有可见性&#xff0c;程序无法停止 加了volatile&#xff0c;保证可见性&#xff0c;程序可以停止 public…