数据结构入门(二):顺序表

2023-11-09

目录

1.顺序表的概念

2.注意事项

3.接口的实现

4.顺序表的问题及思考

1.顺序表的概念

2.注意事项

在进行任意位置删除的时候:一定要注意是否越界,因为顺序表是以一个连续的线性表

3.接口的实现

3.1任意插入(头插和尾插)

3.2任意删除

尾删

任意删除

3.2打印顺序表

3.3最后释放开辟的空间

3.4举例实现

4.顺序表的问题及思考


1.顺序表的概念

顺序表是一种用连续的物理地址存储单元一次存储数据元素的线性结构,所以它和链表、栈、队列、字符串以及都是属于线性表

1.1顺序表一般可以分为静态顺序表和动态顺序表

静态顺序表:

即给定数的长度,往里面存储数据

typedef struct Seqlist
{
   SLDataType a[N];
     size_t size;
}SeqList;

动态顺序表

typedef struct Seqlist
{
	SLDataType* a;
	SLDataType size;
	SLDataType capacity; //数组实际存放的数据
}SL;

先给定一定的空间,当空间不够的时候可以扩容;

2.注意事项

在写接口函数之前一定要注意,在插入前要对顺序表进行判断空间是否足够

为了调用的时候更方便一般先写一个函数来判断是否要对该空间进行增容;

void Checkcapacity(SL*pc)
{
	if (pc->capacity == pc->size)
	{
		int newcapacity = pc->capacity == 0 ? 4 : pc->capacity * 2;
		//进行扩容
		SLDataType* tem = (SLDataType*)realloc(pc->a, sizeof(SLDataType) * newcapacity);
		if (tem == NULL)
		{
			printf("realloc fail\n");
			exit(-1);//扩容失败,直接退出,终止整个程序,return只是结束了尾插这个函数
		}
		//扩容成功
		pc->a = tem;
		pc->capacity = newcapacity;
	}
}

在进行任意位置删除的时候:一定要注意是否越界,因为顺序表是以一个连续的线性表

3.接口的实现

3.1任意插入(头插和尾插)

头插

void SeqListPushFront(SL*pc,SLDataType x)
{
	Checkcapacity(pc);
	for (int i = pc->size-1; i>=0; i--)
	{
		pc->a[i+1] = pc->a[i];
	}
	pc->a[0] = x;
	pc->size++;
}

尾插

void SeqListPushBack(SL* pc,SLDataType x)
{
	Checkcapacity(pc);
	pc->a[pc->size] = x;
	pc->size++;
}

任意插入

void SeqLisrInsert(SL* pc, int pos, SLDataType x)
{
	assert(pos<=pc->size||pos>=0);
	Checkcapacity(pc);
	for (int i=pc->size-1;i>=pos; i--)
	{
		pc->a[i+1] = pc->a[i];
	}
	pc->a[pos] = x;
	pc->size++;
}

所以在运用头插的时候就不用专门写一个接口,直接对调用这个接口就行;

3.2任意删除

头删

void SeqListPopFront(SL*pc)
{
	assert(pc->size > 0);
	for (int i=0;i<pc->size-2; i++)
	{
		pc->a[i] = pc->a[i + 1];
	}
	pc->size--;
}

尾删

void SeqListPopBack(SL*pc)
{
	//判断一下是否size必须大于等于0;
	/*if (pc->size > 0)
		pc->size--;*/
	pc->size--;
	assert(pc->size > 0);
}

任意删除

void SeqListDes(SL* pc, int pos, SLDataType x)
{
	assert(pos>=0||pos<=pc->size);//因为顺序表是连续的
	for (int i = pos; i < pc->size - 1; i++)
	{
		pc->a[i] = pc->a[i + 1];
	}
	pc->size--;
	assert(pc->size > 0);
}

3.2打印顺序表

void SeqListprint(SL* pc)
{
	for (int i = 0; i <pc->size; i++)
	{
		printf("%d ", pc->a[i]);
  }
}

int SeqListFind(SL* pc, SLDataType x)
{
	for (int i = 0; i < pc->size; i++)
	{
		if (pc->a[i] == x)
			return i;
	}
	return -1;
}

3.3最后释放开辟的空间

void SeqListDestroy(SL* pc)
{
	free(pc->a);
	pc->a = NULL;
	pc->size = pc->capacity = 0;
}

3.4举例实现

void TestSeqlist1()
{
	SL sl;
	SeqListInIt(&sl);
	//尾插数据
	SeqListPushBack(&sl, 1);
	SeqListPushBack(&sl, 2);
	SeqListPushBack(&sl, 3);
	SeqListPushBack(&sl, 4);
    SeqListPushBack(&sl, 5);
	SeqListPushFront(&sl, 10);
	SeqListPushFront(&sl, 20);
	SeqLisrInsert(&sl, 7, 30);
	SeqListprint(&sl);

	//最后不用的时候销毁顺序表
	SeqListDestroy(&sl);

}


int main()
{
	TestSeqlist1();
	return 0;
 }

实现的结果

4.顺序表的问题及思考

1.插入数据的时候,时间复杂度其O(n);

2.增容需要申请新的空间,拷贝数据,释放旧空间,会有不小的损耗;

3.增容一般呈2倍的增长,后面没有了数据的插入,就浪费了太多空间;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构入门(二):顺序表 的相关文章

  • 在上传之前预览图像 VUEjs [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但我不知道如何在vuejs中使用代码 我尝试了很多但没有任何结果 我还添加了我的代码 有人可以帮帮我吗 这是我的代码 谢谢 html
  • Vue Router - 使用 Vue 2 Composition API 获取路由参数

    我正在使用Vue 2 组合 API https github com vuejs composition api并想从我的 Vue Router 访问路由参数setup method 如中所述Vue 路由器文档 https next rou
  • 如何在 ChartJS 中创建自定义图例

    我需要使用 ChartJS 库为我的圆环图创建自定义图例 我已经使用 ChartJS 提供的默认图例创建了甜甜圈 但我需要一些修改 我希望其价值高于汽车名称 另外 我不喜欢粘性图例 我想将其与甜甜圈分开 这样我就可以更改字体 框的样式 例如
  • Vue模板-渲染HTML特殊字符代码

    如何在我的 Vue 模板中完全渲染 HTML 特殊字符代码 例如我有这个 JSON 数据 id post91 slug null title Breakfast 038 Tea 我怎样才能转换Breakfast 038 Tea to Bre
  • 是否可以限制用户登录 Firebase 应用的设备数量?

    语境 我正在帮助使用 Vue 更新 Cordova 应用程序 以从基于订阅的收入 用户必须付费才能访问该应用程序 转变为基于广告的收入 用户可以免费注册 但将拥有他们在使用应用程序时显示的广告 我们想要做的一部分是限制用户可以拥有帐户的设备
  • 如何在 vue 模板中使用 `console.log` 或 `console.error`?

    我有一个 vue 组件
  • 如何隔离 Vuetify 全局样式

    我已经开始在旧的现有项目中将 Vue js 与 Vuetify 结合使用 所以我没有重写所有前端 我只是导入了Vue并替换了一些部分 然后我注意到一个非常意想不到的行为 Vuetify 具有常见类的全局样式 例如 title它不仅影响整个页
  • Vuejs ssr 检查用户是否针对每个请求进行了身份验证

    我正在为我的应用程序使用这个 ssr 样板 https github com vuejs vue hackernews 2 0 https github com vuejs vue hackernews 2 0 我不知道如何实现逻辑来检查每
  • 模拟安装挂钩 Jest 测试装置

    我正在对组件进行一些单元测试 但是 在某些组件中 我有一些东西在运行mounted使我的测试失败的钩子 我设法模拟了我不需要的方法 但是 我想知道是否有一种解决方法可以模拟mounted钩住自己 components attendeesLi
  • Laravel Echo 不监听推送事件

    尝试使用 laravel 和 vuejs 创建一种聊天应用程序 发送消息后 我会从 laravel 触发事件 该事件会使用正确的事件类反映在推送器调试控制台上 但根本不会调用来自 vuejs 的监听回调 created window Ech
  • 如何在Vue中获取输入字段值

    我是 Vue 新手 我需要一些帮助来从输入字段获取值 在我的表格中 我有
  • Vue 3:使用渲染函数将所有项目包装在一个自定义组件中

    我正在尝试建立自己的sortable成分 我想将项目列表传递到它的默认插槽 然后 可排序组件应该用自定义包装所有传递的项目v draggable成分
  • 可以用vue-chartjs打印图表吗?

    我正在使用 vue chartjs 在网络应用程序上渲染图表 我知道如果您使用原始版本 您可以打印图表library https canvasjs com docs charts methods chart print 但是我不知道如何使用
  • 从 Vue CLI 切换到使用 Spring-Boot 作为后端的 Vite,开发服务器未按预期工作

    有多种方法可以将 Vue 项目集成到 Spring Boot 项目中 使用基于 webpack 的构建工具 例如 vue cli 我已经通过以下方式成功完成了几次 配置outputDir构建过程的输出被放置在例如 static dist 最
  • Vue js - 在同一级别的两个组件内传递数据

    我有需要从一个传递的数据component1到另一个component2 我不使用vuex or router 组件树 Parent Component1 Component2 从一开始component1我发出 ajax 请求 检索信息并
  • Nuxt.js 多个资源的根路由和根级 slugs

    我正在使用 Nuxt 构建一个电子商务前端 我希望为尽可能多的资源提供根级 slugs 最重要的是目录路径和产品 URL 一个明显的方法是使用 Nuxt 文件结构进行路由创建 com category men Tshirt com cate
  • 在新窗口中打开 VueJS 组件

    我有一个只有一页的基本 VueJS 应用程序 它不是 SPA 而且我不使用 vue router 我想实现一个按钮 单击该按钮时会使用我的 Vue 组件之一的内容执行 window open 函数 查看来自的文档window open ht
  • 个人Vue 3组件包缺少模板或渲染函数

    我最近将自己的 Vue 3 组件上传到 NPM 以供其他人使用 当在其他项目中使用它时 它会发出以下警告 Vue warn Component is missing template or render function at
  • 从组件传递数据

    我对 Vue 相当陌生 我正在尝试将数据从组件传递到视图 我不确定我是否在使用props正确的 我有一个对话框 当我保存时 我想将数据插入数据库 我也想重复使用addCustomer function 这就是为什么我没有将该函数放置在组件中
  • 用变量字符串设置槽的简单方法?

    有许多slot例子 但没有克莱尔和简单 因为我需要 我需要类似的东西 var x Hello slot x 这就是我需要的 在一个具体的例子中 https jsfiddle net 2qdh3x3v https jsfiddle net 2

随机推荐

  • Linux学习笔记——例说makefile 头文件查找路径

    0 前言 从学习C语言开始就慢慢开始接触makefile 查阅了很多的makefile的资料但总感觉没有真正掌握makefile 如果自己动手写一个makefile总觉得非常吃力 所以特意借助博客总结makefile的相关知识 通过例子说明
  • Python os模块相关简介

    Python里os path isdir 等函数的作用和用法 一 用法和概念 Python里的os模块用于和系统进行交互 其里 os listdir 用于返回一个由文件名和目录名组成的列表 需要注意的是它接收的参数需要是一个绝对的路径 os
  • 使用 Docker 快速上手中文版 LLaMA2 开源大模型

    本篇文章 我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型 国内第一个真正开源 可以运行 下载 私有部署 并且支持商业使用 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后 GitHu
  • C++中随机数的生成

    一 伪随机数 在C 中要生成随机数 首先要include一个文件
  • 手机屏幕测试html,华为手机屏幕检测代码是什么

    类型 系统工具大小 1 4M语言 中文 评分 10 0 标签 立即下载 华为手机很多操作代码用户记住后是可以快捷使用的 有小伙伴想要进行屏幕检测 那华为手机屏幕检测代码是什么 西西小编来为大家介绍 华为手机屏幕检测代码是什么 华为手机屏幕检
  • C语言最大子序列和三种常用解决方法

    注 看不懂评论区提问 有问必答 问题 给定K个整数组成的序列 N 1 N 2 N K 连续子列 被定义为 N i N i 1 N j 其中 1 i j K 最大子列和 则被定义为所有连续子列元素的和中最大者 例如给定序列 2 1 3 4 1
  • BGP一网双平面实验

    实验说明 1 A面 顶面 路由器在AS2 B面 底面 路由器在AS3 宁波路由器在AS1 西安路由器在AS4 2 IP设计 协议号设计如图所示 3 宁波办公路由IP 10 100 1 1 业务路由IP10 100 2 2 西安办公路由IP1
  • Windows 注册表(Registry) 学习

    目录 一 注册表 Registry 介绍 1 注册表简介 2 开启 禁用 注册表编辑器 3 注册表位置 二 注册表的结构 三 修改注册表实现 应用程序开机自启动 一 注册表 Registry 介绍 1 注册表简介 注册表是windows系统
  • 【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机(ubantu18.04@Intel 82545EM

    前言 DPDK 网络数据开发中文网开发中文网致力于整理收录dpdk spdk ovs vpp dpvs virtiohost sdn ovn qemu等方向 的github开源项目 资料文档 书籍 讲解视频 各大企业招聘信息 23 1 12
  • react hooks useCallback useMemo的区别

    最近在看react hooks useState和useEffect较好理解 到useCallback和useMemo的时候 看官网不太懂 后来通过查阅资料 算是搞明白了 下面实例都是基于react native 不过原理和react是一样
  • Oracle ADG自动切换脚本分享

    为大家分享一个 Oracle ADG自动切换 的脚本 由云和恩墨工程师HongyeDBA编写 支持Switchover Failover 下载链接 https www modb pro download 5 DG环境需求 DG使用服务名必须
  • Python之匿名函数lambda使用方法

    文章目录 一 lambda函数介绍 1 1 语法 1 2 特性 1 3 示例 二 结合内置函数 map filter 使用 2 1 python内置的map 2 2 python内置的filter 一 lambda函数介绍 1 1 语法 在
  • golang面试题:json包变量不加tag会怎么样?

    问题 json包里使用的时候 结构体里的变量不加tag能不能正常转成json里的字段 怎么答 如果变量首字母小写 则为private 无论如何不能转 因为取不到反射信息 如果变量首字母大写 则为public 不加tag 可以正常转为json
  • Android 如何从活动向碎片传递数据

    踩了些坑 做个笔记 方便以后看 方法一 利用碎片的setArguments 方法传递bundle 首先 先穿插一个活动间传递数据的方法 活动间传递数据 两种方法 方法一 直接使用intent提供的put方法 如putString putpu
  • Java操作pdf的工具类itextpdf

    一 什么是iText 在企业的信息系统中 报表处理一直占比较重要的作用 iText是一种生成PDF报表的Java组件 通过在服务器端使用Jsp或JavaBean生成PDF报表 客户端采用超链接显示或下载得到生成的报表 这样就很好的解决了B
  • TS学习(二) :安装ts与ts配置

    一 安装TypeScript npm i g typescript 二 安装完成后 创建ts 使用ts语法 可能遇到的报错问题 在啥都没配置的默认情况下 TS会做出下面几种假设 假设当前的执行环境是dom 如果 代码中没有使用模块化语句 i
  • vscode-server离线安装及配置

    vscode server离线安装及配置 八字环 博客园 cnblogs com 获取当前版本vscode的commit id Help gt About gt Commit 根据commit id下载对应版本的vscode server
  • 保留IP地址

    保留IP地址不会在互联网中使用 其主要被用在企业机构内部作为局域网地址使用 例如 我们经常用到192 168 1 等 保留地址主要在以下四类 A类 10 0 0 0 10 255 255 255 长度相当于1个A类IP地址 A类 100 6
  • 在k8s集群中Kubernetes仪表板dashboard使用RABC机制限制指定用户针对指定名称空间中的资源进行管理实践...

    公众号关注 WeiyiGeek 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 本章目录 Dashboard 利用rbac机制限制指定用户针对指定名称空间中的资源进行UI管理 原文地址 https blog weiyi
  • 数据结构入门(二):顺序表

    目录 1 顺序表的概念 2 注意事项 3 接口的实现 4 顺序表的问题及思考 1 顺序表的概念 2 注意事项 在进行任意位置删除的时候 一定要注意是否越界 因为顺序表是以一个连续的线性表 3 接口的实现 3 1任意插入 头插和尾插 3 2任