数据结构__顺序表

概念及结构       

         顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改

需要用到数组:数组的绝对优势:下标的随机访问(因为物理空间连续)

a[i]等价于*(a+i)

顺序表的两种类型

顺序表一般可以分为:

1. 静态顺序表:

使用定长数组存储元素。

缺点:空间给小了不够用,给多了浪费

//静态顺序表
//缺点:空间给小了不够用,给多了浪费
#define N 10
typedef int SLDatatype;
struct SeqList
{
	SLDatatype a[N];
	int size;
};

2. 动态顺序表:

        接口实现
        静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间
大小,所以下面我们实现动态顺序表。

使用动态开辟的数组存储。

SList.h

包括顺序表的初始化、删除、尾部插入删除、头部插入删除

还有最后打印出结果

头部插入需要挪动整体的位置,必须从后面开始挪。先挪前面的会覆盖之前的位置导致数据丢失

SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
//动态顺序表
typedef int SLDatatype;
typedef struct SeqList
{
	SLDatatype* a;
	int size;	//存储的有效数据个数
	int capacity;//容量
}SL;
//需要把结构体的地址传过来
//初始化
void SLInit(SL* sl);
//销毁/删除
void SLDestroy(SL* sl);
//尾插
void SLPushBack(SL* psl,SLDatatype x);
//头插
void SLPushFront(SL* psl, SLDatatype x);
//头部删除
void SLPopFront(SL* psl);
//尾部删除
void SLPopBack(SL* psl);
//打印
void SLPrint(SL* psl);

SList.cpp

#define _CRT_SECURE_NO_WARNINGS  1
#include"SeqList.h"
//void SLInit(SL* psl)
//{
// 开始不开辟空间
//	psl->a = NULL;
//	psl->capacity = 0;
//	psl->size = 0;
//}
void SLPrint(SL* psl)
{
	for (int i = 0; i < psl->size; i++)
	{
		printf("%d", psl->a[i]);
	}
	printf("\n");
}
void SLInit(SL* psl)
{
	//开始先开辟一小块空间
	psl->a = (SLDatatype*)malloc(sizeof(SLDatatype)*4);
	if (psl->a == NULL)
	{
		perror("malloc fail");
		return;
	}
	psl->capacity = 0;
	psl->size = 0;
}
void SLDestroy(SL* psl)
{
	//必须置空否则外面会访问到野指针
	free(psl->a);
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}
//检查容量
void SLCheckCapacity(SL* psl)
{
	if (psl->size == psl->capacity)
	{
		//扩容
		//realloc是空间的新的大小
		SLDatatype* tmp = (SLDatatype*)realloc(psl->a, sizeof(SLDatatype) * psl->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		psl->a = tmp;
		psl->capacity *= 2;
	}
}
//尾插
void SLPushBack(SL* psl, SLDatatype x)
{
	//防止越界要检查容量
	SLCheckCapacity(psl);
	psl->a[psl->size] = x;
	psl->size++;
	//或者psl->a[psl->size++]=x;
}
//头插
void SLPushFront(SL* psl, SLDatatype x)
{
	SLCheckCapacity(psl);
	//挪动数据(最后一个数据往后挪)
	int end = psl->size - 1;
	//挪动数据(最后空的地方往前移)
	//int end=psl->size;
	//如果还有空间  
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[x]=x;
	//长度+1
	psl->size++;
}
//头部删除
void SLPopFront(SL* psl)
{
	//暴力检查
	assert(psl->size>0);

	int start = 0;
	//重点
	while (start < psl->size-1)
	{
		psl->a[start] = psl->a[start + 1];
		start++;
	}

	//int start = 1;
	重点
	//while (start < psl->size)
	//{
	//	psl->a[start] = psl->a[start + 1];
	//	start++;
	//}
	psl->size - 1;
}
//尾部删除
void SLPopBack(SL* psl)
{
	//断言,暴力检查
	assert(psl->size>0);
	//温柔检查
	/*if (psl->size == 0)
		printf("表已经空了,别删了");
		return;*/
	
	psl->size--;
}

test.cpp

#include"SeqList.h"
int main()
{
	SL s;
	SLInit(&s);
	SLDestroy(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);
	SLPrint(&s);
	SLDestroy(&s);
	return 0;
}

柔性数组和动态数组的区别

柔性数组是让结构体的成员和后面的数组空间在一块空间上

动态数组在两块空间上

接口的实现

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

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

相关文章

政安晨【AIGC实践】(一):在Kaggle上部署使用Stable Diffusion

目录 简述 开始 配置 执行 安装完毕&#xff0c;一键运行 结果展示 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 人工智能数字虚拟世界实践 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

2024.4.8-day12-CSS 常用样式属性和字体图标

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.8-学习笔记盒子阴影文本阴影透明的vertical-align字体使用 作业 &…

2024年网络安全趋势前瞻:从AI攻击到云安全新挑战

随着2024年开展新的序幕&#xff0c;网络安全领域正面临着前所未有的挑战与机遇&#xff0c;一系列引人注目的趋势和预测逐渐浮出水面。 一、AI技术发展引发的安全问题 近年来&#xff0c;我们见证了AI技术的飞速进步&#xff0c;其中ChatGPT等引领潮流的AI服务成为公众瞩目的…

鸿蒙OS实战开发:【多设备自适应服务卡片】

介绍 服务卡片的布局和使用&#xff0c;其中卡片内容显示使用了一次开发&#xff0c;多端部署的能力实现多设备自适应。 用到了卡片扩展模块接口&#xff0c;[ohos.app.form.FormExtensionAbility] 。 卡片信息和状态等相关类型和枚举接口&#xff0c;[ohos.app.form.formInf…

C++要点细细梳理——trivial:运算符优先级、switch、临时变量默认赋值等

1. 运算符优先级 在C语言中&#xff0c;运算符的优先级决定了在表达式中各个运算符的执行顺序。当一个表达式中有多个运算符时&#xff0c;优先级高的运算符会先被计算。如果两个运算符的优先级相同&#xff0c;那么它们的结合性&#xff08;从左到右或从右到左&#xff09;会决…

【优选算法专栏】专题十六:BFS解决最短路问题(二)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

主从复制、数据持久化 、Redis主从集群、哨兵机制 、Redis分片集群

数据持久化 Redis、主从集群、哨兵机制 Redis分片集群 1、单点 redis 的问题2、主从复制2.1 命令传播 3、Redis的持久化3.1 AOF3.2 RDB&#xff08;默认方式&#xff09;RDB 方式&#xff1a;执行快照时&#xff0c;数据能被修改吗&#xff1f;RDB 方式总结 3.3 RDB 和 AOF 组合…

ORAN C平面 Section Extension 22

ORAN C平面Section扩展22用于ACK/NACK请求。除section type 7外&#xff0c;section扩展22可以用于从O-DU发送到O-RU的所有section type和section扩展。 对于一个section描述&#xff0c;O-DU可以使用section扩展22要求O-RU使用section type 8 C平面消息进行ACK/NACK反馈。关于…

ctfshow web入门 web29-web38

web29 把flag和i屏蔽了 system函数也行但是通常会屏蔽所以我直接用passthru 看看有啥 cat的话要查看源代码 web30 没有意外把这个system屏蔽了没事我不用哈哈哈 ?cpassthru("cat f*"); 然后查看源代码 web31 把空格屏蔽了 某位大佬的题解看到的 %09或者/**/绕过…

代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 贪心算法&#xff0c;这不就是常识&#xff1f;还能叫贪心&#xff1f;LeetCode&#xff1a;1005.K次取反后最大化的数组和_哔哩哔…

思维的类比

Learn More, Study Less 中提出了整体学习法&#xff08;Holistic learning&#xff09;&#xff0c;其基本思想是&#xff1a;你不可能孤立地学会一个概念&#xff0c;而只能将其融入已有的概念体系中&#xff0c;从不同角度对其进行刻画来弄懂其内涵和外延并且书中使用三个类…

力扣2- 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

ubuntu安装

一、安装虚拟机 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载后运行安装向导&#xff0c;一直Next即可 许可证&#xff1a; https://zhuanlan.zhihu.com/p/685829787#:~:textpro,17%E5%AF%86%E9%92%A5%EF%BC%9AMC60H-DWHD5-H80U9-6…

单词接龙--C++

目录 题目描述 输入格式 输出格式 输入 输出 一、AC代码 二、代码分析 三、vector加深理解 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏&#xff0c;现在我们已知一组单词&#xff0c;且给定一个开头的字母&#xff0c;要求出以这个字母开头的最长的“…

【LAMMPS学习】八、基本知识的讨论(1.3)从一个输入脚本运行多个模拟

8. 基本知识的讨论 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和…

ICLR24_OUT-OF-DISTRIBUTION DETECTION WITH NEGATIVE PROMPTS

摘要 分布外检测&#xff08;OOD Detection&#xff09;的研究对于开放世界&#xff08;open-world&#xff09;学习非常重要。受大模型&#xff08;CLIP&#xff09;启发&#xff0c;部分工作匹配图像特征和提示来实现文本-图像特征之间的相似性。 现有工作难以处理具有与已…

灵活就业人员规模已达2亿人?财会卷王们如何在“卷卷卷”中脱颖而出?

先来看几个数据&#xff1a; 1️⃣2022年全国大学生毕业人数突破1000万&#xff0c;而2023年突破1100万&#xff1b; 2️⃣有超过200万海外留学生&#xff0c;即将回国就业&#xff1b; 3️⃣全国灵活就业人员规模已达2亿人。 &#xff08;图源&#xff1a;互联网&#xff0…

CSS变换

CSS变换 根据 CSS 的变换的功能特性&#xff0c;它可以分为位移、旋转、缩放、倾斜和透视&#xff1a; 也可以分成2D变换和3D变换&#xff0c;2D变换是二维平面上进行的&#xff0c;即 X 轴和 Y 轴。这些变换不涉及 Z 轴。3D 变换允许元素在三维空间中进行操作&#xff0c;这些…

Linux——计算机进程基础知识

计算机基础知识 1.计算机组成五大部件: (1) 运算器 &#xff1a;也叫算数逻辑单元&#xff0c;完成对数据的各种常规运算&#xff0c;如加减乘除&#xff0c;也包括逻辑运算&#xff0c;移位&#xff0c;比较等。 (2) 控制器 &#xff1a; 它是整个计算机系统的控制中心&…

Maven的scope详解

依赖范围介绍 maven 项目不同的阶段引入到classpath中的依赖是不同的&#xff0c;例如&#xff0c;编译时&#xff0c;maven 会将与编译相关的依赖引入classpath中&#xff0c;测试时&#xff0c;maven会将测试相关的的依赖引入到classpath中&#xff0c;运行时&#xff0c;mav…