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

目录
  • 初始化
  • 尾插
  • 格局打开
  • 尾删

初始化

在初步认识顺序表这一结构后,我们就可以继续深入探究
这是我之前在.h文件中创建的结构体

typedef int type;
typedef struct list
{
	type* a;
	int size;
	int capacity;
}st;

在处理顺序表结构时我们会用到的一些接口,处理其中的关系,其实本质上就是函数,这里我用复杂英文对应出来方便形成记忆。

void init(st *s);  //插入
void pushback( st* p, type x);//尾插
void popback(st* p); //尾删
void pushfront( st* p, type x); //头插
void popfront(st* p);   //头删
void insert(st* p, int n, type x);  //中间位置插入
void erase(st* p, int n);  //中间位置删处

我用 init 函数实现简单的初始化,首先会先把结构体成员传过来,注意再次强调区别形参和实参,传值调用肯定会报错滴,乖乖的换成指针,其实不论是不是传址调用,我们都可以搞成指针传过去,为了保险起见。
我们第一步肯定是开辟空间,先用 malloc 函数参上,当然,null 还玩个屁屁,为了先避免掉这种情况,我们就 if 意思一下,然后给初始有效位设为 0,初始容量设为 5。

void init(st *s)
{
	s->a = (type*)malloc(sizeof(type) * 4);
	if (s->a == NULL)
	{
		printf("申请内存失败!\n");
		exit(-1);
	}
	s->size = 0;
	s-> capacity = 1;
}

尾插

然后就开始pushback 尾插操作:

void pushback(st* s, type x)
{
	assert(s);//空指针判断
	s->a[s->size] = x;
	s->size++;
}

还是老规矩,assert 断言是否为空指针,再放行。往下就简单的,把x的值放入数组的size 位置上,让 size ++即可。

但是 malloc 这种的指针是指向独立不连续的空间,我们监视窗口观察也只能看到一个个不连续的值,所以还是要老老实实搞一个打印函数,和数组一样,直接遍历一下我们++过的size即可:

void print(st* s)
{
	assert(s);
	int i = 0;
	for(i = 0; i < s->size; i++)
	{
		printf("%d ", s->a[i]);
	}
}

结果如下:

格局打开

但是奇不奇怪,我 capacity 初始设定为 1,而我却尾插了两个数还没有报错,为什么捏?其实报错了一定是你越界了,但没有报错不代表你就没有越界,往往有些越界是检查不出来的,因为还没走到检查的点上;就好比咱卷了不一定成功但不卷就一定不会成功。
所以我们的逻辑就要进行更替:

	if (s->size >= s->capacity)
		s->capacity++;

在assert 后加上 if 判断句,让容量随有效位及时更新,但是又有一个问题,当我数据量非常大时,我们使用一位开辟一位的方法让 capacity++ 非常频繁,但一下子开辟一大片空间有会浪费资源,到后面已有数据越多开辟越大浪费的越多怎么办呢?我们比较普遍的做法就是开辟 2 倍:

	if (s->size == s->capacity)
	{
		s->capacity *= 2;
		s->a = (type*)realloc(s->a, sizeof(type) * s->capacity);
	}

这里敏感的朋友应该张口就来realloc,realloc函数会对已有空间直接扩容,但不一定是原地扩容,后面有足够的空间就会原地扩容,但是不够就会找一块新的空间将数据拷贝过去再释放掉原来空间。上面代码将原来的空间给realloc,再增容到我要的空间,就能很好的满足我们的要求。

尾删

尾删没什么技术含量,和我们数组的思路一样

void popback(st* s)
{
	assert(s);
	s->size--;
}

结果如下:

以此类推,头插头删是一个道理,不做赘述,更多关于C语言数据结构顺序表增删改的资料请关注我们其它相关文章!

(0)

相关推荐

  • 用C语言举例讲解数据结构中的算法复杂度结与顺序表

    数据结构算法复杂度 1.影响算法效率的主要因素 (1)算法采用的策略和方法: (2)问题的输入规模: (3)编译器所产生的代码: (4)计算机执行速度. 2.时间复杂度 // 时间复杂度:2n + 5 long sum1(int n) { long ret = 0; \\1 int* array = (int*)malloc(n * sizeof(int)); \\1 int i = 0; \\1 for(i=0; i<n; i++) \\n { array[i] = i + 1; } for(

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

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • C语言 单向链表的增删查改快速掌握

    目录 前言 一.创建 二.单向链表的函数声明 三.函数实现 1.创建节点 2.尾插节点 3.头插 4.尾删 5.头删 6.查找节点 7.修改 总结 前言 链表是线性表的链式存储结构,它可以以O(1)的时间复杂度进行插入或者删除,同时由于是链式结构相比顺序表而言,不会存在空间浪费的情况.而链表又分为带头单向链表,不带头单向链表,带头循环链表,不带头循环链表,带头双向循环链表,不带头双向循环链表,带头双向链表,不带头双向链表,总共有八种,其中结构最简单的是不带头单向链表,也是实现起来最容易出错的.并

  • C语言编程数据结构线性表之顺序表和链表原理分析

    目录 线性表的定义和特点 线性结构的特点 线性表 顺序存储 顺序表的元素类型定义 顺序表的增删查改 初始化顺序表 扩容顺序表 尾插法增加元素 头插法 任意位置删除 任意位置添加 线性表的链式存储 数据域与指针域 初始化链表 尾插法增加链表结点 头插法添加链表结点 打印链表 任意位置的删除 双向链表 测试双向链表(主函数) 初始化双向链表 头插法插入元素 尾插法插入元素 尾删法删除结点 头删法删除结点 doubly-Linked list.c文件 doubly-Linkedlist.h 线性表的定

  • C语言数据结构之顺序表和单链表

    一.顺序表的创建.删除和插入 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct sqlist { int date[10]; int length; }; void InitList(sqlist& L) { for (int i = 0;i < 10;i++) { L.date[i] = 0; } L.length = 0; } void charu(sqlist& L) { for (int j =

  • C语言编程简单却重要的数据结构顺序表全面讲解

    目录 前言 一.线性表定义 二.顺序表实现 1概念及结构 2静态顺序表 2.1实现顺序表接口,第一步要对顺序表进行初始化 2.2对顺序表的增删查改的接口函数(以尾插为例) 3动态顺序表 3.1动态顺序表初始化 3.2动态顺序表-尾插 3.3动态顺序表-头插 3.4动态顺序表-尾删 3.5动态顺序表-头删 3.6动态顺序表-任意位置插入数据 3.7动态顺序表-任意位置删除数据 结束 前言 本文主要介绍顺序表的定义和常见静态顺序表的用法. 一.线性表定义 线性表(line list)是n个具有相同特

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

    目录 初始化 尾插 格局打开 尾删 初始化 在初步认识顺序表这一结构后,我们就可以继续深入探究这是我之前在.h文件中创建的结构体 typedef int type; typedef struct list { type* a; int size; int capacity; }st; 在处理顺序表结构时我们会用到的一些接口,处理其中的关系,其实本质上就是函数,这里我用复杂英文对应出来方便形成记忆. void init(st *s); //插入 void pushback( st* p, type

  • C语言数据结构顺序表的进阶讲解

    目录 前言 一.顺序表的构造VS功能 1.顺序表的构造 2.接口实现(功能) 二.功能具体分析 1.初始化 2.销毁 3.检查size与capacity是否溢出 4.尾增功能(实现) 5.打印 三.实现具体功能代码页(SeqList.c) 四.总结 前言 在学习链表之前先掌握顺序表 什么是顺序表? 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储,在数组上完成数据的增删查改. 顺序表一般可分为: 1.静态顺序表:使用定长数组存储. 2.动态顺序表:使用动态开辟

  • node.js中Util模块作用教程示例详解

    目录 从类型判断说起 严格相等 Error First & Promise 调试与输出 从类型判断说起 在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof 会到各种各样的问题. 举几个简单的: console.log(typeof null) // 'object' console.log(typeof new Array) // 'object' console.log(typeof new String) // 'object' 后来,大

  • C语言指针教程示例详解

    目录 指针 内存 指针类型 指针运算 二级指针 指针数组 指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作.另外,通过指针可以更便捷地操作数组.在一定意义上可以说,指针是 C 语言的精髓. 概念解释就不去搬原定义了,又臭又长不好理解,精炼两点就是: 1.指针是内存中的一个最小单元的编号,也就是地址: 2.平时我们说的指针,通常是指指针变量,用来存储内存地址的变量 也就是说:指针就是地址,口语中指针通常是指针变量 内存 要搞明白指针首先要搞

  • vue3中的透传attributes教程示例详解

    目录 引言 绑定样式 对象 数组 透传的attributes 透传 attributes 之样式绑定 透传 attributes 之事件绑定 特殊1:组件嵌套 特殊2:禁用透传attributes 特殊3:在 javascript 中访问透传的attributes 总结 引言 最近两年都是在使用 react 进行项目开发,看技术博客都是针对 react 和 javaScript 高级方面的,对 vue 的知识基本上遗忘的差不多了.最近开始慢慢回顾 vue 的知识以及对新的语法进行学习,为后面的计

  • JS中原始值和引用值的储存方式示例详解

    在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfined 引用值指的是复合数据类型的值,包括:Object.Function.Array.Date.RegExp 根据数据类型不同,有的变量储存在栈中,有的储存在堆中.具体区别如下: 原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始

  • C语言数据结构线性表教程示例详解

    目录 线性表 顺序表 线性表 数据结构里我们时常看到什么什么表,线性表是最基本.最简单.也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义: 一个线性表是n个具有相同特性的数据元素的有限序列.数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部.比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点). 说的这么复杂其实就是

  • C++语言io流处理基本操作教程示例详解

    目录 一.输入输出流对象 流对象常用的处理函数 流控制字符 二.字符流操作 sstream 三. 文件流流类 四.文件指针定位 一.输入输出流对象 cout:标准输出流 cerr:标准出凑  和cout(只是用于如果是错误时要输出的) cin  :   标准输入 流对象常用的处理函数 输出字符 put() 输入字符:get() 输出字符串:write() 输入字符串getline() char ch; cin.get(ch); cout << ch<<endl; cout.put(

  • Yii2实现增删改查后留在当前页的方法详解

    前言 实现增删改查操作成功后仍留在当前页,能给用户一个良好的体验.但是 Yii2 框架本身是没有在增删改查操作成功后仍留在当前页的效果的,要实现这样的一个效果得自己写.我的原则是不动核心代码,始终坚持自己的原则,现实现了我把它分享出来.殊途同归,如有更好的实现方法,欢迎交流. 需求分析 一.实现增删改查后操作成功后仍然留在当前页面. 1.链接的效果图 封装代码 共有两个文件ActionColumn.php和Helper.php1.ActionColumn.php文件 <?php use Clos

随机推荐