【hello 数据结构】Chapter2-顺序表

瞳绣的博客

每天进步一点点,希望的火苗不熄灭。


目录

 一、什么是顺序表?

 二、顺序表的相关操作

1.顺序表的定义

 2. 顺序表的接口函数

 3. 顺序表接口函数的实现


今天来整理一下顺序表的相关知识,希望在整理复习的同时所写的内容也能够帮助到大家。百密一疏,如果在阅读的过程中遇见有错的知识点还请大家评论指出🙌,蟹蟹大家😘

 一、什么是顺序表?

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

✨划重点:顺序表是线性表的一种,其逻辑结构是连续的,物理结构连续的。

在这里简单提一下:什么是逻辑结构?什么是物理结构?用最简单的话来说:

逻辑结构是面向与我们用户的,我们能够实际看到的一种结构。例如我们在排队时后面的一个人挨着前面的一个人,由此可以将其形象化为顺序结构;大千世界我们认识的人很多,也能过被多人所认识,构成了错综复杂的交际网,在以后的学习中我们会用图(一种数据结构)来描述它。

😊在这里向大家分享一个有意思的事情:六度空间理论,不知道大家有没有听过,有兴趣的可以去看下。

六度空间理论(科学理论)_360百科

逻辑结构呢,是指我们将一个数据?存储在计算机内存中,如果连续存放则是顺序结构,如果不连续存放,而是用一个个指针链接起来,这种称谓链性结构。

在下一篇中我们会讲到链表的存储,请大家敬请期待!

 二、顺序表的相关操作

1.顺序表的定义

🤝今天我主要讲解的是动态顺序表的内容,需要了解静态顺序表的友友们可以跳过奥~~ 

//顺序表的定义
typedef int SeqListDatatype;    //便于修改顺序表存储的数据类型
typedef struct SeqList
{
	SeqListDatatype* a;        //动态开辟的指针
	int size;                //顺序表实际存储数据的个数
	int capacity;        //顺序表的最大容量
}SeqList;

 2. 顺序表的接口函数

👼为了便于大家更为方便的使用顺序表,顺序表是存在一些已经完成功能的接口函数的。

//顺序表的初始化
void SeqListInit(SeqList* p);

//顺序表的销毁
void SeqListDestroy(SeqList* p);

//检查顺序表是否已满
void SeqListChakeCapacity(SeqList* p);

//头插
void SeqListPushFront(SeqList* p, SeqListDatatype x);

//头删
void SeqListPopFront(SeqList* p);

//尾插
void SeqListPushBack(SeqList* p, SeqListDatatype x);

//尾删
void SeqListPopBack(SeqList* p);

//在任意位置插入
void SeqListInsert(SeqList* p,size_t pos,SeqListDatatype x);

//在任意位置删除
void SeqListDelet(SeqList* p, size_t pos);

//查找任一元素
int SeqListFind(SeqList* p, SeqListDatatype x);

//打印顺序表
void SeqListPrint(SeqList* p);

 3. 顺序表接口函数的实现

😜顺序表虽然是存在接口函数的,但我们作为一个数据结构的初学者,是不是该自己动手来实现一下这些函数呢?这样不仅会使我们更好的理解函数的功能,也会更好的锻炼我们的逻辑思维能力和实际动手能力,为我们以后学习更为复杂的数据结构打下更为坚实的基础。

  • 初始化顺序表
//顺序表的初始化
void SeqListInit(SeqList* p)
{
	p->a = NULL;
	p->size = p->capacity = 0;
}
  • 销毁顺序表 
//顺序表的销毁
void SeqListDestroy(SeqList* p)
{
	assert(p);
	free(p->a);
	p->a = NULL;
	p->size = p->capacity = 0;
}
  • 给顺序表扩容 
//检查顺序表是否已满
void SeqListChakeCapacity(SeqList* p)
{
	assert(p);
	if (p->size == p->capacity)
	{
		size_t newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;
		SeqListDatatype* tmp = (SeqListDatatype*)realloc(p->a, sizeof(SeqListDatatype) * newcapacity);
		if (tmp != NULL)
		{
			p->a = tmp;
			p->capacity = newcapacity;
		}
	}
}
  • 头插和头删
//头插
void SeqListPushFront(SeqList* p, SeqListDatatype x)
{
	SeqListChakeCapacity(p);
	size_t tmp = p->size;
	while (tmp >0)
	{
		p->a[tmp] = p->a[tmp - 1];
		tmp--;
	}
	p->a[0] = x;
	p->size++;
}

//头删
void SeqListPopFront(SeqList* p)
{
	assert(p);
	if (p->size > 0)
	{
		for (int i = 1; i < p->size; i++)
		{
			p->a[i - 1] = p->a[i];
		}
	}
	p->size--;
}
  • 尾插和尾删
//尾插
void SeqListPushBack(SeqList* p, SeqListDatatype x)
{
	SeqListChakeCapacity(p);
	p->a[p->size] = x;
	p->size++;
}

//尾删
void SeqListPopBack(SeqList* p)
{
	assert(p);
	if (p->size > 0)
	{
		p->size = p->size - 1;
	}
}
  • 在任意位置插入和删除
//在任意位置插入
void SeqListInsert(SeqList* p,size_t pos, SeqListDatatype x)
{
	assert(p != NULL && pos >= 0 && pos <= p->size);
	SeqListChakeCapacity(p);
	for (int i = p->size; i > pos; i--)
	{
		p->a[i] = p->a[i - 1];
	}
	p->a[pos] = x;
	p->size++;
}

//在任意位置删除
void SeqListDelet(SeqList* p, size_t pos)
{
	assert(p!=NULL&&pos>=0&&pos<p->size);
	if (p->size > 0)
	{
		for (int i = pos; i < p->size-1; i++)
		{
			p->a[i] = p->a[i + 1];
		}
	}
	p->size--;
}
  • 查找任意元素
//查找任一元素
int SeqListFind(SeqList* p, SeqListDatatype x)
{
	assert(p);
	for (int i = 0; i < p -> size; i++)
	{
		if (p->a[i] == x)
			return i;
	}
	return -1;
}
  • 打印顺序表
//打印顺序表
void SeqListPrint(SeqList* p)
{
	assert(p);
	for (int i = 0; i < p->size; i++)
		printf("%d->", p->a[i]);
	printf("NULL\n");
}

🔮以上便是整个顺序表的内容,但是最后有一点是提醒我自己,也是提醒大家:

我们为顺序表动态开辟内存空间时,是为p->a开辟的,而不是为p开辟的;在用完顺序表需要销毁时,我们只需要free(p->a)即行,删除数据的时候是不需要free()的,这点一定要记住,因为顺序表在内存中是连续存放的free(p->a)后面的内存也会随之释放的。

感谢大家的阅读,谢谢大家,明天更新单链表奥~🛴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞳绣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值