动态顺序表的增删查改

简介: 动态顺序表的增删查改

顺序表是数据结构中最简单的一种内存管理方式,可以将程序员想要存储的数据线性的进行存储,其中因为存储的数据在内存中是连续的,所以叫做顺序表。接下来看看动态顺序表是如何实现的。

一.在sequence.h头文件中进行函数的申明

二.在sequence.c源文件中进行函数的实现

三.在test.c源文件中进行代码测试

1.动态顺序表的创建

1. #pragma once
2. #define _CRT_SECURE_NO_WARNINGS 1
3. #include<stdio.h>
4. #include<stdlib.h>
5. typedef int type;
6. typedef struct sequence
7. {
8.  type* p;//顺序表头地址
9.  int sz;//顺序表有效数据个数
10.   int capcity;//顺序表容量
11. }seq;

在sequence.h中创建一个结构体来对动态顺序表进行打包,其中内部需要声明是 顺序表的头地址,顺序表的属性(有效数据个数和容量)。

接下来,我们来实现顺序表的初始化

2.顺序表的初始化

顺序表的初始化无非就是为顺序表申请空间,初始化顺序表属性。

1. void intiseq(seq* psl)
2. {
3.  //为顺序表申请空间
4.  psl->p = (type*)malloc(sizeof(type) * 5);//在堆上申请五个type类型数据的空间
5.  //初始化属性
6.  psl->sz = 0;//初始化顺序表的有效数据
7.  psl->capcity = 5;//给定容量
8. }

初始化后,顺序表才可以说具备了存储数据的能力。我们就可以对顺序表进行一系列的操作了,因为顺序表是在堆上申请的空间,所以在增删查改过后就得手动释放顺序表的空间,销毁顺序表,下面顺便实现一下对顺序表的销毁。

3.顺序表的销毁

顺序表的销毁无非就是释放一下顺序表的空间,置空一下属性。

1. void destroyseq(seq* psl)
2. {
3.  free(psl->p);//释放顺序表内存空间
4.  psl->p = NULL;//置空指针p,防止变为野指针
5.  //置空属性
6.  psl->sz = 0;
7.  psl->capcity = 0;
8. }

在上面基本的操作过后,我们就可以正式的玩转顺序表了。

顺序表增加元素分为三种:尾部插入,头部插入,中间位置插入。在插入元素之前,我们需要对顺序表的容量和有效数据进行检查,防止顺序表满了,如果顺序表满了还需要进行扩容。写一个检查函数来实现。

4.顺序表容量检查

顺序表容量检查要实现的功能是判断内存空间是否已满,并实现扩容二倍的操作,这在顺序表插入元素时是至关重要的操作。

1. void checkseq(seq* psl)
2. {
3.  if (psl->capcity == psl->sz)//如果容量等于有效数据个数,则内存不够,扩容
4.  {
5.    type* tmp =NULL;
6.    tmp = realloc(psl->p, 2 * psl->capcity * sizeof(type));
7.    psl->p = tmp;
8.    psl->capcity *= 2;
9.  }
10. }

5.顺序表尾插

在顺序表尾部插入数据的操作只需要先插入,再增加有效数据个数

1. void pushbackseq(seq* psl, int n)
2. {
3.  checkseq(psl);//检查容量
4.  psl->p[psl->sz] = n;//在下标为sz处插入n
5.  psl->sz++;//有效数据个数增加
6. }

6.顺序表头插

在顺序表头部插入数据只需要先挪动数据,再在头部插入数据,然后有效数据增加,具体步骤如下

1. void pushheadseq(seq* psl, int n)
2. {
3.  checkseq(psl);//检查容量
4.  //挪动
5.  for (int i=psl->sz;i>=1;i--)
6.  {
7.    psl->p[i] = psl->p[i - 1];
8.  }
9.  //插入
10.   psl->p[0] = n;
11.   //有效数据增加
12.   psl->sz++;
13. }

7.顺序表中间位置插入

在顺序表中间位置的插入,需要先挪动此位置下标后面的数据,再在此下标插入数据,再有效数据增1

1. void pushmidseq(seq* psl, int pos,int n)
2. {
3.  checkseq(psl);//检查容量
4.  for (int i = psl->sz; i >=pos+1 ; i--)
5.  {
6.    psl->p[i] = psl->p[i - 1];//挪动数据
7.  }
8.  psl->p[pos] = n;//在pos下标处插入数据
9.  psl->sz++;//有效数据加1
10. }

顺序表的插入元素到这里就算结束了,接下来我们玩转顺序表删除元素。

8.顺序表尾删

1. void popbackseq(seq* psl)
2. {
3.  assert(psl->sz > 0);//断言
4.  psl->sz--;//有效数据减一
5. }

首先,在顺序表尾部删除元素,只需要将有效数据个数减少1,就无法访问到尾部这个元素了,但是删除不可以无止境删除,当顺序表有效数据为0时,就不可以继续删除了,所以我们加一个断言。

9.顺序表头删

顺序表头删除只需要将头部数据覆盖,再将有效数据减一,具体步骤如下

1. void popheadseq(seq* psl)//头删
2. {
3.  assert(psl->sz > 0);
4.  for (int i = 1; i <psl->sz ; i++)
5.  {
6.    psl->p[i - 1] = psl->p[i];//覆盖头部元素
7.  }
8.  psl->sz--;//有效数据减一
9. }

10.顺序表中间位置删除

顺序表中间位置删除元素也是需要先将要删除位置的下标后面的元素整体向前覆盖,再有效数据减一。

1. void popmidseq(seq* psl,int pos)//中间删
2. {
3.  assert(psl->sz > 0);
4.  for (int i = pos; i < psl->sz-1; i++)
5.  {
6.    psl->p[i] = psl->p[i + 1];//要删除位置的下标后面的元素整体向前覆盖
7.  }
8.  psl->sz--;//有效数据个数减一
9. }

 

到这里,顺序表的插入删除已经结束了,下面介绍顺序表的查找和修改

11.顺序表元素查找

顺序表的元素查找就是返回要查找元素的下标,直接遍历或者二分即可,如果找不到,返回-1。

1. int searchseq(seq* psl, type n)
2. {
3.  for (int i = 0; i < psl->sz; i++)
4.  {
5.    if (psl->p[i] == n)
6.      return i;
7.  }
8.  return -1;
9. }

12.顺序表元素修改

顺序表的元素修改就更加简单了,只需要给出要修改元素的下标,再直接修改对应元素即可。

1. void modifyseq(seq* psl, int pos, type n)
2. {
3.  psl->p[pos] = n;
4. }

顺序表玩转完了,下期我们玩转链表哈哈

相关文章
|
C语言 C++ 容器
[数据结构] 用两个队列实现栈详解
我们上篇文章讲述了用两个栈实现队列 ,用过对上篇文章的学习后,我们再去学用两个队列实现栈就变得相对来说容易了很多。本篇文章会对用两个队列实现栈进行详解,希望会对你有所帮助。
458 0
|
存储 C语言
C语言实现简易学生信息管理系统
C语言实现简易学生信息管理系统
500 4
|
JavaScript 数据格式
js 计算两个时间的时间差
如题,就像题目说的需要计算出时间差,虽然不太难,但这个需求经常会在项目中遇到的,我在这边做一下整理,希望能够尽量全的整理出来。有需要的朋友可以做一下参考,喜欢的可以点波赞,或者关注一下,希望可以帮到大家。 本文首发于我的个人blog:obkoro1.com 计算时间差原理: getTime()方法 方法定义: getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数。 通常我们计算时间差都是通过获取两个时间数据,然后分别使用getTime()方法返回与固定的1970 年 1 月 1 日的时间差,通过对返回毫秒数的差,换算成时间单位,得出两个时间的时间差。 开始操作:
1432 0
js 计算两个时间的时间差
|
弹性计算 自然语言处理 安全
国内基础大模型的独立性及应用大模型的依赖性
本文探讨了国内基础大模型(如阿里巴巴的通义千问)的独立性及其应用大模型的依赖性。详细分析了这些模型的研发过程、应用场景及技术挑战,包括数据收集、模型架构设计和算力支持等方面。同时,讨论了微调模型、插件式设计和独立部署等不同实现方式对应用大模型的影响。
343 0
|
机器学习/深度学习 自然语言处理
【机器学习】如何进行中文命名实体识别?(面试回答)
中文命名实体识别的基本概念、分类、识别思想、实体标注方法以及常见的识别方法,包括基于规则、基于统计和基于深度学习的方法。
446 1
【机器学习】如何进行中文命名实体识别?(面试回答)
|
机器学习/深度学习 自然语言处理 机器人
使用Python实现深度学习模型:自然语言理解与问答系统
【7月更文挑战第20天】 使用Python实现深度学习模型:自然语言理解与问答系统
208 0
使用Python实现深度学习模型:自然语言理解与问答系统
|
前端开发 JavaScript 数据库
多个文件上传
多个文件上传
181 0
|
Cloud Native 关系型数据库 MySQL
小白新手一篇看懂PolarDB-X
简要讲述什么是PolarDB-X,以及基础安装,与srpingboot项目整合等
小白新手一篇看懂PolarDB-X
|
弹性计算 安全 Linux
阿里云服务器宝塔面板使用教程(阿里云宝塔搭建网站)
阿里云服务器宝塔面板使用教程(阿里云宝塔搭建网站)阿里云服务器网以CentOS操作系统为例,安装宝塔Linux面板,先远程连接到云服务器,然后执行宝塔面板安装命令,系统会自动安装宝塔面板,安装完成后会返回面板地址、账号和密码,然后在安全组开通宝塔面板端口号
2977 1
|
机器学习/深度学习 算法 安全
基于图像识别的面瘫检测技术
图像识别是通过计算机对特定情况进行图像采集处理,分析匹配目标,提取特征,训练分类模型等步骤实现,在国内外科学家的努力下,实现了突飞猛进的变化,人们开始将这一技术应用于,医学,农业,安防,交通,车辆领域。在这一背景之下,许多先进的医疗手段都离不开图像识别技术的支持,小到日常的体检如胸片,心电图我们都可以通过自助取片获得计算机提供的初步诊断信息,之后再找医生问诊,大到一些微创手术,脑部ct技术,心脏病理分析,肺结核图像识别,糖尿病患者的视网膜图像技术
611 0

热门文章

最新文章