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

news2024/10/6 1:38:41

文章目录

  • 简介
    • 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.coloradmin.cn/o/1125331.html

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

相关文章

实战:打造一个开箱即用的超丝滑超漂亮hexo博客网站-v4-(通过百度网盘同步空间来同步source核心数据)

实战&#xff1a;打造一个开箱即用的超丝滑超漂亮hexo博客网站-v4-(通过百度网盘同步空间来同步source核心数据) 目录 文章目录 实战&#xff1a;打造一个开箱即用的超丝滑超漂亮hexo博客网站-v4-(通过百度网盘同步空间来同步source核心数据)目录写在前面本次更新方案背景方案官…

C语言每日一题(17)老人的数目

力扣 2678 老人的数目 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的…

测开不得不会的python之re模块正则表达式匹配

学习目录 正则表达式介绍 正则表达式的常用符号 python的re模块 findall()函数 finditer()函数 match()函数 search()函数 split()函数 正则表达式的介绍 Python 通过标准库中的 re 模块来支持正则表达式。 正则表达式作为高级的文本模式匹配、抽取、和搜索。简单地说…

Python OpenCV将n×n的小图拼接成m×m的大图

Python OpenCV将nn的小图拼接成mm的大图 前言前提条件相关介绍实验环境n \times n的小图拼接成m \times m的大图代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、OpenCV-Python小…

独立企业签名和共享企业签名的区别

最近两天&#xff0c;小编注意到行业内的一则消息&#xff0c;市面上有好几本企业签名证书又被封了。毋庸置疑&#xff0c;这些肯定是共享的证书。理由很简单&#xff0c;市面上的用来做共享证书的企业签名&#xff0c;基本上都是不会限制应用类型以及签名的数量。据鲲分发平台…

计算机考研自命题(6)

1、C语言–奇数求和 1、使用函数求奇数和&#xff1a;输入一批正整数&#xff08;以零或负数为结束标志&#xff09;&#xff0c;求其中的奇数和。要求定义和调用函数 odd(n) 判断数的奇偶 性&#xff0c;当 n 为偶数时返回 0 &#xff0c;否则返回 1 。试编写相应程序。 /* 解…

yolov7改进优化之蒸馏(二)

续yolov7改进优化之蒸馏&#xff08;一&#xff09;-CSDN博客 上一篇已经基本写出来yolov7/v5蒸馏的整个过程&#xff0c;不过要真的训起来我们还需要进行一些修改。 Model修改 蒸馏需要对teacher和student网络的特征层进行loss计算&#xff0c;因此我们forward时要能够返回需…

Lua入门使用与基础语法

文章目录 目的基础说明开发环境基础语法注释数据类型变量流程控制函数 总结 目的 Lua是一种非常小巧的脚本语言&#xff0c;基于C构建并且完全开源&#xff0c;可以方便的嵌入到各种项目中&#xff0c;当然也可以单独使用。Lua经常被用在很多非脚本语言的项目中&#xff0c;用…

组件通信$refs | $parent |$root

父组件传值子组件用Props 子组件传值父组件用$emit 父组件直接还可以直接取子组件的值用$refs 父组件直接从子子组件中获取值$refs 不建议使用会增加组件之间的耦合度&#xff0c;一般用于第三方插件的封装 ref如果绑定在dom节点上&#xff0c;拿到的就是原生dom节点。 ref如…

【智能家居】

面向Apple developer学习&#xff1a;AirPlay | Apple Developer Documentation Airplay AirPlay允许人们将媒体内容从iOS、ipad、macOS和tvOS设备无线传输到支持AirPlay的Apple TV、HomePod以及电视和扬声器上。 网页链接的最佳实践 首选系统提供的媒体播放器。内置的媒体播…

VRPTW(MATLAB):蜘蛛蜂优化算法SWO求解带时间窗的车辆路径问题VRPTW(提供参考文献及MATLAB代码)

一、VRPTW简介 带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW)是车辆路径问题(VRP)的一种拓展类型。VRPTW一般指具有容量约束的车辆在客户指定的时间内提供配送或取货服务&#xff0c;在物流领域应用广泛&#xff0c;具有重要的实际意义。VRPTW常…

IPD集成产品开发TR技术评审详解

IPD&#xff08;Integrated Product Development&#xff09;集成产品开发是一种跨部门协同的、利用先进技术和管理方法来快速推出新产品并满足客户需求的开发模式。华为利用IPD也非常出名。在IPD集成产品开发的过程中&#xff0c;TR&#xff08;Technical Review&#xff09;技…

【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 刷题篇 一、只出现一次的数字1.1 题目描述1…

1024程序员节特辑 | 深度解析C/C++内存管理(建议收藏!!)

1024程序员节特辑 | 深度解析C/C内存管理&#xff08;建议收藏&#xff01;&#xff01;&#xff09; 一、C/C内存分布1.1 相关例题 二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free2.1 相关面试题 三、C内存管理方式3.1 new/delete操作内置类型3.2 new和…

通过字符设备驱动的分步实现编写LED驱动,另外实现特备文件和设备的绑定

头文件.h文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; } gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X5000700…

程序员网上接单盛行,到底该怎样选择一个好用不坑的接单平台?

现在&#xff0c;选择在网上接单的程序员是越来越多了&#xff0c;与此同时&#xff0c;网上接单的平台也是越来越多了&#xff0c;五花八门的平台&#xff0c;哪个最靠谱&#xff1f;哪个资源丰富一些&#xff1f; 这些问题是不是也让你犹豫了呢&#xff1f;不用担心&#xf…

红队打靶:Misdirection打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;Web渗透&#xff08;80端口&#xff0c;战术放弃&#xff09; 第三步&#xff1a;Web渗透&#xff08;8080端口&#xff09; 第四步&#xff1a;sudo bash提权 第五步&#xff1a;/etc/passwd利…

Qt程序的发布和打包,任何电脑都可以安装

## 1. Qt程序的发布 当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序,这个可执行程序在本地运行是完全没有问题的(因为在本地有Qt环境,程序运行过程中可以加载到相关的动态库),但是如果我们想把这个Qt程序给到其他小伙伴使用可能就会出问题了,原因如下: 对方电…

Leetcode刷题详解——二分查找

1. 题目链接&#xff1a;704. 二分查找 2. 题目描述&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1…

【线程本地变量ThreadLocal】—— 每天一点小知识

&#x1f4a7; 线程本地变量 T h r e a d L o c a l \color{#FF1493}{线程本地变量ThreadLocal} 线程本地变量ThreadLocal&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433;…