数据结构-顺序表详解(看这篇就足够了,哈哈哈)

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

哈喽,everybody!感谢各位同胞的阅览,希望大家在评论区多多发表意见!

本篇代码都是基于VS所写,在其他编译器运行可将#define _CRT_SECURE_NO_WARNINGS该行注释,某些语句或许在某些低版本的GCC编译器上不能运行。

顺序表

1.顺序表的概念及结构

1.1 线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使

用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,

线性表在物理上存储时,通常以数组和链式结构的形式存储。

案例:蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的一类数据结构的集合

顺序表的底层是数组,故顺序表的物理结构是连续的。

顺序表是线性表的一种,逻辑结构是连续的。

2.顺序表分类

•2.1顺序表和数组的区别

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

• 2.2顺序表分类

◦ 静态顺序表

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

静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费.

struct SeqList{//sequence 顺序的 
 int arr[100];//定长数组
 int size;//顺序表当前有效的数据个数
 }SL;

◦ 动态顺序表

struct SeqList{
 int *arr;
 int size;//有效的数据个数
 int capacity;//空间大小
 }SL;

可增容

3.动态顺序表的实现

#define INIT_CAPACITY 4
 typedef int SLDataType;
 // 动态顺序表 -- 按需申请
 typedef struct SeqList
 {
  SLDataType* a;
  int size; // 有效数据个数
  int capacity; // 空间容量
 }SL;
 //初始化和销毁
 void SLInit(SL* ps);
 void SLDestroy(SL* ps);
 void SLPrint(SL* ps);
 //扩容
 void SLCheckCapacity(SL* ps);
 //头部插⼊删除 / 尾部插⼊删除
 void SLPushBack(SL* ps, SLDataType x);
 void SLPopBack(SL* ps);
 void SLPushFront(SL* ps, SLDataType x);
 void SLPopFront(SL* ps);
 //指定位置之前插⼊/删除数据
 void SLInsert(SL* ps, int pos, SLDataType x);
 void SLErase(SL* ps, int pos);
 int SLFind(SL* ps, SLDataType x);

以上为提纲

下面顺序表的实现采用项目格式

项目设计: 1.头文件 .h 顺序表结构 声明顺序表的方法 2 .c文件 实现顺序表的方法

4.顺序表具体实现(主要为动态)

4.1头文件

#pragma once
 //顺序表的创建
 //静态
 /*
 struct seqList{
 int arr[100];定长数组
 int size; 数量
 }
 */
 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>
 typedef int datatype;//方便以后改数据类型
 //动态顺序表--按需申请空间
 typedef  struct seqList {
     datatype* arr;
     int size;
     int capacity;//容量
 }SL;
 //初始化和销毁,数据打印
 void SLInit(SL* ps);
 void SLDestroy(SL* ps);
 void SLPrint(SL s);
 //扩容
 void CheckCapacity(SL* ps);
 //头部插⼊删除 / 尾部插⼊删除 
 void SLPushBack(SL* ps, datatype x);
 void SLPopBack(SL* ps);
 void SLPushFront(SL* ps, datatype x);
 void SLPopFront(SL* ps);
 //指定位置之前插⼊/删除数据/数据查询
 void SLInsert(SL* ps, int pos, datatype x);
 void SLErase(SL* ps, int pos);
 int SLFind(SL* ps, datatype x);

4.2相关函数实现

#define _CRT_SECURE_NO_WARNINGS
 #include"seqList.h"
 //初始化
 void SLInit(SL* ps) {
     ps->arr = NULL;
     ps->size = ps->capacity = 0;//初始化也可赋值,但是后续操作会改变,思路都是一样的。
 }
 //销毁
 void SLDestroy(SL* ps) {
     if (ps->arr) {//等价于if(ps->arr!=NULL)
         free(ps->arr);
         ps->arr = NULL;
     }
     ps->size = ps->capacity = 0;
 }
 //空间检查
 void CheckCapacity(SL* ps) {
     if (ps->size == ps->capacity) {
         int newcapacity = ps->capacity = 0 ? 4 : 2 * ps->capacity;
         //创建临时数组,判断是否创建为空导致数据丢失
         datatype* tem = (datatype*)realloc(ps->arr, newcapacity * sizeof(datatype));
         if (tem == NULL) {
             perror("realloc fail!");
             exit(1);//直接退出
         }
         ps->arr = tem;
         ps->capacity = newcapacity;
     }
 }
 //尾插
 void SLPushBack(SL* ps, datatype x) {
 ​
     //ps->arr[ps->size] = x;
     //++ps->size;
     //判断空间是否足够
     assert(ps);
     CheckCapacity(ps);
     ps->arr[ps->size++] = x;
 }
 //头插
 void SLPushFront(SL* ps, datatype x) {
     assert(ps);
     CheckCapacity(ps);
     //让顺序表中已有的数据整体往后挪一位
     for (int i = ps->size; i > 0; i--) {
         ps->arr[i] = ps->arr[i - 1];
     }
     ps->arr[0] = x;
     ps->size++;
 }
 //输出
 void SLPrint(SL s) {
     for (int i = 0; i < s.size; i++) {
         printf("%d ", s.arr[i]);
     }
     printf("\n");
 }
 //尾删
 void SLPopBack(SL* ps) {
     assert(ps);
     assert(ps->size);
     --ps->size;
 }
 //头删
 void SLPopFront(SL* ps) {
     assert(ps);
     assert(ps->size);
     for (int i = 0; i < ps->size - 1; i++) {
         ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]
     }
     ps->size--;
 ​
 }
 //指定位置前插入数据
 void SLInsert(SL* ps, int pos, datatype x) {
     assert(ps);
     assert(pos >= 0 && pos <= ps->size);
     CheckCapacity(ps);
     for (int i = ps->size; i > pos; i--) {
         ps->arr[i] = ps->arr[i - 1];//arr[size]=arr[size-1]
     }
     ps->arr[pos] = x;
     ps->size++;
 }
 //指定位置删除
 void SLErase(SL* ps, int pos) {
     assert(ps);
     assert(ps->size);
     for (int i = pos; i < ps->size - 1; i++) {
         ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]
     }
     ps->size--;
 ​
 }
 //找寻数据
 int SLFind(SL* ps, datatype x) {
     assert(ps);
     for (int i = 0; i < ps->size; i++) {
         if (ps->arr[i] == x) {
             return i;
         }
     }
     return -1;
 }
 

4.3代码测试

 
#define _CRT_SECURE_NO_WARNINGS
 #include"seqList.h"
 void test1() {
     SL sl;
     SLInit(&sl);
     SLPushBack(&sl, 1);
     SLPushBack(&sl, 2);
     SLPushBack(&sl, 3);
     SLPushBack(&sl, 4);
     SLPushBack(&sl, 5);
     SLPrint(sl);//12345
     SLInsert(&sl, 0, 99);
     SLInsert(&sl, sl.size, 66);
     //SLErase(&sl, 3);
     //SLErase(&sl, 0);
     //SLErase(&sl, 4);
     SLPrint(sl);
 ​
     SLPushFront(&sl, 6);
     SLPushFront(&sl, 6);
     SLPrint(sl);
 ​
     SLPopBack(&sl);
     SLPopBack(&sl);
     SLPopBack(&sl);
     SLPrint(sl);
 ​
 ​
     SLPopFront(&sl);
     SLPopFront(&sl);
     //SLPopFront(&sl);
     SLPrint(sl);
     SLPopFront(&sl);
     SLPopFront(&sl);
     SLPrint(sl);
 ​
     int find= SLFind(&sl,4);
     if (find < 0) {
         printf("没有找到!");
     }
     else
         printf("找到了,数组下标为%d.,第%d个元素.", find,find+1);
     SLDestroy(&sl);
 }
 int main() {
     test1();
     return 0;
 }

可根据自己要求进行数据检测处理!文章来源地址https://www.toymoban.com/news/detail-860886.html

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

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

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

相关文章

  • 4大热门数据分析软件怎么选?看这篇就够了

    有时候我们发现,技术和工具并不是核心要素,基于客户需求体验的产品设计和专业工程实施能力才是关键。大部分优秀的数据工具产品,也是胜在对数据的理解和治理的方法论上,赋以相应的工具,让能力加特。 机器学习、人工智能(AI) 和其他类似过程在收集和理解不同数

    2024年02月07日
    浏览(40)
  • 对应用数据开发还有疑惑?看这篇就够了!数据存储、管理,通通掌握!

      原文: https://mp.weixin.qq.com/s/0YzFUfx-1ZdfOQhaeekwhg ,点击链接查看更多技术内容。 数据管理可以做什么?应用数据的持久化怎么实现?如何实现数据库加密? 在开发应用进行应用数据的处理时,您是否也会有这些疑问呢? 现在,我们推出了更为清晰完善的数据管理文档,帮助

    2024年02月07日
    浏览(35)
  • 看这篇就明白大数据实时数仓、离线数仓、数据湖之间的关系

      20世纪70年代,MIT(麻省理工)的研究员致力于研究一种优化的技术架构,该架构试图将业务处理系统和分析系统分开,即将业务处理和分析处理分为不同层次,针对各自的特点采取不同的架构设计原则,MIT的研究员认为这两种信息处理的方式具有显著差别,以至于必须采取完

    2024年02月08日
    浏览(44)
  • 如何利用Python中的pymysql库来操作Mysql数据库,看这篇就够啦~

     为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库,本文是向大家介绍了如何利用python中的pymysql库来操作mysql数据库。 1、什么是pymysql? pymysql是从python连接到mysql数据库服务器的接口, 简单理解就是,pymysql是python操作mysql数据库的三方模块,可

    2024年02月06日
    浏览(55)
  • Linux,看这篇就够了

    因为我们要部署服务,Linux系统一直以其稳定性而闻名,它们可以连续运行多年而不发生任何重大问题。事实上,很多Linux用户都从未在自己的环境中遇到过系统崩溃的情况。相对windows而言,挂起和崩溃完全是一种常态。 Windows由于是商业产品,源代码封闭,我们无法知道微软

    2024年02月08日
    浏览(44)
  • 测试基本理论-看这篇就够了

    软件测试(Software Testing): 在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 【系统软件】:如操作系统、数据库管理系统,各种驱动软件等; 【应用软件】:如Office、有道翻译、QQ等; 【单机版本】:如Office,

    2024年02月06日
    浏览(48)
  • 面向对象编程,看这篇就够了

    面向对象编程,是一种程序设计范式,也是一种编程语言的分类。它以对象作为程序的基本单元,将算法和数据封装其中,程序可以访问和修改对象关联的数据。这就像我们在真实世界中操作各种物体一样,比如我们可以打开电视、调整音量、切换频道,而不需要知道电视的

    2024年02月05日
    浏览(77)
  • 关于SpringBoot框架,看这篇就够了。

    目录 是什么 有什么优点、解决了哪些问题 创建第一个以springboot项目 starter 核心配置文件application.yml或properties application中的配置项 springboot的启动流程 自定义banner 整合日志打印 整合druid数据源 处理异常 常用的注解 Configuration Import conditional ConfigruationProperties 基于springboot的

    2024年02月06日
    浏览(48)
  • Redis基础命令汇总,看这篇就够了

    本文首发于公众号:Hunter后端 原文链:Redis基础命令汇总,看这篇就够了 本篇笔记将汇总 Redis 基础命令,包括几个常用的通用命令,和各个类型的数据的操作,包括字符串、哈希、列表、集合、有序集合等在内的基本操作。 以下是本篇笔记目录: 通用命令 字符串命令 哈希

    2024年02月04日
    浏览(48)
  • ElasticSearch自定义评分-看这篇就够了

    文章目录   一、适用的场景    1.基本介绍    2.使用场景     2.1根据价格评分排序     2.2根据距离评分排序     2.3根据距离价格综合评分排序     2.4自定义编写脚本   二、常用的字段解释    1.整体结构    2.function_score     2.1.qu

    2024年02月06日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包