手搓顺序表(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 3typedef 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),因此对于需要大量随机存取的程序来说开销较大。

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

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

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

相关文章

nc解决自定义参照字段前台保存后只显示主键的问题

nc解决自定义参照字段前台保存后只显示主键的问题 自定义参照类VoucherRefModel.java package nc.ui.jych.ref;import nc.ui.bd.ref.AbstractRefModel;/*** desc 凭证号参照* author hanh**/ public class VoucherRefModel extends AbstractRefModel {Overridepublic String[…

Python 将Word、Excel、PDF、PPT文档转为OFD文档

OFD&#xff08;Open Fixed-layout Document &#xff09;是我国自主制定的一种开放版式文件格式标准。OFD文档具有不易被篡改、格式独立、版式固定等特点&#xff0c;目前常用于政府公文、金融、电子发票等领域。 如果想要通过Python将Office文档&#xff08;如Word、Excel或…

数组array 和 array的区别

问题 对于数组 array和&array有什么区别呢? 先说答案 array: 指向数组第一个数地址的指针 &array: 指向整个数组地址的指针 所以直接打印的话, 地址是一样的. 但是如果1的话, 那么array是增加sizeof(int)大小, &array是增加sizeof(int) * array.size() 测试 #i…

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中&#xff0c;使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

vue3之拆若依--记实现后台管理首页(左侧菜单栏、头部信息区域...)

效果图 前期准备 启动若依在本地 启动若依后台,跑在自己本地: 这里对于如何下载若依相关的前后端代码请参考若依官网:RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-…

使用python把gif转为图片

使用python把gif转为图片 程序思路效果代码 程序思路 打开 GIF 文件。确保输出文件夹存在&#xff0c;如果不存在则创建。获取 GIF 的帧数。遍历每一帧&#xff0c;将其保存为单独的 PNG 图像&#xff0c;并打印保存路径。 效果 把这张派大星gif转为一张张图片&#xff1a; …

2024呼吸科常用的慢阻肺评估量表分享

慢性阻塞性肺疾病&#xff08;chronic obstructive pulmonary disease&#xff0c;COPD&#xff09;简称慢阻肺病&#xff0c;是一种常见的、可预防和治疗的慢性气道疾病&#xff0c;其特征是持续存在的气流受限和相应的呼吸系统症状。 呼吸科常用量表来对慢阻肺病患者进行分级…

视频汇聚EasyCVR平台GA/T 1400视图库应用:助力社会治安防控效能提升

在信息化、智能化的时代浪潮下&#xff0c;公安视频图像信息应用系统的发展与应用显得尤为重要。GA/T 1400标准&#xff0c;全称为《公安视频图像信息应用系统》&#xff0c;作为公安行业的一项重要标准&#xff0c;其视图库的应用在提升公安工作效能、加强社会治安防控等方面发…

工欲善其事必先利其器——IntelliJ IDEA神器使用技巧

1.IntelliJ IDEA神器使用技巧【时长2小时20分】 程序员每日都会花费数小时使用ide编写和调试代码&#xff0c;其中很多操作都是机械重复且频率非常高&#xff0c;本着"工欲善其事必先利其器"的精神&#xff0c;闷头写代码之外花点时间研究一下自己用的ide&#xff0…

游戏《酒店业领袖》

为快餐连锁店麦当劳&#xff0c;我们创建了一款名为“好客领袖”的游戏。麦当劳的员工可以在网站上注册&#xff0c;并测试自己是否扮演酒店领导的角色&#xff0c;在餐厅可能出现的各种情况下快速做出决定。奖品等待着那些在比赛中表现最好的人。 对于该项目&#xff0c;我们&…

Redis:Redis的数据类型介绍

Redis 支持多种数据类型&#xff0c;每种数据类型都有其特定的用途和优势。以下是 Redis 中主要数据类型的介绍&#xff1a; 1. String&#xff08;字符串&#xff09; 介绍&#xff1a;最基本的 Redis 数据类型&#xff0c;通常用于缓存和存储经常需要读取的数据。 示例&am…

RAG检索增强生成(1)-大语言模型的外挂数据库

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks Lewis P, Perez E, Piktus A, et al. Retrieval-augmented generation for knowledge-intensive nlp tasks[J]. Advances in Neural Information Processing Systems, 2020, 33: 9459-9474. RAG结合了信息检…

数据结构复习

基本概念和术语&#xff1a; 数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。 数据元素&#xff1a;是组成数据的&#xff0c;具有一定意义的基本单位&#xff0c;在计算机…

bootstrap5-学习笔记1-容器+布局+按钮+工具

参考&#xff1a; Bootstrap5 教程 | 菜鸟教程 https://www.runoob.com/bootstrap5/bootstrap5-tutorial.html Spacing Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 https://v5.bootcss.com/docs/utilities/spacing/ 之前用bootstrap2和3比较多&#xff0c;最近用到了5&a…

flink Jobmanager metaspace oom 分析

文章目录 现象作业背景分析现象分析类卸载条件MAT 分析 解决办法flink 官方提示 现象 通过flink 页面提交程序&#xff0c;多次提交后&#xff0c;jobmanager 报metaspace oom 作业背景 用户代码是flink 代码Spring nacos 分析 现象分析 从现象来看肯定是因为有的类没有被…

开源Mamba-2性能狂飙8倍!多个Mamba超强进化体拿下顶会

MambaOut的热度刚过去没多久&#xff0c;Mamba-2就带着它狂飙8倍的性能炸场了。 Mamba-2的核心层是对Mamba的选择性SSM的改进&#xff0c;同等性能下&#xff0c;模型更小&#xff0c;消耗更低&#xff0c;速度更快。与Mamba不同&#xff0c;新一代的Mamba-2再战顶会&#xff…

充电桩产业链及商业模式

产业链概况 充电桩产业链分为上游元器件和设备生产商、建设商&#xff0c;中游为运营商&#xff0c;下游为各类充电场景。其中&#xff0c;上游零部件厂商提供充电模块&#xff08;IGBT、逆变器等&#xff09;、配电滤波设备、监控计费设备、充电枪等&#xff1b;中游充电桩厂…

P3. 创建个人中心页面

P3. 创建个人中心页面 0 概述Tips1 个人中心页面1.1 创建 Bot 表及 pojo, mapper1.2 实现 Bot 增删改查的 API1.3 实现个人中心页面前端 0 概述 主要介绍了一下添加一个表(类)&#xff0c;及其CRUD的前端和后端的实现方式&#xff0c;介绍的是通用的方法。 后端的CRUD很好写&am…

推荐七款知名度非常高的数据防泄密软件

在数据防泄密软件领域&#xff0c;一些权威且知名度较高的解决方案提供商及其产品&#xff0c;凭借其强大的功能、可靠性以及广泛的市场认可度&#xff0c;成为众多企业保护敏感数据的首选。以下是一些代表性较高的数据防泄密软件。 1.安企神软件 安企神作为一款成熟的数据防泄…

如何减少Apache Spark日志的数量

修改log4j配置文件&#xff0c;没有就创建&#xff1a; 内容&#xff1a; # 设置日志记录器 log4j.rootCategoryWARN, console log4j.appender.consoleorg.apache.log4j.ConsoleAppender log4j.appender.console.targetSystem.err log4j.appender.console.layoutorg.apache.lo…