【数据结构】——顺序表详解

这篇具有很好参考价值的文章主要介绍了【数据结构】——顺序表详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好!当我们学习了动态内存管理后,就可以写一个管理数据的顺序表了!!!

顺序表的理解:

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

【数据结构】——顺序表详解,数据结构,c语言

静态顺序表就是像数组一样的大小固定的,动态的可以在容量不够时进行扩容而达到能够存储大量数据的效果!!!

一、先创建一个结构体来表示顺序表

typedef int DATE;//重命名顺序表的数据类型
typedef struct ArrayList {
	DATE* date;
	size_t size;//顺序表长度
	size_t capacity;//顺序表容量
}AL;

二、顺序表的所有接口展示

void Init(AL* al);
void checkCapacity(AL* al);
void pushBack(AL* al, DATE info);
void pushFront(AL* al, DATE info);
void insertDate(AL* al,size_t pos, DATE info);
void printDate(AL* al);
void Erase(AL* al, size_t pos);
void PopBack(AL* al);
void PopFront(AL* al);
size_t FindDate(AL* al, DATE info);
void ExchangeDate(AL* al, size_t pos, DATE info);
void Deatory(AL* al);

三、每个接口功能介绍及实现原理

1、初始化函数的实现

void Init(AL* al)
{
	assert(al);
	al->size = 0;
	al->capacity = 4;//初始化容量为4
	DATE* tmp = (DATE*)malloc(sizeof(DATE) * al->capacity);
	if (tmp == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	al->date = tmp;
}

初始化顺序表的长度为0、容量为4!

2、检查容量函数的实现

void checkCapacity(AL* al)
{
	if (al->size == al->capacity)
	{
		DATE* tmp = (DATE*)realloc(al->date, sizeof(DATE) * al->capacity*2);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		al->capacity *= 2;
		al->date = tmp;
		printf("扩容成功!\n");
	}
}

如果长度等于容量时就说明需要扩容了,就将容量扩到2倍大小

3、尾插函数的实现

void pushBack(AL* al, DATE info)
{
	assert(al);
	checkCapacity(al);
	al->date[al->size] = info;
	al->size++;
}

每次插入之前一定要检查容量
尾插就是在size尾位置写入需要插入的值,然后要对长度进行加一
【数据结构】——顺序表详解,数据结构,c语言

4、头插函数的实现

void pushFront(AL* al, DATE info)
{
	assert(al);
	checkCapacity(al);
	if (al->size == 0)
	{
		al->date[0] = info;
		al->size++;
	}
	else
	{
		size_t end = al->size;
		while (end)
		{
			al->date[end] = al->date[end-1];
			end--;
		}
		al->date[0] = info;
		al->size++;
	}
}

头插一个数据,必须将后面的数据向后面移动,移动的过程中可能超过容量大小,所以在插入时都需要进行扩容判断

【数据结构】——顺序表详解,数据结构,c语言

挪动方法如上

【数据结构】——顺序表详解,数据结构,c语言

5、尾删函数

void PopBack(AL* al)
{
    assert(ps);
	assert(al->size > 0);
	al->size--;
}

将长度减一即可删除最后一个数据

6、头删函数

void PopFront(AL* al)
{
    assert(al->size > 0);
	int begin = 1;
	while (begin<al->size)
	{
		al->date[begin - 1] = al->date[begin];
		begin++;
     }
	al->size--;
}

挪动顺序方法如下:
【数据结构】——顺序表详解,数据结构,c语言
定义一个变量begin=1,首先是要将数据2移动到数据1的位置,对应的操作是
al->date[begin - 1] = al->date[begin];然后begin++,依次将数据3挪到数据2的位置,数据4挪到数据3的位置。循环最后一次是将数据5挪到数据4的位置,也就是begin=4,al->size=5.则循环判断条件为beginsize,循环结束后将
al->size–;

【数据结构】——顺序表详解,数据结构,c语言

7、任意位置删除数据函数的实现

void Erase(AL* al, size_t pos)
{
	assert(al);
	assert(pos >= 0 && pos <= al->size);
	if (al->size == 0)
	{
		printf("暂无数据!!\n");
		return;
	}
	size_t end = pos;
	while (end<al->size-1)
	{![在这里插入图片描述]【数据结构】——顺序表详解,数据结构,c语言)

		al->date[end] = al->date[end + 1];
		end++;
	}
	al->size--;
}

删除一个数据,就要将这个位置之后的元素全部向前挪动一个位置
由于下标易班都有size_t表示,所以一个要把握好头删时出现无符号-1和0循环条件比较大小的情况

如果我们要删除数3,然后数据3后面的数据向前挪动,第一步就是将数据4移动到数据3的位置,定义一个变量end=pos=2;对应的操作为al->date[end] = al->date[end+1];,然后end++;将数据5移动到最开始数据4的地方。最后一次循环是将数据5移动到数据4的地方,也就是end最后等于3,al->size=5,则循环判断条件是end< al->size-1,循环结束将al->size–;

【数据结构】——顺序表详解,数据结构,c语言

8、任意位置插入数据函数的实现

void insertDate(AL* al, size_t pos, DATE info)
{
	assert(al);
	assert(pos >= 0 && pos <= al->size);
	checkCapacity(al);
	int end = al->size;
	while (end > pos)
	{
		al->date[end] = al->date[end - 1];
		end--;
	}
	al->date[pos] = info;
	al->size++;
}

由于下标易班都有size_t表示,所以一个要把握好头插时出现无符号-1和0循环条件比较大小的情况

【数据结构】——顺序表详解,数据结构,c语言

任意位置插入需要将插入位置及其以后的数据一次向后挪动一个位置!

9、头插头删和头删尾删函数的改进

我们写完任意插和任意删后,就可以对头插头删和头删尾删函数的改进,直接在他们的函数体里面调用任意插入和任意删除函数

void pushFront(AL* al, DATE info)
{
	assert(al);
	checkCapacity(al);
	if (al->size == 0)
	{
		al->date[0] = info;
		al->size++;
	}
	else
	{
		insertDate(al, 0, info);
	}
}
void pushBack(AL* al, DATE info)
{
	assert(al);
	checkCapacity(al);
	insertDate(al, al->size, info);
}
void PopBack(AL* al)
{
	assert(al);
	if (al->size == 0)
	{
		printf("暂无数据!!\n");
		return;
	}
	Erase(al, al->size);

}
void PopFront(AL* al)
{
	assert(al);
	if (al->size == 0)
	{
		printf("暂无数据!!\n");
		return;
	}
	Erase(al, 0);
}

头插就是调用insert函数在0位置插入
尾插就是调用insert函数在size位置插入
头删就是调用Erase函数删除0位置
尾删就是调用Erase函数删除size位置

10、查找数据函数实现

size_t FindDate(AL* al, DATE info)
{
	assert(al);
	for (size_t i = 0; i < al->size; i++)
	{
		if (al->date[i] == info)
			return i;
	}
	return -1;
}

依次便利顺序表,如果找到需要查找的数据,咋返回其下标,否则返回-1

11、修改数据

void ExchangeDate(AL* al, size_t pos, DATE info)
{
	assert(al);
	assert(pos >= 0 && pos <= al->size);
	al->date[pos] = info;
}

先查找要修改的数据是否存在,然后进行修改
他一般会和查找函数配合使用

【数据结构】——顺序表详解,数据结构,c语言

12、销毁顺序表

由于顺序表开辟了堆区内存,所以我们在使用完顺序表后一定要对开辟的内存进行释放!

void Deatory(AL* al)
{
	assert(al);
	free(al->date);
	al->date=NULL;
	al->capacity = al->size = 0;
}

销毁一个顺序表,将顺序表的容量置为0,顺序表的有效数据个数置为0,将date指针所指向的动态开辟的内存空间释放了,由于释放了动态开辟的内存空间,所有p指向的空间未初始化,date成为野指针,为了防止野指针,将date置为空指针。

数据结构篇之——顺序表的分享到这里就结束了,感谢大家的浏览访问!!!文章来源地址https://www.toymoban.com/news/detail-716386.html

到了这里,关于【数据结构】——顺序表详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(31)
  • 【数据结构】——顺序表详解

    大家好!当我们学习了动态内存管理后,就可以写一个管理数据的顺序表了!!! 顺序表的理解: 线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 顺序表是在计算机内存

    2024年02月08日
    浏览(41)
  • 数据结构:顺序表详解

    线性表(linear list)是n个具有 相同特性的数据元素的有限序列 。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是 在物理结构上并不一定是连续的 。 线性表在物理

    2024年02月14日
    浏览(26)
  • 【数据结构】顺序表详解

    当我们写完通讯录后,顺序表肯定难不倒你,跟着小张一起来学习顺序表吧! 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就

    2024年02月10日
    浏览(38)
  • [数据结构 - C语言] 顺序表

    目录 1、线性表 2、顺序表 2.1 顺序表的概念 2.2 接口 3、接口实现 3.1 初始化 3.2 销毁 3.3 容量检测 3.4 打印数据 3.5 顺序表的头插 3.6 顺序表的尾插 3.7 顺序表的头删、尾删 3.8 顺序表查找 3.9 指定位置插入数据 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性

    2023年04月21日
    浏览(25)
  • 数据结构——顺序表(C语言)

    1.线性表 (1).线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串... (2).线性表在逻辑上是线性结构,也就是说连续的一条直线。但是在物理结构上并不是一定是连续的,线性表

    2024年02月13日
    浏览(36)
  • 【数据结构<顺序表>】C语言

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上

    2024年02月05日
    浏览(29)
  • 数据结构入门 — 顺序表详解

    数据结构入门 — 顺序表详解 博客主页链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 文章末尾有源码 *****感谢观看,希望对你有所帮助***** 顺序表是连续存储的 顺序表是一种线性表的数据结构,它的数据元素按照一定次序依次存储在计算机存储器中,使

    2024年02月11日
    浏览(29)
  • 数据结构之顺序表详解

    hello,大家好,今天的内容是关于顺序表的,其实之前也发过文章,但是那个时候水平还是差了一点,有些地方不是很详细,这次会把每个点都讲清楚,也当给自己在复习一遍。 顺序表在本质上就是数组,顺序表是连续的,我们的数组在内存上也是连续存储的,所以我们可以

    2024年02月06日
    浏览(34)
  • 数据结构(一):顺序表详解

    在正式介绍顺序表之前,我们有必要先了解一个名词:线性表。 线性表: 线性表是,具有n个相同特性的数据元素的有限序列。常见的线性表:顺序表、链表、栈、队列、数组、字符串... 线性表在逻辑上是线性结构,但在物理结构上并不一定是连续的。 1. 顺序表概念 顺序表

    2024年02月13日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包