动态顺序表实现

目录

1. 顺序表的概念

2. 实现的功能

3. 顺序表的定义

4.顺序表的实现

4.1 seqlist.c

4.2 seqlist.h

4.3 test.c

5. 顺序表的优缺点

5.1优点

5.2缺点


1. 顺序表的概念

用一段物理地址连续的内存依次存储数据元素的线性结构

本质就是数组,在数组基础上要求数据是连续存储的,不能有跳跃间隔。我们可以提前规划好顺序表的容量(静态顺序表),还可以根据添加数据动态增容(动态顺序表)

2. 实现的功能

1. void Seqlistpirnt(SL* ps);//顺序表打印
2. void SeqlistDestroy(SL* ps);//销毁接口
3. void SeqlistCheckCapacity(SL* ps);//扩容函数
4. void SeqlistInit(SL* ps);//顺序表初始化
5. void SeqlistPushBack(SL* ps, SLdatatype x);//尾插
6. void SeqlistPopBack(SL* ps);//尾删
7. void SeqlistPushFront(SL* ps, SLdatatype x);//头插
8. void SeqlistPopFront(SL* ps);//头删
9. int SeqlistFind(SL* ps, SLdatatype x);//找到x位置返回下标,没找到返回-1

10. void SeqlistInsert(SL* ps, int pos, SLdatatype x);//制定pos下标位置插入
11. void SeqlistErase(SL* ps, int pos);//删除pos位置的数据

3. 顺序表的定义

需要三个参数

1. a:指向动态内存开辟的空间

2. size:数组中的有效数据

3. capacity:存储的容量可动态增加

//#define N 100
//typedef int SLdatatype;
//
静态顺序表
//typedef struct Seqlist
//{
//    SLdatatype a[N];
//	int size;//表示数组中存储了多少个有效数据
//
//}Seqlist;typedef int SLdatatype;
//动态顺序表
typedef struct Seqlist
{SLdatatype* a;//指向存储数组的空间int size;//表示数组中存储了多少个有效数据int capacity;//容量}SL;

4.顺序表的实现

分为三个文件

4.1 seqlist.c

实现函数的功能

#define _CRT_SECURE_NO_WARNINGS h
#include"seqlist.h"//动态增容
void SeqlistCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLdatatype* tmp = (SLdatatype*)realloc(ps->a, newcapacity * sizeof(SLdatatype));if (tmp == NULL){exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}
//打印输出顺序表
void Seqlistpirnt(SL* ps)
{for (int i = 0; i < ps->size; i++)printf("%d", ps->a[i]);printf("\n");
}
//销毁顺序表
void SeqlistDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}
//顺序表初始化
void SeqlistInit(SL* ps)
{ps->a = NULL;ps->capacity = ps->size = 0;
}
//尾部插入
void SeqlistPushBack(SL* ps, SLdatatype x)
{//SeqlistCheckCapacity(ps);//ps->a[ps->size] = x;//ps->size++;SeqlistInsert(ps, ps->size, x);
}
//尾部删除
void SeqlistPopBack(SL* ps)
{ps->a[ps->size - 1] = 0;//if(ps->size>0)//温柔的处理方式//ps->size--;assert(ps->size>0);//暴力的处理方式SeqlistErase(ps, ps->size);}
//头部插入
void SeqlistPushFront(SL* ps, SLdatatype x)
{		//SeqlistCheckCapacity(ps);//for (int i = ps->size-1; i >= 0; i--)//{//	ps->a[i+1] = ps->a[i];//}//ps->a[0] = x;//ps->size++;SeqlistInsert(ps, 0, x);
}
//头部删除
void SeqlistPopFront(SL* ps)
{//if(ps->size>0)//{//	for (int i = 0; i < ps->size; i++)//	{//		ps->a[i] = ps->a[i + 1];//	}//	ps->size--;//}SeqlistErase(ps, 0);}
//查找特定的数
int SeqlistFind(SL* ps, SLdatatype x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}
//插入数据到指定位置
void SeqlistInsert(SL* ps, int pos, SLdatatype x)
{	SeqlistCheckCapacity(ps);//assert(pos >= 0 && pos <= ps->size);if (pos > ps->size || pos < 0){printf("越界了\n");return;}ps->size++;for (int i = ps->size - 1; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;
}
//删除指定位置的数
void SeqlistErase(SL* ps, int pos)
{if (pos == ps->size - 1){ps->size--;return;}for (int i = pos; i < ps->size-1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
4.2 seqlist.h

方便调用函数

#define _CRT_SECURE_NO_WARNINGS h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLdatatype;//动态顺序表
typedef struct Seqlist
{SLdatatype* a;int size;//表示数组中存储了多少个有效数据int capacity;}SL;
void Seqlistpirnt(SL* ps);
void SeqlistDestroy(SL* ps);//销毁接口
void SeqlistCheckCapacity(SL* ps);//扩容函数
void SeqlistInit(SL* ps);
void SeqlistPushBack(SL* ps, SLdatatype x);
void SeqlistPopBack(SL* ps);
void SeqlistPushFront(SL* ps, SLdatatype x);
void SeqlistPopFront(SL* ps);
int SeqlistFind(SL* ps, SLdatatype x);//找到x位置返回下标,没找到返回-1void SeqlistInsert(SL* ps, int pos, SLdatatype x);//制定pos下标位置插入
void SeqlistErase(SL* ps, int pos);//删除pos位置的数据
4.3 test.c

进行测试,使用

#define _CRT_voidSECURE_NO_WARNINGS h
#include"seqlist.h"void TestSeqList1()
{SL s1;SeqlistInit(&s1);SeqlistPushBack(&s1, 1);SeqlistPushBack(&s1, 2);SeqlistPushBack(&s1, 3);SeqlistPushBack(&s1, 4);SeqlistPushBack(&s1, 5);Seqlistpirnt(&s1);SeqlistPopBack(&s1);SeqlistPopBack(&s1);Seqlistpirnt(&s1);SeqlistDestroy(&s1);
}void TestSeqList2()
{SL s1;SeqlistInit(&s1);SeqlistPushFront(&s1, 1);SeqlistPushFront(&s1, 2);SeqlistPushFront(&s1, 3);SeqlistPushFront(&s1, 4);SeqlistPushFront(&s1, 5);Seqlistpirnt(&s1);SeqlistPopFront(&s1);SeqlistPopFront(&s1);Seqlistpirnt(&s1);//int t = SeqlistFind(&s1, 2);//printf("%d\n", t);//int pos;//scanf("%d", &pos);//SeqlistInsert(&s1, pos, 6);//Seqlistpirnt(&s1);//scanf("%d", &pos);//SeqlistErase(&s1, pos);//Seqlistpirnt(&s1);SeqlistPopFront(&s1);//SeqlistPopFront(&s1);//Seqlistpirnt(&s1);SeqlistDestroy(&s1);
}
void TestSeqList3()//
{SL s1;int t = SeqlistFind(&s1, 2);}
int main()
{TestSeqList1();TestSeqList2();
}

5. 顺序表的优缺点

5.1优点

1.支持随机访问(用下标访问)需要随机访问结构,支持算法可以更好适用

2.cpu高速缓存命中率(连续存储)

5.2缺点

1.头部中部插入删除时间效率低O(N)

2.连续的物理空间,空间不够了以后需要增容

增容有一定程度的消耗

为了避免增容一般都按倍数去增容,用不完可能存在浪费


这篇到这里就结束了,希望可以帮到你

(づ ̄3 ̄)づ╭❤~

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

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

相关文章

从零手写实现 tomcat-11-filter 过滤器

创作缘由 平时使用 tomcat 等 web 服务器不可谓不多&#xff0c;但是一直一知半解。 于是想着自己实现一个简单版本&#xff0c;学习一下 tomcat 的精髓。 系列教程 从零手写实现 apache Tomcat-01-入门介绍 从零手写实现 apache Tomcat-02-web.xml 入门详细介绍 从零手写…

基于Springboot的学生心理压力咨询评判(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的学生心理压力咨询评判&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

5.7日学习记录及相关问题解答

1. 阅读文章 复习 JAVA基础——接口&#xff08;全网最详细教程&#xff09; Java之对象的多态性&#xff08;使用生活中通俗的例子讲解&#xff09; 新学 JavaWeb——Servlet&#xff08;全网最详细教程包括Servlet源码分析&#xff09; 有用 创建Dynamic Web Project工程&…

PS滤镜插件Camera Raw 15.4升级,开启智能修图

前段时间Adobe 更新了photoshop 的智能AI填充功能&#xff0c;深受很多设计师朋友的喜爱。Camera Raw作为PS的一个滤镜插件对RAW图片的处理上面有一定的优势&#xff0c;Camera Raw 15.4升级了&#xff0c;开启智能修图木事&#xff0c;一起来看看吧&#xff01; Camera Raw滤镜…

【2024华为HCIP831 | 高级网络工程师之路】刷题日记(18)

个人名片&#xff1a;&#x1faaa; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&a…

ClassificationPrimitive 内部原理

ClassificationPrimitive 内部原理 发明 ClassificationPrimitive的真是个天才。其原理是利用 webgl 的模板缓冲区实现。 渲染两次, 首先是绘制模板, 然后绘制真正的内容。 示意图: function createClass() {const { program, uniforms } WebGLProgram.buildPrograms(gl, …

代码随想录算法训练营第36期DAY22

DAY22 654最大二叉树 自己做的时候忽略了&#xff1a;nums.length>1的题给条件。所以每次递归都要判断是否size()>1&#xff0c;不要空的。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig…

牛客网刷题 | BC84 牛牛学数列2

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 这次牛牛又换了个数…

sql中的exists和in的区别

在SQL中&#xff0c;EXISTS 和 IN 都用于子查询&#xff0c;但它们的用法和目的有所不同。 ### EXISTS EXISTS 是一个逻辑运算符&#xff0c;用于检查子查询是否返回任何行。如果子查询返回至少一行&#xff0c;那么 EXISTS 子句的结果为 TRUE&#xff1b;否则&#xff0c;结果…

一个用Kotlin编写简易的串行任务调度器

引言 由于项目中有处理大量后台任务并且串行执行的需求&#xff0c;特意写了一个简易的任务调度器&#xff0c;方便监控每个任务执行和异常情况&#xff0c;任务之间互不影响。正如上所述&#xff0c;Kotlin中的TaskScheduler类提供了一个强大的解决方案&#xff0c;用于使用S…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

centos7服务器采用局域网内笔记本代理上网

一、背景 某台服务器操作系统是centos 7&#xff0c;不能上网。我想在上面装个ftp软件&#xff1a;vsftpd。 二、思路 要安装这个软件&#xff0c;有2种方案 1&#xff09;设置该台centos7可以上网 2&#xff09;离线安装vsftpd 鉴于各种依赖&#xff0c;万一因为依赖不全或…

《海峡科技与产业》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《海峡科技与产业》期刊是什么级别&#xff1f; 答&#xff1a;国家级 主管单位&#xff1a;中华人民共和国科学技术部 主办单位&#xff1a;科技部海峡两岸科学技术交流中心 问&#xff1a;《海峡科技与产业》影响因子&#xff1f; 答&#xff1a;…

相位;傅里叶变换和傅里叶级数是什么;欧拉公式是什么,和傅里叶关系;

目录 相位 傅里叶变换公式使用举例 实际案例 傅里叶变换和傅里叶级数是什么

随笔:棋友们

我是在小学二年级学会中国象棋的&#xff0c;准确说&#xff0c;是学会象棋的下棋规则的&#xff0c;师傅是二舅。我最早的对手就是同学波仔。波仔比我略早学会象棋&#xff0c;总用连珠炮欺负我&#xff0c;开局几步棋就把我将死。我不知道怎么破解。轮到我先走时&#xff0c;…

扭亏为盈的赛力斯,真正进入稳态了吗?

“72小时内大定破1万台”。5月15日&#xff0c;问界新M5开启全国大规模交付&#xff0c;从当前取得的成绩来看&#xff0c;赛力斯的“富贵”似乎还将延续。 其实&#xff0c;此前基于问界新M7等车型的爆火&#xff0c;赛力斯已经找到了创收轨道。财报显示&#xff0c;2024年一…

alist网盘自动同步

alist网盘自动同步 alist可以设置目录定时转存到各个网盘&#xff0c;做到夸网盘&#xff0c;多备份的效果可以将自己挂载的alist 下的各个目录相互间进行同步&#xff0c;原理是采用alist原始api调用执行同步原理1.匹配文件名称是否相同,2.文件大小是否相同&#xff0c;相同会…

一文详细解析Google编码规范工具cpplint的下载安装与使用

目录 一、什么是cpplint 二、cpplint能实现的功能 三、cpplint的下载与使用 1、配置python环境 2、安装cpplint 四、cpplint常用命令讲解 1、常用命令查看 2、常用命令详解 3、命令使用方式 五、 cpplint的实用技巧 1、集成cpplint 1.1、修改调用接口. 1.2、直接把…