数据结构(C语言实现)——顺序表的介绍及基本操作的实现

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

1. 前言

今天我们来学习数据结构中的线性表,本文主要介绍一种常见的线性表——顺序表。
本文着重介绍顺序表的概念以及顺序表各种基本操作的实现过程(C语言实现),以后会更新更多的数据结构,觉得有用的朋友可以三连关注一波,一起学习。

2. 正文

2.1 线性表

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

接下来就先给大家介绍顺序表的相关知识。

2.2 顺序表的概念

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

2.3 静态顺序表

使用定长数组存储元素。

//顺序表的静态存储
#define N 100
typedef int SLDateType;

//静态顺序表 - N太小,可能不够用,N太大,可能造成内存浪费
struct SeqList
{
	SLDateType a[N];//定长数组
	int size;//有效数据个数
};

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

2.4 动态顺序表

使用动态开辟的数组存储。

//顺序表的动态存储

typedef int SLDateType;

typedef struct SeqList
{
	SLDateType* a;//指向动态数组的指针
	int size;//有效数据个数
	int capacity;//容量空间的大小
}SL;

2.5 接口实现

顺序表能够实现尾部插入删除,头部插入删除,查找,修改等功能。接下来我们就来实现顺序表的各种接口功能。

2.5.1 顺序表初始化

不论怎么样,第一步都应该是初始化数据,以便其他功能正常使用。

void SLInit(SL* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

2.5.2 顺序表扩容

因为我们初始化时并没有赋予初始大小,所以第一步就应该检查空间,如果空间不足就扩容,后面的每次插入操作,都要检查空间大小。

void SLCheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		int newcapacity = ((ps->capacity == 0) ? 4 : (ps->capacity * 2));
		SLDateType* tmp = (SLDateType*)realloc(ps->a, newcapacity * (sizeof(SLDateType)));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
		printf("扩容成功\n");
	}
}

2.5.3 顺序表尾部插入

在顺序表最后的位置插入一个数据,实现的时候要主要先检查空间大小,插入成功后,有效数据个数要加1。

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

2.5.4 顺序表尾部删除

直接让有效数据个数减1即可,但要注意,有效数据个数不能小于0,否则再进行插入就会出现越界访问的问题。

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

2.5.5 顺序表头部插入

首先检查空间大小,然后让所以数据向后移动一个位置即可,但要注意数据移动时的先后顺序,应该从最后一个数据开始移动,依次向前,这样可以防止数据被覆盖导致程序出现错误,最后让有效数据个数加1。

void SLPushFront(SL* ps, SLDateType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;
}

2.5.6 顺序表头部删除

这里可以让第2个数据开始依次向前覆盖,最后有效数据个数减1即可。

void SLPopFront(SL* ps)
{
	assert(ps);
	int begin = 0;
	while (begin < ps->size - 1)
	{
		ps->a[begin] = ps->a[begin + 1];
		begin++;
	}
	ps->size--;
}

2.5.7 顺序表在任意位置插入和删除

任意位置插入与头部插入类似,只不过是起始位置改变了,整体思想不变。
任意位置删除也与头部删除类似,改变起始位置即可,但在插入和删除时要注意输入的位置要在有效范围内。

任意位置插入:

void SLInsert(SL* ps, int pos, SLDateType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

任意位置删除:

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

2.5.8 顺序表查找和修改

顺序表的查找和修改非常简单,查找只需要遍历数据,如果找到,返回下标即可,修改时只要修改位置是合法的,直接修改数据即可。

查找:

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

修改:

void SLModify(SL* ps, int pos, SLDateType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size - 1);
	ps->a[pos] = x;
}

2.5.9 顺序表打印和销毁

顺序表打印和销毁也比较简单,打印时只要遍历数据并依次打印即可。
因为我们顺序表的空间是动态开辟的,所以使用完一定要销毁,释放掉动态开辟的内存,避免出现内存泄漏的问题。

打印:

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

销毁:

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

3. 结尾

到这里,顺序表基本操作的实现就介绍完了,顺序表是数据结构里比较简单的一种结构,所以内容不是特别多,如果大家看完觉得有收获的话可以三连关注一波,十分感谢各位朋友的支持,最后,感谢大家的耐心阅读。文章来源地址https://www.toymoban.com/news/detail-412146.html

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

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

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

相关文章

  • 【数据结构】顺序表的实现及基本操作完整代码(C语言实现)

    顺序表:逻辑上相邻的数据元素,其物理次序也是相邻的 这里之所以要把int分别创建新名字为SqlElemType和Status,是因为实际应用时数据的类型不一定是int型,这样设置方便修改元素类型,提高代码适用性。 LocateElem的时间复杂度为O(n) InsertSq的时间复杂度为O(n) DeleteSq的时间

    2024年04月12日
    浏览(39)
  • 数据结构-顺序表的基本实现(C语言,简单易懂,含全部代码)

    今天起开始编写数据结构中的各种数据结构及算法的实现,说到顺序表,我们首先得了解下线性表。 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻

    2023年04月08日
    浏览(30)
  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(41)
  • 数据结构入门(C语言)顺序表的增删查改

    本章会用C语言来描述数据结构中的顺序表,实现简单的增删查改操作,其中头文件包含在新建的头文件SeqList.h内,顺序表的实现在新建的Seqlist.c内,主函数Text.c将会实现菜单,方便我们进行功能的选择。 顺序表是用一段物理地址 连续 的存储单元依次存储数据元素的线性结构

    2024年02月03日
    浏览(38)
  • 数据结构入门(C语言版)线性表中顺序表介绍及接口实现

    C语言的学习结束,就该入门数据结构了呦 不论在程序员的工作上,还是在学习或是考研上,数据结构都是一门非常重要且值得我们一直研究探索的学科,可以说数据结构和算法就是编程的核心。OK,接下来我们来到数据结构的入门第一步就是学习线性表,接下来由作者来详细

    2023年04月12日
    浏览(35)
  • 【数据结构】--顺序表的实现

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

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

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

    2024年02月07日
    浏览(36)
  • 数据结构(C语言实现)——栈和队列的介绍及基本操作的实现(动态顺序栈+链队)

    今天我们来学习另外两个线性结构——栈和队列,栈和队列是操作受限的线性表,因此,可称为限定性的数据结构。 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守

    2023年04月19日
    浏览(33)
  • 数据结构1:动态顺序表的实现

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

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

    2024年04月26日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包