【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?

这篇具有很好参考价值的文章主要介绍了【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?,数据结构探索,数据结构

🎥 屿小夏 : 个人主页
🔥个人专栏 : 数据结构解析
🌄 莫道桑榆晚,为霞尚满天!

📑前言

​ 什么是数据结构?我们为什么要学数据结构?数据结构中的顺序表长什么样子?它是怎么运用?

​ 本期我们将对这些一一讲解,彻底明白数据结构的重要性,以及顺序表是一种什么的数据结构。

🌤️数据结构的重要性

【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?,数据结构探索,数据结构

☁️什么是数据结构?

​ 数据结构指的是计算机中组织和存储数据的方式。它涉及到数据的组织、管理和操作,以便能够高效地访问和处理数据。

☁️数据结构能干嘛?

​ 数据结构可以用来解决各种计算问题,它提供了不同的数据类型和操作,使得我们可以有效地存储和操作数据。通过选择合适的数据结构,我们可以提高算法的效率,减少时间和空间的消耗。

☁️数据结构有多重要?

​ 它是算法设计和优化的基础,对于解决实际问题和提高计算机程序的性能至关重要。良好的数据结构设计可以提高程序的可读性、可维护性和可扩展性,同时也能够减少资源的消耗和提高程序的执行效率。

🌤️顺序表的概念与结构

☁️顺序表的概念

​ 顺序表是一种线性表的存储结构,它将元素顺序地存储在一块连续的内存空间中。顺序表中的元素在内存中的物理地址是连续的,通过元素在内存中的相对位置来表示元素之间的逻辑关系。

☁️顺序表的结构

​ 顺序表由两部分组成:数据存储区和长度信息。数据存储区是一块连续的内存空间,用来存储顺序表中的元素。长度信息记录了顺序表中元素的个数。

☁️顺序表图例

【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?,数据结构探索,数据结构

🌤️动态顺序表的实现

☁️顺序表所需要的接口

typedef int SLDatatype;
typedef struct SeqList
{
	SLDatatype* array;
	int size;//有效数据个数
	int capacity;//空间大小
}SL;
//增删查改
void SLInit(SL* ps);//初始化
void SLdestroy(SL* ps);//销毁
//打印
void SLprint(SL* ps);
//检查空间
void Inspect(SL* ps);
//尾插尾删
void SLpushBack(SL* ps, SLDatatype x);
void SLpopback(SL* ps);
//头插头删
void SLpushFront(SL*ps, SLDatatype x);
void SLpopFront(SL*ps);
//查找数据下标
int  SLFind(SL* ps, SLDatatype x);
//在pox位置插入x
void SLInsert(SL* ps, int pox,SLDatatype x);
//删除pox位置的值
void SLErase(SL* ps, int pox);
//修改pox位置的值
void SLModify(SL* ps, int pox, SLDatatype x);

☁️顺序表的初始化

对顺序表进行初始化,使表的开始大小可以存储4个有效元素。

void SLInit(SL* ps)
{
	assert(ps);
	ps->array = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);
	if (ps->array == NULL)
	{
		perror("malloc failde");
		exit(-1);
	}
	ps->size = 0;
	ps->capacity = 4;
}

☁️顺序表的空间检查

若是表中的元素个数已满,则进行扩容,扩容的后大小是原顺序表的2倍。

void Inspect(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		SLDatatype* tmp = (SLDatatype*)realloc(ps->array, ps->capacity * 2 * sizeof(SLDatatype));
		if (tmp == NULL)
		{
			perror("realloc failed");
			exit(-1);
		}
		ps->array = tmp;
		ps->capacity *= 2;
	}
}

☁️顺序表的打印

打印顺序表中所有的元素。

void SLprint(SL* ps)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->array[i]);
	}
	printf("\n");
}

☁️顺序表的尾部插入

在顺序表的末尾插入元素。

void SLpushBack(SL* ps, SLDatatype x)
{
	assert(ps);
	Inspect(ps);
	ps->array[ps->size] = x;
	ps->size++;
}

☁️顺序表的尾部删除

将顺序表最后一个元素删除。

void SLpopback(SL* ps)
{
	assert(ps);
	assert(ps->size > 0);
	ps->size--;
}

☁️顺序表的头部插入

在顺序表的头部,表中首元素的前面插入新的元素,这时就需要将旧数据都往后挪一位。

void SLpushFront(SL* ps, SLDatatype x)
{
	assert(ps);
	Inspect(ps);
	int len = ps->size - 1;
	while (len >= 0)
	{
		ps->array[len + 1] = ps->array[len];
		len--;
	}
	ps->array[0] = x;
	ps->size++;
}

☁️顺序表的头部删除

将头部的首元素删除。

//头删
void SLpopFront(SL* ps)
{
	assert(ps);
	int left = 1;
	while (left < ps->size)
	{
		ps->array[left - 1] = ps->array[left];
		left++;
	}
	ps->size--;
}

☁️顺序表查找数据下标

这一步是为了在指定的位置进行增删改查。

int  SLFind(SL* ps, SLDatatype x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->array[i] == x)
		{
			return i;
		}
	}
	return -1;
}

☁️顺序表指定位置插入元素

查找到要插入的位置下标,将元素插入。

void SLInsert(SL* ps, int pox, SLDatatype x)
{
	assert(ps);
	assert(pox >= 0 && pox <= ps->size);
	Inspect(ps);
	int end = ps->size - 1;
	while (end >= pox)
	{
		ps->array[end + 1] = ps->array[end];
		end--;
	}
	ps->array[pox] = x;
	ps->size++;
}

☁️顺序表指定位置元素删除

查找到要删除的位置下标,将元素删除。

void SLErase(SL* ps, int pox)
{
	assert(ps);
	assert(pox >= 0 && pox < ps->size);
	int begin = pox + 1;
	while (begin < ps->size)
	{
		ps->array[begin - 1] = ps->array[begin];
		begin++;
	}
	ps->size--;
}

☁️顺序表修改指定位置的值

查找到要修改的值的位置下标,将旧的元素改为新的值。

void SLModify(SL* ps, int pox, SLDatatype x)
{
	assert(ps);
	assert(pox >= 0 && pox < ps->size);
	ps->array[pox] = x;
}

☁️顺序表的销毁

顺序表使用完后,可以进行释放空间的操作。

void SLdestroy(SL* ps)
{
	assert(ps);
	free(ps->array);
	ps->array = NULL;
	ps->size = ps->capacity = 0;
}

☁️顺序表的特点

  1. 内存连续:顺序表的元素在内存中是连续存储的,可以通过下标直接访问元素。
  2. 随机访问:由于元素在内存中的物理地址是连续的,可以通过下标快速定位和访问元素。
  3. 插入和删除操作效率低:在顺序表中插入或删除元素时,需要移动其他元素的位置,导致操作效率较低。

☁️顺序表的劣势

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

🌤️全篇总结

​ 经过上述一系列的代码和文字讲解,我们了解了数据结构的基本概念,而顺序表作为一种数据结构,它的特性和其独特的特点也是非常鲜明。

☁️ 好了,由于篇幅有限,本章是只介绍了比较简单的一种数据结构——顺序表,后序还会有更多不同的数据结构会分享给大家。
看到这里希望给博主留个:👍点赞🌟收藏⭐️关注!
有问题可以评论或者私信呢秒回哦。
【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?,数据结构探索,数据结构文章来源地址https://www.toymoban.com/news/detail-715776.html

到了这里,关于【从零开始拿捏数据结构】 顺序表是什么?它有什么样的特性?结构到底是什么样的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从零开始学习Redis | 第八篇】认识Redis底层数据结构(下)

    目录 前言:   ZipList: Ziplist的特性: QucikList: QuicList特征: SkipList: 跳表特征: RedisObijct:  小心得: 总结:           在现代软件开发中,数据存储和处理是至关重要的一环。为了高效地管理数据,并实现快速的读写操作,各种数据库技术应运而生。其中,Redis作为一种

    2024年04月12日
    浏览(54)
  • 从零开始学数据结构和算法:腾讯Android开发面试记录,已开源_android 开发面试算法

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Android移动开发全套学习资

    2024年04月25日
    浏览(57)
  • Android开发UI新技能,你get这个新技能了吗?(附源码详解),从零开始学数据结构和算法

    2. 文本输入框 val state = +state { “Text Field to input” } TextField( value = state.value, onValueChange = { state.value = it } ) 3. 按钮 Button(text = “咬我啊”, onClick = { Log.v(“test”, “被咬了”) }) 4.弹出框 MaterialTheme { Column { val openDialog = +state { false } Button(“Click me”, onClick = { openDialog.value = true

    2024年04月12日
    浏览(38)
  • 数据结构:一篇拿捏十大排序(超详细版)

    排序: 所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前, 而

    2024年02月08日
    浏览(52)
  • < 数据结构 > w字拿捏链式二叉树

    目录 1、为何使用链式二叉树 2、何为链式二叉树 3、基本接口         创建二叉链结构         手动构建一颗树 4、二叉树的遍历         前序遍历         中序遍历         后续遍历         层序遍历 5、经典问题         结点个数         叶

    2024年02月12日
    浏览(34)
  • 【数据结构】论如何拿捏快速排序?(含非递归)

    目录 一,快速排序(递归) 1,快排思想 2,霍尔排序 3,挖坑法 4,前后指针法 5,快速排序优化 1,三数取中法选key 2,小区间优化 二,快速排序(非递归) Stack.h Stack.c 三,快速排序源代码 1,快排思想 快速排序是 Hoare于1962年 提出的一种 二叉树结构的交换 排序方法,其

    2024年02月08日
    浏览(57)
  • 【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容,今天给大家带来的是有关链表的基本知识和各种接口功能的实现 好了,废话不多说,开始今天的学习吧! — 概念:链表是一种

    2024年02月14日
    浏览(50)
  • 【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能(2)

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容,今天给大家带来的是有关链表的基本知识和各种接口功能的实现的第二部分。 好了,废话不多说,开始今天的学习吧! — 我们

    2024年02月14日
    浏览(45)
  • [数据结构 -- C语言] 堆(Heap),你小子就是堆,看我如何透彻的将你拿捏

    目录 1、堆的概念及结构 1.1 概念(概念总是重要的) 1.2 结构,分为两种 1.2.1 小堆/小根堆示例 1.2.2 大堆/大根堆示例 2、堆的接口 3、接口实现 3.1 堆的初始化 3.2 堆的销毁 3.3 堆的插入 功能分析: 功能实现: 3.4 堆的删除 功能分析: 功能实现: 3.5 取堆顶的数据 3.6 堆的数据

    2024年02月07日
    浏览(50)
  • 数据结构:线性表顺序存储结构———顺序表

    目录 顺序表的定义 初始化线性表 销毁线性表 求线性表的长度 判断是否为空表 插入数据元素 逻辑序号与物理序号的区别 删除数据元素 输出线性表  按序号求线性表中的元素 按元素值查找 整体上创建顺序表 顺序表实验 线性表的顺序存储是把线性表中的所有元素按照其逻辑

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包