数据结构(C):玩转顺序表

2024-06-04 9722阅读

数据结构(C):玩转顺序表 第1张数据结构(C):玩转顺序表 第2张

🍺0.前言

🎷1.线性表

🎸2.顺序表

📀动态顺序表的实现

💿初始化

💿检查容量是否满了,进行扩容

💿插入:头插和尾插

💿删除:头删和尾删

💿查找

💿销毁

💿打印

💿在某处插入和删除

💎6.结束语


🍺0.前言

        言C之言,聊C之识,以C会友,共向远方。各位博友的各位你们好啊,这里是持续分享数据结构知识的小赵同学,今天要分享的数据结构知识是顺序表,在这一章,小赵将会向大家展开聊聊顺序表。✊

数据结构(C):玩转顺序表 第3张

🎷1.线性表

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

 也就是说我们今天要谈的顺序表就属于我们的线性表。

🎸2.顺序表

顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存 储。在数组上完成数据的增删查改。 顺序表一般可以分为: 1. 静态顺序表:使用定长数组存储元素。 2.动态顺序表:使用动态开辟的数组存储。

好了下面我们来看看究竟怎么样才是一个顺序表,其实很简单,小赵在这里给各位画个图

数据结构(C):玩转顺序表 第4张

怎么样它的样子是不是非常的眼熟,没错我们的线性表其实就是我们的数组。那为什么有静态和动态之分呢?因为一个可以不断增长自己的内存,一个则是固定容量,那该如何实现呢?下面小赵将会带着大家去实现顺序表。

因为静态顺序表其实和动态的线性表差距不大,而且静态顺序表本身也并不常用(开大了浪费,开小了,不够),所以小赵在这里主要带着大家去实现我们的动态顺序表。

📀动态顺序表的实现

那么动态的顺序表该如何实现呢?在这里为了方便我们在后续知道什么时候该进行扩大我们的数组,我们就用我们的结构体去实现我们的线性动态表。

typedef int SeqDataType;
struct Seqlist
{
	SeqDataType* a;//指向动态开辟的数组
	int size;//顺序表已存元素个数
	int capacity;//顺序表容量
};

 那么这样当我们的size 等于我们的capacity的时候我们就可以对我们的数组进行扩容了。

那么对于我们的顺序表,光有这个是不够的,还要具备增删查改,初始化等等功能,下面带着大家一一来实现

💿初始化:

首先是初始化的操作

typedef struct Seqlist SL;
void InitSeq(SL* psl)
{
	assert(psl);//防止传入空指针
	psl->a = NULL;
	psl->capacity = 0;
	psl->size = 0;
}

💿检查容量是否满了,进行扩容

void SLCheckcapacity(SL* psl)
{
	assert(psl);
	if (psl->capacity == psl->size)
	{
		int newcapacity = (psl->capacity==0?4: psl->capacity *2);//如果原容量为零则返回4,其他返回原容量的两倍
		SeqDataType *tmp = (SeqDataType*)realloc(psl->a ,sizeof(SeqDataType) *newcapacity);//reallc新数组
		if (tmp == NULL)
		{
			perror("malloc failed");
			return;
		}
		psl->a = tmp;
		psl->capacity = newcapacity;
	}
}

💿插入:头插和尾插

这里的头插要稍微注意一下,就像我们站个队,忽然要我们在前面给个位子一样,那么我们是不是后面的人都要向后移动,那么如何向后移动呢,如果是从头移动,我们会发现下面的问题。

数据结构(C):玩转顺序表 第5张

我们会发现我们前面的数字会盖住后面的数字,那么这里最后的办法就是后面向后移动,给出位子。

数据结构(C):玩转顺序表 第6张

然后就可以顺利解决了。代码如下

void SLPushFront(SL* psl, SeqDataType x)
{
	assert(psl);
	SLCheckcapacity(psl);//检查容量
	int n = psl->size-1;
	while (n--);//将所有元素向后移动
	{
		psl->a[n + 1] = psl->a[n];
	}
	psl->a[0] = x;
	psl->size++;
}

 尾插就相对比较容易了。

void SLPushBack(SL* psl, SeqDataType x)
{
	assert(psl);
	SLCheckCapacity(psl);
	psl->a[psl->size++] = x;
}

💿删除:头删和尾删

这里的头删的思路和我们的头插的思路很像,只是这里是头边有空位

void SLPopFront(SL* psl)
{
	assert(psl);
	assert(psl->size);//防止元素个数为0
	int n = 1;
	while (n size)
	{
		psl->a[n-1] = psl->a[n];//把后面的往前移
        n++;
	}
	psl->size--;
}

尾删则相对容易些: 

void SLPopBack(SL* psl)
{
	assert(psl);
	assert(psl->size);//防止元素个数为0
	psl->size--;
}

💿查找:

int SLFind(SL* psl, SeqDataType x)
{
	assert(psl);
	int n = 0;
	while (nsize)
	{
		if (psl->a[n] == x)//找到了返回对应位置
			return n;
		n++;
	}
	return -1;//找不到
}

💿销毁:

void SLDestory(SL* psl)
{
	assert(psl);
	free(psl->a);
	psl->a = NULL;
	psl->capacity = 0;
	psl->size = 0;
}

💿打印:

void SLPrint(SL* psl)
{
	assert(psl);
	int n = 0;
	while (n size)
	{
		printf("%d", psl->a[n]);
		n++;
	}
}

💿在某处插入和删除:

在某处的插入和删除对于逻辑的考察是有的,那么我们先看看如何进行插入:

数据结构(C):玩转顺序表 第7张

比方说,我要在三这个位置进行插入操作,那么这个时候3,4,5这几个数字是不是要向后移动,那么其就很像我们的头删,都是从尾部开始向后移动,来完成的。

void SLInsert(SL* psl, int pos, SeqDataType x)
{
	assert(psl);
	assert(0 size-1;
	while (end >= pos)
	{
		psl->a[end + 1] =psl->a[end];
		end--;
	}
	psl->a[pos] = x;
	psl->size++;
}

接下来是某个位置的删除,类比头删

void SLErase(SL* psl, int pos, SeqDataType x)
{
	assert(psl);
	assert(0 size);
	int end = pos;
	while (endsize-1)
	{
		psl->a[end] = psl->a[end+1];
		end++;
	}
	psl->size--;
}

 然后我们还可以用这两个代码改我们原本的头尾插,头尾删

void SLPushFront(SL* psl, SeqDataType x)
{
	SLInsert(psl, 0, x);
}
void SLPushBack(SL* psl, SeqDataType x)
{
	SLInsert(psl, psl->size, x);
}
void SLPopFront(SL* psl)
{
	SLErase(psl, 0);
}
void SLPopBack(SL* psl)
{
	SLErase(psl, psl->size-1);
}

 数据结构(C):玩转顺序表 第8张

💎6.结束语

好了小赵今天的分享就到这里了,如果大家有什么不明白的地方可以在小赵的下方留言哦,同时如果小赵的博客中有什么地方不对也希望得到大家的指点,谢谢各位家人们的支持。你们的支持是小赵创作的动力,加油。

数据结构(C):玩转顺序表 第9张

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持小赵,如有不足还请指点,小赵及时改正,感谢大家支持!!!数据结构(C):玩转顺序表 第10张 


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]