手搓顺序表(C语言)

目录

SeqList.h 

SeqList.c 

 头插尾插复用任意位置插入

头删尾删复用任意位置删除

SLtest.c 

测试示例

 顺序表优劣分析


SeqList.h 

//SeqList.h

#pragma once

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define IN_CY 3

typedef int SLdataType;

typedef struct SeqList
{
	SLdataType* a;
	int size;
	int capacity;
}SeqList;

//初始化函数
void SeqListInit(SeqList* ps);
//销毁函数
void SeqListDestory(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLdataType x);
//尾删
void SeqListPopBack(SeqList* ps);
//打印函数
void print(SeqList* ps);
//头插
void SeqListPushFront(SeqList* ps, SLdataType x);
//头删
void SeqListPopFront(SeqList* ps);

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos);

SeqList.c 

//SeqList.C

#include "SeqList.h"

//初始化顺序表
void SeqListInit(SeqList* ps)
{
	assert(ps);
	ps->size = 0;
	ps->capacity = 3;
	ps->a = (SLdataType*)malloc(sizeof(SLdataType) * ps->capacity);
	//申请空间失败
	if (ps->a == NULL)
	{
		perror("SeqListInit");
		exit(-1);
	}
}

//销毁顺序表
void SeqListDestory(SeqList* ps)
{
	assert(ps);
	ps->size = 0;
	ps->capacity = 0;
    free(ps->a);
	ps->a = NULL;
}

//容量检查
void SLCheckCapacity(SeqList* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		ps->capacity += IN_CY;
		SLdataType* tmp = (SLdataType*)realloc(ps->a, sizeof(SLdataType) * ps->capacity);
		//申请空间失败
		if (tmp == NULL)
		{
			perror("SLCheckCapacity");
			exit(-1);
		}
		ps->a = tmp;
	}
}

//尾插
void SeqListPushBack(SeqList* ps, SLdataType x)
{
	assert(ps);
	SLCheckCapacity(ps);

	ps->a[ps->size++] = x;
}

//尾删
void SeqListPopBack(SeqList* ps)
{
	assert(ps);
	assert(ps->size);

	ps->size--;
}

//打印顺序表
void print(SeqList* ps)
{
	assert(ps);
	int i;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

//头插
void SeqListPushFront(SeqList* ps, SLdataType x)
{
	assert(ps);
	SLCheckCapacity(ps);

	int end = ps->size;
	while (end--)
	{
		ps->a[end + 1] = ps->a[end];
	}
	ps->size++;
	ps->a[0] = x;
}

//头删
void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	assert(ps->size);

	int i;
	for (i = 0; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x)
{
	assert(ps);
	//下标合法检查
	assert(pos>= 0 && pos <= ps->size);
	SLCheckCapacity(ps);

	int end = ps->size;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->size++;
	ps->a[pos] = x;
}

// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
	assert(ps);
	//下标合法检查
	assert(pos >= 0 && pos < ps->size);

	int i;
	for (i = pos; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

 头插尾插复用任意位置插入

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x)
{
	assert(ps);
	//下标合法检查
	assert(pos>= 0 && pos <= ps->size);
	SLCheckCapacity(ps);

	int end = ps->size;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->size++;
	ps->a[pos] = x;
}

//头插
void SeqListPushFront(SeqList* ps, SLdataType x)
{
	SeqListInsert(ps, 0, x);
}

//尾插
void SeqListPushBack(SeqList* ps, SLdataType x)
{
	SeqListInsert(ps, ps->size, x);
}

头删尾删复用任意位置删除

// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
	assert(ps);
	//下标合法检查
	assert(pos >= 0 && pos < ps->size);

	int i;
	for (i = pos; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

//头删
void SeqListPopFront(SeqList* ps)
{
	SeqListErase(ps, 0);
}

//尾删
void SeqListPopBack(SeqList* ps)
{
	SeqListErase(ps, ps->size - 1);
}

SLtest.c 

//SLtest.c

#include "SeqList.h"

void SLtest1()
{
	SeqList s1;
	SeqListInit(&s1);

	SeqListPushBack(&s1, 1);
	SeqListPushBack(&s1, 2);
	SeqListPushBack(&s1, 3);
	print(&s1);
	SeqListPushBack(&s1, 4);
	SeqListPushBack(&s1, 5);
	print(&s1);

	SeqListPopBack(&s1);
	SeqListPopBack(&s1);
	SeqListPopBack(&s1);
	SeqListPopBack(&s1);
	SeqListPopBack(&s1);

	print(&s1);
	SeqListDestory(&s1);
}

void SLtest2()
{
	SeqList s1;
	SeqListInit(&s1);

	SeqListPushFront(&s1, 1);
	SeqListPushFront(&s1, 2);
	SeqListPushFront(&s1, 3);
	print(&s1);
	SeqListPushFront(&s1, 4);
	SeqListPushFront(&s1, 5);
	print(&s1);

	//SeqListPopFront(&s1);
	//SeqListPopFront(&s1);
	SeqListPopFront(&s1);
	print(&s1);
	SeqListPopFront(&s1);
	print(&s1);
	SeqListPopFront(&s1);
	print(&s1);
	SeqListPopFront(&s1);
	print(&s1);

	SeqListDestory(&s1);
}

void SLtest3()
{
	SeqList s1;
	SeqListInit(&s1);

	SeqListInsert(&s1, 0, 1);
	SeqListInsert(&s1, 0, 2);
	SeqListInsert(&s1, 0, 3);
	print(&s1);

	SeqListInsert(&s1, s1.size, 4);
	SeqListInsert(&s1, s1.size, 5);
	SeqListInsert(&s1, s1.size, 6);
	print(&s1);

	SeqListInsert(&s1, 1, 7);
	print(&s1);

	SeqListErase(&s1, s1.size - 1);
	print(&s1);

}
int main()
{
	//测试尾插尾删
	//SLtest1();
	//测试头插头删
	//SLtest2();

	//测试任意位置插入删除
	SLtest3();
	return 0;
}

测试示例

尾插:

尾删:

头插:

头删:

任意位置插入:

任意位置删除:

 顺序表优劣分析

        由于顺序表是一块连续的空间,因此可以直接通过下标访问而无需遍历寻找,所以在需要大量访问的程序中具有优势,对缓存的利用率高。而当空间不够扩容时一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。且对于异地扩容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。

        尾插和尾删的时间复杂度为O(1),因此适用于只需要尾插尾删的场景。而头插头删和任意位置插入删除为了保证数据的顺序性需要一个一个挪动数据,时间复杂度为0(n),因此对于需要大量随机存取的程序来说开销较大。

        因此顺序表通常应用于元素高效存储+频繁访问的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android环境下Mesa初始化流程重学习之eglInitialize

Mesa初始化流程重学习之eglInitialize 引言 说来也惭愧&#xff0c;Mesa搞了这么久了&#xff0c;每次都想深入下&#xff0c;可是每次都是浅尝辄止了。这次趁着有了一定的闲暇时间并且有了调试景嘉微显卡的机会&#xff0c;还是想重新学习下&#xff0c;深入研究下&#xff0…

MongoDB分片集群容灾方案

MongoDB分片集群容灾方案 1. 集群同步工具介绍1.1 第三方数据同步工具mongoshake1.2 官方同步工具mongosync 2. 工具对比2.1 数据一致性2.2 稳定性和可靠性2.3 维护成本 3. 总结 1. 集群同步工具介绍 最近客户咨询MongoDB分片集群市面上主流的容灾方案&#xff0c;所以抽空整理…

Node.js —— Express中服务器的创建、托管静态资源、nodemon

目录 Express的安装 创建基本的 Web 服务器 监听GET请求 监听POST请求 把内容响应给客户端 ​编辑获取 URL 中携带的查询参数 ​编辑获取 URL 中的动态参数 ​编辑托管静态资源 express.static() 托管多个静态资源目录 挂载路径前缀 nodemon: 为什么要使用 nodemon 安…

如何让UE4.26使用VS2022【Windows,源码下载】

使用UE5一直用的是VS2022&#xff0c;都是因为团队需要&#xff0c;只能用UE4&#xff0c;而我电脑中拥有的UE4的版本是UE4.26以及VS2022&#xff0c;我不可能去下载VS2019来为这么一个项目&#xff0c;所以就研究了一下是哪里阻止了UE4.26不让我使用VS2022. 首先下载UE4.26源码…

守护景区安全:探讨景区视频监控方案的搭建及必要性

据新闻报道&#xff0c;5月25日&#xff0c;安徽黄山景区内发生雷击&#xff0c;闪电击中飞来石景点的护栏&#xff0c;多人被碎石砸中受伤。景区工作人员表示&#xff0c;飞来石附近本就属于雷区&#xff0c;当天曾发过两次雷电预警。 随着旅游业的繁荣发展&#xff0c;越来越…

掌握Adobe XD:为自学者准备的软件学习秘籍

相信了解一些设计软件的朋友都听说过这个软件&#xff0c;Adobe XD软件是一款功能强大的原型创建工具。随着Adobe XD软件越来越受到用户的青睐&#xff0c;它几乎涵盖了所有大中小企业和企业的设计&#xff0c;可以说是设计公司最常用的软件之一。Adobe XD软件可以在很多方面满…

Android制作.9图

需求背景&#xff1a;android 启动图变形 开发语言&#xff1a;uni-app&#xff0c;uni-app官网 俗语曰&#xff1a;授人以鱼不如授人以渔 原创地址&#xff1a;Android制作.9图 语雀 一.工具 使用android studio&#xff0c;因为android studio已经集成.9.png制作工具&a…

godot4.2 + GDextension c++在 vs code 中断点调试配置

游戏开发中如果做不到自己编写的代码做断点调试&#xff0c;无不是瞎子摸象&#xff0c;特别是C这么底层的语言。这2天开始在VS studio中折腾&#xff0c;一直折腾不出结果&#xff0c;几次想要放弃GODOT。最终今天在VS code中搞定了这断点调试C代码。 在上一篇文章我已经做好了…

axios和ts的简单使用

按照官网的使用案例简单记下笔记 1&#xff1a;安装 npm install axios 2&#xff1a;案例 一个简单的config配置信息 // 发起一个post请求 axios({method: post,url: /user/12345,data: {firstName: Fred,lastName: Flintstone} }); case // 在 node.js 用GET请求获取…

基于springboot+vue的公司资产网站(全套)

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 管理后台-登录 02. 管理后台-首页 03. 管理后台-个人中心-修改密码 04. 管理后台-个人…

蓝桥杯第1022题 玩具蛇 基础DFS C++ Java

题目 思路和解题方法 问题理解&#xff1a;此题要求找出将一条由16节正方形构成的玩具蛇放入4x4的方格中的不同方式数。每节蛇可以是直线或直角转弯&#xff0c;且蛇的形状需要完全覆盖盒子里的16个格子&#xff0c;每个格子仅被蛇的一个部分占据。 状态表示&#xff1a;使用一…

小猪APP分发:让你的应用轻松上架,免费分发

你是否曾经因为应用无法顺利上架而烦恼&#xff1f;或者&#xff0c;刚刚开发好的应用找不到一个合适的平台进行分发&#xff1f;其实&#xff0c;这些问题都不再是问题&#xff0c;因为“小猪APP分发”来了&#xff01; 每个开发者都希望自己的应用能够被更多的人下载和使用&…

解读vue3源码-1

提示&#xff1a;看到我 请让滚去学习 vue3渲染流程 文章目录 vue3渲染流程vue3的3个核心&#xff1a;1.响应式模块(Reactivity Module)--创建响应式数据2.编译模块(Compiler Module)--模版编译器将html转换为一个渲染函数3.渲染模块(Renderer Module) 渲染流程&#xff1a;1.首…

【torchrl】强化学习训练流程

1 采集数据阶段 上面这个循环是用来采集数据&#xff0c;并且加入到replay buffer中。最终获取的数据是 - s: 当前状态&#xff0c;或者observation - a: 当前动作&#xff0c;后面重要性采样需要用到 - pa: 选择当前动作的概率&#xff0c;后面重要性采样用到 - r: 当前的奖励…

五款局域网监控软件良心推荐

五款局域网监控软件良心推荐 有人问我&#xff0c;能不能推荐几款好用的局域网监控软件。 我说&#xff0c;当然可以了&#xff0c;凭良心说&#xff0c;这几款软件在实用性、用户体验、隐私保护以及性价比上&#xff0c;绝对是当前最强监控软件。 1. 安企神 这款软件支持7天…

智简云携手云器Lakehouse打造一体化大数据平台,释放数据价值

导读 本篇分享的是智简云使用云器Lakehouse升级数据平台的实践总结。 智简云&#xff0c;是一家拥有十余年历史的科技公司&#xff0c;专注于企业服务领域&#xff0c;开发了两款核心产品&#xff1a;基于PASS平台的客户关系管理&#xff08;CRM&#xff09;系统和为中小型用…

生命在于学习——Python人工智能原理(2.1)

二、机器学习 1、机器学习的定义 机器学习是指从有限的观测数据中学习出具有一般性的规律&#xff0c;并利用这些规律对未知数据进行预测的方法&#xff0c;通俗的讲&#xff0c;机器学习就是让计算机从数据中进行自动学习&#xff0c;得到某种知识。 传统的机器学习主要关注…

应用一键跳转,Xinstall助力提升用户体验

在移动互联网时代&#xff0c;App已成为人们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地访问和使用App&#xff0c;成为了开发者们面临的一大挑战。在这一背景下&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&…

滚珠花键在工业自动化领域中有什么优势?

滚珠花键是工业自动化设备中重要的传动系统之一&#xff0c;不仅在工业自动化系统中有着广泛的运用&#xff0c;还在机械制造领域、航空航天领域、工业汽车领域、工业机器人、高速铁路、新能源领域 等都得到广泛应用。由于具有高精度、高承载、耐磨损、传递扭矩大等特点&#x…

大连瓦房店市科工局副局长乔宽一行调研蓝卓

日前&#xff0c;瓦房店市科技和工业信息化局副局长乔宽、副局长国海军、轴承协会秘书长高钧一行莅临蓝卓调研&#xff0c;学习浙江数字经济发展路径&#xff0c;考察蓝卓数字化服务能力。蓝卓副总经理陈挺、装备汽配军团总监陈伟亮、数字化咨询总监周立斌、大连区域方案经理龚…