数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)

这篇具有很好参考价值的文章主要介绍了数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        前言:学习完了C语言的基础知识点之后,我们就需要使用我们所学的知识来进一步对存储在内存中的数据进行操作,这时候我们就需要学习数据结构。而这篇文章为数据结构中顺序表的讲解。


数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!),数据结构,数据结构,学习,visual studio,开发语言

✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

那么我们废话不多说,直接开始讲解。

先让我们看一下讲解的大体内容有哪些:

数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!),数据结构,数据结构,学习,visual studio,开发语言

目录

1.初识顺序表

        (1)顺序表的定义

        (2)顺序表的特点

2.顺序表的分类

        【1】静态顺序表

        【2】动态顺序表

3.顺序表的功能

4.顺序表中各种功能的实现

        【1】 初始化顺序表中的数据。

        【2】 打印顺序表中的数据。

        【3】对顺序表进行尾插(末尾插入数据)。

        【4】对顺序表进行尾删(末尾删除数据)。

         【5】对顺序表进行头插(开头插入数据)。

      【6】 对顺序表进行头删(开头删除数据)。

          【7】 对顺序表查找数据。

        【8】对顺序表数据进行修改。

        【9】指定位置插入数据

        【10】删除指定位置数据

        【11】 销毁顺序表。


1.初识顺序表

在了解顺序表的定义之前,我们需要先了解一下什么是线性表:

线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”

在了解完线性表的概念之后,我们在来看顺序表:        

        (1)顺序表的定义

数据结构在内存中的表示通常有两种形式,一种是顺序存储,另一种是链式存储。线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表的数据元素,我们把这种存储形式存储的线性表称为顺序表。

例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如图 1 所示:

数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!),数据结构,数据结构,学习,visual studio,开发语言

由上图可知顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组。       

        (2)顺序表的特点

1.  顺序表的逻辑结构和物理结构是一致的,都是连续的。

2.  顺序表中任意一个数据元素都可以随机存取,所以顺序表是一种随机存取的存储结构。

这样我们就初步的了解了顺序表。

2.顺序表的分类

        从上边我们已经了解到了顺序表存储数据使用的就是数组,而数组又分为了静态数组和动态数组,所以顺序表也顺其自然的分成了静态顺序表和动态顺序表。

我们直接使用代码来看一下两种顺序表的定义:

        【1】静态顺序表

//静态顺序表
#define SLDateType int
#define NUMBER 10
typedef struct SeqList
{
	SLDateType arr[NUMBER];
	int size;
}SL;

由上边的代码我们可以看到,静态顺序表由一个定长的数组和一个 int 类型的变量size组成(size的作用是用来记录该数组中的元素个数)。

        【2】动态顺序表

//动态顺序表
#define SLDateType int
typedef struct SeqList
{
	SLDateType* arr;
	int size;
	int capacity;
}SL;

由上边的代码我们可以看到,动态顺序表是由一个指针(该指针存放一个数组的地址,该数组可以使用一些方法使其长度发生变化),一个 int 类型的变量size(size的作用是用来记录该数组中的元素个数)和一个 int 类型的变量capacity组成(capacity用来记录数组的容量)。

注:当然在日常的使用或者工作中,我们大部分都是使用动态顺序表(相较于静态顺序表更加灵活)来存储数据并使用顺序表的一些功能来对数据进行操作的。

这样我们就了解了顺序表的分类和其它们的定义方式了。

3.顺序表的功能

        顺序表可以大致包含以下几个功能:

1. 初始化顺序表中的数据。

2. 打印顺序表中的数据。

3. 对顺序表进行尾插(末尾插入数据)。

4. 对顺序表进行尾删(末尾删除数据)。

5. 对顺序表进行头插(开头插入数据)。

6. 对顺序表进行头删(开头删除数据)。

7. 对顺序表查找数据。

8. 对顺序表数据进行修改。

9. 指定位置插入数据。

10. 删除指定位置数据。

11. 销毁顺序表。

这里我们只需要大致的了解顺序表又哪些功能就可以,下面我们会对这10个功能进行详细的讲解。

4.顺序表中各种功能的实现  

        接下来我们就开始对顺序表中的几个功能开始进行讲解(使用动态顺序表):

我们首先定义动态顺序表:

//动态顺序表
#define SLDateType int
typedef struct SeqList
{
	SLDateType* arr;
	int size;
	int capacity;
}SL;

        

        【1】 初始化顺序表中的数据。

我们直接使用代码来看一下:

//动态顺序表的初始化
void SLInit(SL* sl)
{
	assert(sl);
	sl->arr = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

初始化顺序表时,我们先将数组长度设置为0(即为NULL,之后添加数据时在扩容),将元素个数和数组长度设置为0。

        【2】 打印顺序表中的数据。

我们直接使用代码来看一下:

//打印数据
void SLPrint(SL* sl)
{
	assert(sl);
	for (int i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->arr[i]);
	}
	printf("\n");
}

 打印数据只需要使用循环变量数组来打印就可以了。

        【3】对顺序表进行尾插(末尾插入数据)。

我们直接使用代码来看一下:

//向数据表的尾部插入数据
void SLPushBack(SL* sl, SLDateType n)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);
	//判断数组是否需要扩容
	if (sl->size == sl->capacity)
	{
		//如果数组容量为0,则设置为5,如果不为0,则扩大为两倍
		int Newcapacity = sl->capacity = 0 ? 5 : 2 * (sl->capacity);
		SLDateType* temp = (SLDateType*)realloc(sl->arr, Newcapacity * sizeof(SLDateType));
		if (temp == NULL)
		{
			perror("realloc is wrong");
			exit(1);
		}
		sl->arr = temp;
		temp = NULL;
		sl->capacity = Newcapacity;
	} 
	//添加数据
	sl->arr[sl->size++] = n;
}

在上边的代码中我们发现,当数组满了之后,我们需要对数组进行扩容之后,在向数组中添加数据。   

  

        【4】对顺序表进行尾删(末尾删除数据)。

我们直接使用代码来看一下:

//删除顺序表尾部数据
void SLPopBack(SL* sl)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);
	//原来的数组中要有数据
	assert(sl->size);
	sl->size--;
}

对顺序表进行尾删的时候,我们根本不需要删除数组末尾的数据,我们只需要将记录元素个数的数减小1,这样我们在使用的时候就不会使用到末尾的数据了。       

         【5】对顺序表进行头插(开头插入数据)。

我们直接使用代码来看一下:

//向顺序表的头部插入数据
void SLPushFront(SL* sl, SLDateType n)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);
	//判断数组是否需要扩容
	if (sl->capacity == sl->size)
	{
		//如果数组容量为0,则设置为5,如果不为0,则扩大为两倍
		int Newcapacity = sl->capacity = 0 ? 5 : 2 * (sl->capacity);
		SLDateType* temp = (SLDateType*)realloc(sl->arr, Newcapacity * sizeof(SLDateType));
		if (temp == NULL)
		{
			perror("realloc is wrong");
			exit(1);
		}
		sl->arr = temp;
		temp = NULL;
		sl->capacity = Newcapacity;
	}
	//将所有的数据都往后移动一位
	for (int i = sl->size; i >=1 ; i--)
	{
		sl->arr[i] = sl->arr[i-1];
	}
	//添加数据
	sl->arr[0] = n;
	sl->size++;
}

在进行对顺序表进行头插的时候,我们也需要判断数组是否可以添加一个数据,并且由于我们是头插,所以要将原来数组中所有的数据都往后移动一位

      【6】 对顺序表进行头删(开头删除数据)。

我们直接使用代码来看一下:

//删除顺序表头部数据
void SlPopFront(SL* sl)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);
	//原来的数组中要有数据
	assert(sl->size);
	//将除了第一个位置的其他位置的元素往前移动一位
	for (int i = 0; i<sl->size-1; i++)
	{
		sl->arr[i] = sl->arr[i + 1];
	}
	sl->size--;
}

将除了第一个位置的其他位置的元素往前移动一位,这样就可以将第一位的数据进行覆盖掉,完成对顺序表进行头删的操作。  

          【7】 对顺序表查找数据。

我们直接使用代码来看一下:

//对顺序表查找数据
int SeqListFind(SL*sl, SLDateType n)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);  
	int i = 0;
	for (i = 0; i < sl->size; i++)
	{
		if (sl->arr[i] == n)
		{
			//找到则返回该值在数组中的下标
			return i;
		}
	}
	//没有查找到则返回-1
	return -1;  
}

我们遍历数组查找想要的数据就可以,如果没有找到,则返回-1。      

        

        【8】对顺序表数据进行修改。

我们直接使用代码来看一下:

//对顺序表数据进行修改
void SeqListModify(SL* sl, int pos, SLDateType x)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);  
	//原来的数组中要有数据
	assert(sl->size > 0);
	//检查pos下标的合法性
	assert(pos >= 0 && pos < sl->size); 
	//修改pos下标处对应的数据
	sl->arr[pos] = x;  
}

总体的思路就是先判断是否可行后将对应位置的数据进行修改。     

        【9】指定位置插入数据

我们直接使用代码来看一下:

//在指定位置插入数据
void SeqInsert(SL* sl, int pos, SeqType n)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);
	//判断指定位置的合理性
	assert(pos >= 0 && pos <= sl->size);
	//判断是否需要扩容
	if (sl->size == sl->capacity)
	{
		int newcapacity = (sl->capacity == 0 ? 5 : 2 * (sl->capacity));
		SeqType* temp = (SeqType*)realloc(sl, newcapacity * sizeof(SeqType));
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		sl = temp;
		temp = NULL;
		sl->capacity = newcapacity;
	}
	//添加数据
	for (int i = sl->size - 1;i>=pos; i--)
	{
		sl->arr[i + 1] = sl->arr[i];
	}
	sl->arr[pos] = n;
	sl->size++;
}

在指定位置插入数据时,我们需要判断位置的合理性,即是否是在可以插入的位置进行插入,判断完后,我们判断是否需要扩容,判断完后我们进行数据的插入。    

        【10】删除指定位置数据

我们直接使用代码来看一下:

//删除指定位置数据
void SeqListErase(SL* sl, int pos)
{
	//对传入的指针进行判断,判断是否为空指针
	assert(sl);
	//顺序表不能为空
	assert(sl->size > 0);  
	//检查pos下标的合法性
	assert(pos >= 0 && pos < sl->size);  
	//将pos位置后面的数据依次向前挪动一位,完成覆盖
	for (int i = pos + 1; i < sl->size; i++)  
	{
		sl->arr[i - 1] = sl->arr[i];
	}
	//存储的数据-1
	sl->size--;  
}

对于删除指定位置数据,我们只需要将指定位置数据后面的数据全部向前移动一位完成覆盖即可。        

        【11】 销毁顺序表。

我们直接使用代码来看一下:

//销毁顺序表
void SLDelete(SL* sl)
{
	//将创建的数据空间进行回收
	assert(sl);
	if (sl->arr)
	{
		free(sl->arr);
		sl->arr = NULL;
	}
	sl->size = sl->capacity = 0;
}

从上边的代码中我们知道,我们开创的数组的空间是由malloc函数开辟的,所以在使用完顺序表之后要对该空间进行归还。


以上就是顺序表的全部内容了~~~文章来源地址https://www.toymoban.com/news/detail-850018.html

到了这里,关于数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构--顺序表的查找

    目标: GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。 代码实现 时间复杂度 O(1) 由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第i个元素——“随机存取”特性 目标: LocateElem(Le):按值查找操作。在表L中查找具有给

    2024年02月11日
    浏览(54)
  • 【数据结构】--顺序表的实现

    什么是顺序表?顺序表(SeqList)是线性表中的一类。而线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、字符串、栈、队列... 注意:线性表在逻辑上是线性结构,也就是说是一条连续的直线。但在

    2024年04月17日
    浏览(46)
  • 【(数据结构)- 顺序表的实现】

    先来看两张图片 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据? 常见的数值1、2、3、4…、教务系统里保存的用户信息(姓名、性别、年龄、学历等等)、网页里肉眼可以看到的信息(文字、图片、视频等等),这些都是数据 什么是结构? 当我们想要使用大

    2024年02月07日
    浏览(51)
  • 【数据结构】顺序表的定义和运算

    目录 1.初始化 2.插入 3.删除 4.查找 5.修改 6.长度 7.遍历 8.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以获得授权⚠️。 🎁欢迎大家给我点赞👍、收藏⭐️

    2024年02月05日
    浏览(36)
  • 数据结构(六)——线性表的顺序实现

    🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓csdn2023年后端赛道第第七 ⁣⁣⁣⁣ ⁣⁣⁣⁣

    2024年01月25日
    浏览(64)
  • 数据结构1:动态顺序表的实现

    2024年04月13日
    浏览(50)
  • 【数据结构】顺序表的定义和操作

    目录 1.初始化 2.插入 3.删除 4.查找 5.修改 6.长度 7.遍历 8.完整代码 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以获得授权⚠️。 🎁欢迎大家给我点赞👍、收藏⭐️

    2024年02月03日
    浏览(49)
  • 【数据结构】顺序表的实现——静态分配

    🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 在数据结构的领域中,顺序表是一种基础且重要的线性表实现方式。它采用一段地址连续的存储

    2024年04月26日
    浏览(40)
  • 数据结构与算法 --顺序表的创建

    1. 顺序表(Sequence List)是一种线性表的实现方式,通过连续的内存空间存储元素,按照顺序排列。 顺序表的特点包括: 元素在内存中的存储是连续的,通过数组实现。 元素之间的逻辑顺序与物理顺序一致。 可以根据元素的索引直接访问和修改元素。 需要预先分配足够的内

    2024年03月26日
    浏览(50)
  • 【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

            通过前文,我们了解到线性表是具有相同数据类型的有限个数据元素序列;并且,线性表只是一种逻辑结构,其不同存储形式所展现出的也略有不同,那么今天我们来了解一下线性表的顺序存储——顺序表。         顺序表指的是将 逻辑上相邻的元素 存储在 物理位

    2024年02月19日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包