顺序表(一)(数据结构)

一. 线性表

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

二. 顺序表的实现

2.1 概念与结构

上面讲了线性表的概念,那什么是顺序表呢?顺序表其实就是线性表的一种,是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况采用数组存储。所以问题这就来了,顺序表在逻辑结构上线性的,那在物理结构上是线性的还是非线性的?这里就要看看顺序表的底层逻辑,上面也说了顺序表是物理地址连续存储单元,所以在物理结构上也是线性的。

顺序表和数组的区别? 顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。

2.2.1 静态顺序表

概念使用定长数组存储元素。

#define N 7
typedef int SLDataType;
typedef struct SepList 
{SLDataType  a[N];  //定长数组int size;          //有效数据个数
}SL;

上面的代码就是一个静态顺序表,在这个顺序表中我们使用tyoedef重新定义int类型,其作用就是在我们需要替换int类型的时候我们可以按我们的需求进行替换,不用逐个来换,使用Ctrl+h一键替换,使用#define对N进行定义,size记录真正的有效个数,也就是说我们使用静态顺序表的时候是已经提前知道了数组的元素个数。静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费

2.2.2 动态顺序表

静态顺序表在空间的大小上是固定的,还不够灵活,这个时候就需要动态顺序表这个更有优势的,可以动态申请空间。

typedef int SLDataType;
typedef struct SeqList
{SLDataType* a;int size;      //有效数据个数int capacity;  //空间容量
}SL;

2.2 动态顺序表的实现

上面只是一个动态顺序表结构体,但如果要真正实现一个动态顺序表,我们所需要考虑的东西就多了,我们为了让代码清晰可见,在VS中创建一个头文件SeqList.h,用来定义顺序表的结构和声明要提供的操作,再创建一个SeqList.c文件,用来实现各种操作,一个test.c文件,用来测试函数

在创建顺序表的时候我们要进行多次测试,比如当我们写好初始化的时候就可以进行一次测试,在测试函数test.c中的初始化SLInit中传入的是s的地址,使用的是传址调用,因为如果是传值调用,那么形参pa的值是不影响实参s的值,这一点我们要注意。

尾部 / 头部插入数据

 

 上面的是对顺序表的尾插和头插,以及它们打印出来的结果,在 尾插和头插的时候我们第一要关注的是空间是否足够第二就是我们的数组不能是空指针。在我们空间不够的时候我们使用realloc来申请空间,原因是就是realloc可以返回新空间的起始地址,然后就是在申请空间的时候推荐2倍申请,这样的话空间就不会过于浪费。

尾部 / 头部删除数据

对于删除数据来说,有尾删和头删,大家可能对于尾删来说有点疑问,那么为什么直接pa->size--就可以呢?比如现在有一个数组包含数据1  2  3  4 ,那么现在我要删除4这个数据,我们知道size是指向有效数据的下一个位置,也就是4的后面一个位置,那么现在我让size--就会让size指向4的位置,当我们打印的时候这个位置的数据就不是有效的数据了,而且在尾部插入数据的时候在空间充足的时候我们是直接将新的数据元素之直接插在size的位置上,然后再让size++。对于头删的话我们就用将所有元素整体向前移动一位即可。

任意位置插入 / 删除数据

在指定位置删除或者插入数据的时候,我们一定要注意不是是空指针。 

完整代码

SeqList.h:

//顺序表,(动态顺序表)
//一般我们会有头文件和.c文件用来实现各种操作
//定义动态顺序表结构
#include <stdio.h>
#include <stdlib.h>//申请空间//如果后期要改变int的类型,为了方便,我们进行重命名
typedef int SLDatatype;
typedef struct SeqList
{SLDatatype* arr;int capacity;  //空间大小int size;  //有效数据个数
}SL;//初始化
void SLInit(SL* pa);
//销毁
void SLDestory(SL* pa);
//打印数据
void SLPrintf(SL* pa);
//插入数据
void SLPushBack(SL* pa,SLDatatype x);   //尾部插入
void SLPopBack(SL* pa);                 //尾部删除
void SLPushFront(SL* pa, SLDatatype x); //头部插入
void SLPopFront(SL* pa);                //头部删除
void SLInsert(SL* pa, SLDatatype x, int pos);//任意位置之前插入数据
void SLErase(SL* pa, int pos);//删除指定位置的数据

SeqList.c:

//顺序表(动态顺序表)
//一般我们会有头文件和.c文件用来实现各种操作
#include "SeqList.h"
//初始化
void SLInit(SL* pa)
{pa->arr = NULL;pa->size = pa->capacity = 0;
}
//销毁
void SLDestory(SL* pa)
{if (pa != NULL){free(pa->arr);}pa->arr = NULL;pa->size = pa->capacity = 0;
}//判断空间是否足够
void SLCheckcapacity(SL* pa)
{if (pa->size == pa->capacity){//增容 0*2=0,若capacity为0,给个默认值,否则*2倍int newcapacity = pa->capacity == 0 ? 4 : 2 * pa->capacity;SLDatatype* tmp = realloc(pa->arr, newcapacity * sizeof(SLDatatype));if (tmp == NULL){perror("realloc fail!");exit(1);}pa->arr = tmp;pa->capacity = newcapacity;}
}
//插入数据
void SLPushBack(SL* pa, SLDatatype x)//尾插数据
{//判断pa是否为空指针if (pa == NULL){return;}//判读空间是否足够SLCheckcapacity(pa);pa->arr[pa->size] = x;pa->size++;
}
void SLPushFront(SL* pa, SLDatatype x)//头插数据
{//判断pa是否为空指针if (pa == NULL){return;}//判读空间是否足够SLCheckcapacity(pa);//数据整体向后移动一位for (int i = pa->size; i >= 0; i--){pa->arr[i] = pa->arr[i- 1];}pa->arr[0] = x;pa->size++;
}
//删除数据
#include <assert.h>
void SLPopBack(SL* pa)//尾删
{assert(pa);assert(pa->size);pa->size--;
}
void SLPopFront(SL* pa)//头删
{assert(pa);assert(pa->size);//数据整体向前挪动一位for (int i = 0;i<pa->size-1; i++){pa->arr[i] = pa->arr[i + 1];}pa->size--;
}//任意位置之前插入数据
void SLInsert(SL* pa, SLDatatype x, int pos)
{assert(pa);assert(pos >= 0 && pos <= pa->size);//空间检查SLCheckcapacity(pa);//pos及之后的数据整体向后移动一位for (int i = pa->size; i > pos; i--){pa->arr[i] = pa->arr[i - 1];}pa->arr[pos] = x;pa->size++;
}
//删除指定位置的数据
void SLErase(SL* pa, int pos)
{assert(pa);assert(pos >= 0 && pos < pa->size);//pos之后的数据整体向前移动一位for (int i=pos;i<pa->size-1;i++){pa->arr[i] = pa->arr[i + 1];}pa->size--;
}//打印数据
void SLPrintf(SL* pa)
{for (int i = 0; i < pa->size; i++){printf("%d ", pa->arr[i]);}printf("\n");
}

test.c:

//测试
#include "SeqList.h"
void SLtest01()
{SL s;SLInit(&s);//初始化SLPushBack(&s, 1);//尾插数据SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPopBack(&s);SLPrintf(&s);//SLPushFront(&s, 1);//头插数据//SLPushFront(&s, 2);//SLPushFront(&s, 3);//SLPushFront(&s, 4);SLPrintf(&s);SLDestory(&s);
}int main()
{SLtest01();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455177.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1024程序员节 | QT进阶学习——如何通过QT连接云服务器的MySQL数据库并进行数据库操作 和 数据表的增删改查

目录 引出连接本地MySQL1.首先下载MySQL的ODBC驱动2.启动运行&#xff0c;创建用户数据源补充&#xff1a;ANSI 版和 Unicode 版 3.qt代码连接 如何连接华为云服务器中的MySQL1.在Centos中安装Linux版本的ODBC驱动2.在ODBC连接管理器中建立和华为云的链接3.qt代码通过ODBC连接华…

【微软商店平台】如何将exe打包上传微软商店

打开微软合作者中心&#xff1a;https://partner.microsoft.com/en-us/dashboard/home点击App and Games板块可以创建项目。 3. 重新生成包含私钥的自签名证书 运行以下命令&#xff0c;确保生成的证书包含私钥&#xff1a; New-SelfSignedCertificate -Type CodeSigning -Su…

【Java设计模式】1-15章

第1章 内容介绍 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 1.1.2 设计模式的重要性 1.2 课程亮点和授课方式 第2章 设计模式七大原则 2.1 设计模式的目的 2.2 设计模式七大原则 2.3 ①单一职责原则 方案1 package com.atguigu.principle.singleresponsibili…

【Nuvoton干货分享】开发应用篇 4 -- 8bit MCU Flash 操作

我们在进行实际开发设计中&#xff0c;难免需要进行数据存储&#xff0c;早期很多都是外接EEPROM来进行设计&#xff0c;但是需要增加成本。其实芯片内部的Flash也是可以当成数据存储空间的。本章节主要介绍新唐的8位机如何进行常量数据的存储操作。 一、存储空间划分 我这边…

力扣hot100--DFS/BFS

DFS/BFS 1. 79. 单词搜索 中等 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相…

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整&#xff0c;仅供参考&#xff01; 除WEB&#xff0c;RE&#xff0c;PWN外&#xff0c;其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

鲸鱼优化算法(Whale Optimization Algorithm, WOA)原理与MATLAB例程

鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是一种基于鲸鱼捕食行为的智能优化算法。它模拟了座头鲸在狩猎时的“气泡网”捕食策略。 文章目录 1.适应度函数2. 更新公式2.1 突袭行为2.2 螺旋更新3.线性递减参数4. 边界处理 MATLAB 实现示例代码说明…

C语言程序设计:现代设计方法习题笔记《chapter3》

第一题 ​ 代码示例&#xff1a; #include<stdio.h>int main() {printf("Enter a date&#xff08;mm/dd/yyyy&#xff09;: ");int day, month, year;scanf_s("%d/%d/%d", &month, &day, &year);printf("%04d%02d%02d", yea…

一款好用的搜索软件——everthing(搜索比文件资源管理器快)

everthing官网链接 在官网选择下载 1.下载后双击打开 2.点击OK&#xff08;需要其他语言自己选择&#xff09; 3.选择安装位置&#xff08;路径最好别带中文和空格&#xff09; 继续点击下一步 4. 点击下一步 5.继续点击安装 6.然后就完成了 7.点击打开然后就可以搜索了

Elastic Stack简介

本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 从ELK到Elastic Stack ELK是三个单词的首字母缩写&#xff0c;即Elasticsearch、Logstash和Kibana。 Elasticsearch用于数据存储与检索Logstash用于数据传输与清洗Kibana则用于数据可视化等领域 Elasticsearch的第…

AnaTraf | 网络性能监控系统NPM:提升网络性能与业务连续性

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 网络系统非常复杂&#xff0c;管理和维护它们也越来越具有挑战性。为了确保网络性能和业务的持续稳定运行&#xff0c;IT运维团队需要对网络进行实时监控、优化和快速排查故障。本文将围绕网络性能监控系统&…

raidrive 访问搭建的ftp服务报错超时的情况

尝试了很久&#xff0c;包括改用户权限和密码&#xff0c;后面根据ftp日志&#xff0c;查到用户登录是正常的 /var/log/vsftpd.log 就知道&#xff0c;不是密码问题也不是服务器端的问题&#xff0c;通过多次尝试发现是被动模式的问题&#xff0c;被动模式会通过其他端口进行交…

ChatGPT实现旅游推荐微信小程序

随着旅游行业的快速发展&#xff0c;个性化推荐已成为提升用户体验的重要手段。通过AI技术&#xff0c;提供一个智能旅游推荐小程序&#xff0c;使用户能够轻松获取定制化的旅行建议。 项目概述 项目目标 开发一个AI旅游推荐小程序&#xff0c;基于用户输入的旅行偏好&#…

前后端请求、返回数据的多种方式

Springboot项目的业务逻辑 &#x1f319;项目基本结构&#xff1a; 通常情况下&#xff0c;我们在搭建后端项目的时候&#xff0c;处理业务逻辑我们需要用到Controller,Service,Mapper(mybatis,mybatis-plus)&#xff0c;Entry各层之间的相互调用来完成&#xff0c;还有就是我…

Docker部署MySQL主从复制

1. 主从复制概念及优势 1.1 概念 MySQL主从复制是一种数据库复制技术&#xff0c;它允许将一个数据库服务器&#xff08;主服务器&#xff09;上的数据更改复制到一个或多个数据库服务器&#xff08;从服务器&#xff09;。这种技术在数据库管理和维护中扮演着重要的角色&…

Ubuntu 2张4090,显卡安装,无法双屏显示

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; Ubuntu20.04 安装nvidia显卡 在已经安装好nvidia显卡的情况下&#xff1a; 单屏幕无法修改屏幕分辨率 无法双屏显示 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 单屏幕无法…

【Origin科技绘图】最新Origin2024中文版软件安装教程

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在MicrosoftWindows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基Levernberg-Marquardt算法(LMA)的非线性最小二乘法拟合…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说&#xff0c;还是性价比很高的&#xff0c;具有很大的优势&#xff01; 一、就业前景广阔 高需求行业 在当今数字化时代&#xff0c;计算机技术几乎渗透到了各个领域&#xff0c;无论是互联网…

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加&#xff0c;传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构&#xff08;Plug-In Architecture&#xff09;作为一种模块化设计方式&#xff0c;通过动态加载和运行子VI&#xff0c;使系统功能更加灵活、模块化&…

Django从请求到响应

视图 一个视图函数&#xff0c;简称视图&#xff0c;是一个简单的Python函数 def view_name() 定义视图函数view_name() URL的常用配置 path函数&#xff1a; path(route,view,name,**kwargs) route&#xff1a;RUL匹配规则 view&#xff1a;视图函数 name&#xf…