返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构顺序表中的增删改(头插头删)教程示例详解
  • 307
分享到

C语言数据结构顺序表中的增删改(头插头删)教程示例详解

2024-04-02 19:04:59 307人浏览 安东尼
摘要

目录头插操作头删操作小结头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作。 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没

头插操作

继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作。

和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据。那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖。

在这里插入图片描述

那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后一个位置即可,再利用香香 while 循环一手:

void pushfront(st* s, type x)
{
	assert(s);
	int end = s->size - 1;
	while (end >= 0)
	{
		s->a[end + 1] = s->a[end];//将从后往前的数据都向后挪一位
		end--;
	}
	s->a[0] = x;
	s->size++;
}

我们的 end 下标不是指向 size ,而是size后面一位也就是我们初始的capacity,end = 0时处理的是第一位之后的数据,那么我们while循环时就应该循环到 end<0为止。挪完了就可以sei数据,最后不要忘了让size++。
结果如下:

在这里插入图片描述


我们如果对之前写尾插时的细节记得的话,我们是需要有扩容操作的,这么写过去写过来很难受啊,我们就直接做成接口直接调用岂不美哉?

void enough(st* s)
{
	if (s->size == s->capacity)
	{
		s->capacity *= 2;
		s->a = (type*)realloc(s->a, sizeof(type) * s->capacity);
		if (s->a == NULL)
		{
			printf("扩容失败\n");
			exit(0);
		}
	}
}

头删操作

一样的,在头删操作时不仅要像尾删一样置0,还得把数据挪回去,注意是从前往后挪,不然数据又会被覆盖,最后size–一下就搞定:

void popfront(st* s)
{
	assert(s);
	enough(s);
	int head = 0;
	while (head < s->size - 1)
	{
		s->a[head] = s->a[head + 1]; //从前往后的数据依次向前挪一位
		head++;
	}
	s->size--;
}

结果如下:

在这里插入图片描述

小结

综上所述,顺序表其实就是在数组的基础上保留了一个特性——数据是连续的,但又摆脱了数组固定大小的限制,他适应性超强,随插随删随改。

但是顺序表不是十全十美,我们数据量足够庞大,比如已有一万条数据的空间,我要插入一万零一条,增容就会增到两万,空间浪费率极高。另外,尾插尾删操作是很快的,直接放入拿走数据,这是顺序表最常见的操作,这是他的特长。

但是话说回来,头插头删也很快吗?显然不是,头插头删的时间复杂度是O(n), 代价全在数据挪动上,所以如果要想不挪动的话,就要涉及到链表的引入。但链表在二分查找,排序等方面都有致命缺陷,他不能随机访问,所以链表和顺序表是相辅相成的。

今天就先到这里吧,摸了家人们,更多关于C语言数据结构顺序表增删改的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构顺序表中的增删改(头插头删)教程示例详解

本文链接: https://lsjlt.com/news/139205.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解
    目录头插操作头删操作小结头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作。 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没...
    99+
    2024-04-02
  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解
    目录初始化尾插格局打开尾删初始化 在初步认识顺序表这一结构后,我们就可以继续深入探究这是我之前在.h文件中创建的结构体 typedef int type; typedef struc...
    99+
    2024-04-02
  • C语言数据结构线性表教程示例详解
    目录线性表顺序表线性表 数据结构里我们时常看到什么什么表,线性表是最基本、最简单、也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义: 一个线性表是n...
    99+
    2024-04-02
  • Java数据结构之链表的增删查改详解
    目录一、链表的概念和结构1.1 链表的概念1.2 链表的分类二、单向不带头非循环链表2.1 创建节点类型2.2 头插法2.3 尾插法2.4 获取链表长度2.5 任意位置插入2.6 查...
    99+
    2024-04-02
  • C语言数据结构顺序表的进阶讲解
    目录前言一、顺序表的构造VS功能1.顺序表的构造2.接口实现(功能)二、功能具体分析1.初始化2.销毁3.检查size与capacity是否溢出4.尾增功能(实现)5.打印三、实现具...
    99+
    2024-04-02
  • Go语言数据结构之插入排序示例详解
    目录插入排序动画演示Go 代码实现总结插入排序 插入排序,英文名(insertion sort)是一种简单且有效的比较排序算法。 思想: 在每次迭代过程中算法随机地从输入序...
    99+
    2024-04-02
  • C语言编程数据结构带头双向循环链表全面详解
    目录前言一、什么是带头循环双向链表二、链表初始化三、链表接口函数1.尾插2.头插3.头删4.尾删5.任意位置插入数据6.任意位置删除数据四、打印链表总结前言 上一篇数据结构专栏:C语...
    99+
    2024-04-02
  • C语言 数据结构之数组模拟实现顺序表流程详解
    目录线性表和顺序表线性表顺序表静态顺序表动态顺序表代码已经放在Gitee上,需要可以小伙伴可以去看看 用C语言数组模拟实现顺序表 Gitee 线性表和顺序表 线性表 线性表(line...
    99+
    2024-04-02
  • C语言超详细讲解数据结构中双向带头循环链表
    目录一、概念二、必备工作2.1、创建双向链表结构2.2、初始化链表2.3、动态申请节点2.4、打印链表2.5、销毁链表三、主要功能3.1、在pos节点前插入数据尾插头插3.2、删除p...
    99+
    2024-04-02
  • C语言数据结构之单链表与双链表的增删改查操作实现
    目录前言单链表的增删改查定义结构体以及初始化增加结点删除结点查找修改结点移除结点最终效果双链表的基本操作初始化建表遍历双链表指定位置插入结点指定位置删除结点查找结点位置最终效果结语前...
    99+
    2024-04-02
  • C语言编程简单却重要的数据结构顺序表全面讲解
    目录前言一、线性表定义二、顺序表实现1概念及结构2静态顺序表2.1实现顺序表接口,第一步要对顺序表进行初始化2.2对顺序表的增删查改的接口函数(以尾插为例)3动态顺序表3.1动态顺序...
    99+
    2024-04-02
  • C语言编程数据结构栈与队列的全面讲解示例教程
    目录一、栈的表示和实现1栈的概念和结构2栈的初始化3压栈(栈顶插入一个数据)4出栈(栈顶删除一个数据)5取栈顶元素6取栈顶元素7判断栈是否为空二、队列的表示和实现1队列的概念及结构2...
    99+
    2024-04-02
  • C语言超详细讲解数据结构中的线性表
    目录前言一、分文件编写1、分文件编写概念2、代码展示二、动态分布内存malloc1、初识malloc2、使用方法三、创建链表并进行增删操作1、初始化链表2、在链表中增加数据3、删除链...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作