顺序表—C语言实现数据结构

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

本期带大家一起来用C语言代码实现顺序表🌈🌈🌈


顺序表—C语言实现数据结构

一、顺序表的概念✅

顺序表是一段物理地址连续的存储单元,依次存储数据元素的线性结构。分为静态顺序表与动态顺序表。 🍊 🍋 🍒

二、顺序表的结构✅

静态顺序表:使用定长数组用来存储数据
优点:操作简单,代码实现容易
缺点:定长数组很受限制,数组开小了不够用,开大了又浪费
顺序表—C语言实现数据结构

动态顺序表:使用动态开辟的数组进行存储数据
优点:数组可以根据自己的需求进行调解
缺点:代码过于复杂
顺序表—C语言实现数据结构

三、顺序表的实现(动态顺序表)✅

这里先建立三个文件:
1️⃣ :SeqList.h文件,用于函数声明
2️⃣ :SeqList.c文件,用于函数的定义
3️⃣ :Test.c文件,用于测试函数
建立三个文件的目的: 将顺序表作为一个项目来进行书写,方便我们的学习与观察。

一、🔶定义顺序表结构体🔶

顺序表结构体里面的成员基本的有
指向动态开辟的空间的指针a🐸
当前顺序表当中存储的数据个数size🐸
以及顺序表当前的容量capacity🐸

typedef int SLTDataType;

typedef struct SListNode
{
	SLTDataType* a;
	int size;
	int capacity;

}SL;

这里我们使用typedef对我们所存储的数据,以及顺序表结构体重命名,方便我们后续修改 🍊 🍋 🍒

二、🔶接口的实现🔶

1.接口:初始化结构体(SLInit)🎈💡

这里我们对结构体里面的内容进行初始化
顺序表—C语言实现数据结构
初始化为容量为4,所存储的数据个数为0,并且利用malloc函数进行动态开辟

void SLInit(SL* psl)
{
	assert(psl);

	psl->a = (SLTDataType*)malloc(sizeof(SLTDataType) * 4);
	if (psl->a == NULL)
	{
		perror("psl::null");
		return;
	}
	psl->capacity = 4;
	psl->size = 0;

}

2.接口:扩容顺序表🎈💡

我们往顺序表当中添加数据的时候,需要判断顺序表当中数据的个数是否达到了最大容量
如果达到了最大容量,则进行扩容🍗 🍖

void SLCheckCapacity(SL* psl)
{
	if (psl->size == psl->capacity)
	{
		SLTDataType* tmp = (SLTDataType*)realloc(psl->a,sizeof(SLTDataType) * psl->capacity * 2);
		if (tmp == NULL)
		{
			perror("realloc:null");
			return;
		}
		psl-> a= tmp;
		psl->capacity *= 2;
	}
}
3.接口:头插数据🎈💡

当我们需要在顺序表的开头第一个位置插入数据的时候,我们需要进行如下操作🍗 🍖 🍝

错误想法:

顺序表—C语言实现数据结构

这里是引用但是当我们从前面往后面进行覆盖的话,那么原来的数据都会被覆盖掉,所以这是一个错误的想法🍗 🍖 🍝

正确想法:
顺序表—C语言实现数据结构顺序表—C语言实现数据结构

void STLpushfront(SL* psl, SLTDataType s)
{
	SLCheckCapacity(psl);

	for (int i = 0; i < psl->size; i++)
	{
		psl->a[psl->size - i] = psl->a[psl->size - i - 1];

	}
	psl->a[0] = s;

	psl->size++;
}
4.接口:尾插数据🎈💡

尾插数据相对于头插数据来说是比较简单的🚀 🛸 🚁
首先我们需要先检查顺序表当中的有效数据是否已经达到了当前的容量然后
只需要将我们需要插入的数据插在顺序表当中有效数据的后面一个就行
同时让我们顺序表当中的有效数据加一即可 🍗 🍖 🍝

void STLpushback(SL* psl,SLTDataType s)
{
	SLCheckCapacity(psl);
	psl->a[psl->size] = s;
	psl->size++;

}
5.接口:头删数据🎈💡

我们删除数据的时候,需要将头部的数据进行删除
这时候我们需要采取覆盖的原理来实现
顺序表—C语言实现数据结构

void SLPopFront(SL* psl)
{
	if (psl->size == 0)
	{
		printf("顺序表当中数据为空\n");
		return;
	}
	
	for (int i = 0; i < psl->size; i++)
	{
		psl->a[i] = psl->a[i + 1];

	}
	psl->size--;

}

6.接口:尾删数据🎈💡

尾删数据的话同尾插数据的原理是一样的
只需要将顺序表当中的有效数据的个数进行变化就行🚀 🛸 🚀 🛸

void SLPopBack(SL* psl)
{
	if (psl->size == 0)
	{
		printf("顺序表当中数据为空\n");
		return;
	}
	psl->size--;
}

7.接口:在指定位置插入数据(SLInsert)🎈💡

当然,添加数据的话不仅仅局限于我们的头插和尾插数据
还可以是在指定下标pos进行插入数据
函数的原型:void SLInsert(SL* ps, int pos, SLDateType x)
注意:要实现这一功能,我们依然需要一个end下标,数据从后往前依次后挪,直到pos下标移动完毕🚀 🛸
另外,别忘了检查容量。

顺序表—C语言实现数据结构
我们首先需要找到当前顺序表最后一个位置的数据
然后将前面的数据赋给后一个位置⌛️ ⏳
直到找到我们的pos位置,将我们需要添加的数据添加到顺序表当中
同样在开始的时候需要检查是否扩容

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

	psl->a[pos] = x;
	psl->size++;

}

函数拓展:该功能其实也可以实现头插和尾插,所以我们可以在头插和尾插中复用该功能

// 头插
void SeqListPushFront(SL* ps, SLDataType x)
{
	SeqListInsert(ps, 0, x);
}
 
// 尾插
void SeqListPushBack(SL* ps, SLDataType x)
{
	SeqListInsert(ps, ps->sz, x);
}
8.接口:在指定位置删除数据🎈💡

同我们的在指定位置添加数据一样
当我们需要在指定位置删除数据的时候⌛️ ⏳
我们需要传入一个下标pos进行删除的操作

然后我们需要将从下标开始的数据改为下标+1的数据

例如 a=a+1

顺序表—C语言实现数据结构

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

	psl->size--;

}

函数拓展:该功能其实也可以实现头删和尾插=删,所以我们可以在头删和尾插】删中复用该功能

// 头删
void SeqListPopFront(SL* ps)
{
	SeqListErase(ps, 0);
}
 
// 尾删
void SeqListPopBack(SL* ps)
{
	SeqListErase(ps, ps->sz - 1);
}
9.接口:查找某一个数据的位置(SLFind)🎈💡

查找顺序表当中是否存在某个数据

如果存在的话就返回所对应的下标
不存在的话则返回-1

int SLFind(SL* psl, SLTDataType x)
{

	for (int i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
			return i;
	}
	return -1;
}

10.接口:修改指定下标的数据🎈💡

首先判断传入的下标是否合法❓❓❓
合法的话则将对应下标的数据修改

void SLModify(SL* psl, int pos, SLTDataType x)
{
	assert(psl);

	assert(0 < pos && pos < psl->size);

	psl->a[pos] = x;
}
接口11:打印函数(SLprint)🎈💡

主要利用顺序表当中有效数据的个数进行数据的打印🌎 🌍

void SLprint(SL* psl)
{

	assert(psl);

	for (int i = 0; i < psl->size; i++)
	{
		/*printf("%d ", *(psl->a + i));*/

		printf("%d ", psl->a[i]);
	}
	printf("\n");

}
接口12:销毁(SLDestory)🎈💡

由于我们的顺序表是动态开辟出来的的
所以我们需要在结束程序的时候需要将开辟出来的空间进行销毁
避免内存泄漏🌎 🌍

void SLDestroy(SL* psl)
{
	assert(psl);
	free(psl->a);

	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;

}

四、顺序表的应用小项目✅

顺序表实现通讯录

五、感谢与交流✅

🌹🌹🌹如果大家通过本篇博客收获了,对顺序表有了新的了解的话
那么希望支持一下哦如果还有不明白的,疑惑的话,或者什么比较好的建议的话,可以发到评论区,
我们一起解决,共同进步 ❗️❗️❗️
最后谢谢大家❗️❗️❗️💯💯💯

顺序表—C语言实现数据结构文章来源地址https://www.toymoban.com/news/detail-423391.html

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

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

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

相关文章

  • 【C语言数据结构】模拟·顺序表·总项目实现

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 我在上一篇博客中,

    2024年02月15日
    浏览(31)
  • 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月08日
    浏览(30)
  • 【数据结构】线性表的顺序存储结构及实现——C语言版

    线性表的顺序存储结构称为 顺序表 ,其基本思想是 用一段地址连续的存储单元一次存储线性表的数据元素。 设顺序表的每个元素占用 c 个存储单元,则第 i 个元素的存储地址为: 所以, 只要确定了存储顺序表的起始地址(即基地址),计算任意一个元素的存储地址的时间

    2024年03月15日
    浏览(39)
  • 【数据结构】链表OJ题(顺序表)(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年02月05日
    浏览(37)
  • 【数据结构】C语言实现顺序栈(附完整运行代码)

    🦄 个人主页 :修修修也 🎏 所属专栏 :数据结构 ⚙️ 操作环境 : Visual Studio 2022 在本次项目中我们的目标是 实现一个 顺序栈 : 该 顺序栈 使用 动态内存分配空间 ,可以用来 存储任意数量的同类型数据 . 顺序栈 结构体 需要包含 三个要素 : 存放数据的数组arr,栈顶元素下标top

    2024年04月29日
    浏览(24)
  • 数据结构之顺序表的实现(C语言版)

         Hello, 大家好,我是一代,今天给大家带来有关顺序表的有关知识      所属专栏:数据结构      创作不易,望得到各位佬们的互三呦 1.首先在讲顺序表之前我们先来了解什么是数据结构 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据?常见的数值1、

    2024年04月25日
    浏览(34)
  • 数据结构初阶之顺序表(C语言实现)

    顺序表是数据结构里面很基础的一类,它是线性表的一种,其它线性表还有链表、栈和队列等,今天来和博主一起学习关于顺序表的知识吧。 顺序表,它分为两类: 动态顺序表 和 静态顺序表 ,这两个表的区别就是 前者的空间不固定 ,是 支持扩容 的,后者的 空间是固定

    2024年02月03日
    浏览(34)
  • 【数据结构】顺序表基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(42)
  • 【数据结构】详谈队列的顺序存储及C语言实现

    大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们在介绍完队列的基本概念、重要术语以及基本操作后,又回顾了一下数据结构的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。 队列这种数据结构我们已经介绍了它的逻辑结构以及数据运算的定义

    2024年01月21日
    浏览(63)
  • C语言数据结构-----顺序表(多功能动态顺序表的代码实现)

    本篇讲述了顺序表的相关知识,以及动态顺序表的代码实现。 顺序表和链表一般情况下都会叫他们线性表。 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性

    2024年02月07日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包