数据结构(初阶2.顺序表)

文章目录

一、线性表

二、顺序表

 2.1 概念和结构

 2.2 分类

    2.2.1 静态顺序表

    2.2.2 动态顺序表

 2.3动态顺序表的实现

  1.SeqList.h

  2.SeqList.c

    打印顺序表

    初始化

    销毁

    增容

    尾插

    头插

    在指定位置之前插入数据

    尾删

    头删

    在指定位置删除数据

  3.test.c


一、线性表

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

二、顺序表

2.1 概念和结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储。
那么数组和顺序表的区别是什么?
下面可以进行一个很形象的类比:
  • 顺序表是对数组进行封装:结构体
  • 定义已经知道数组的大小:    int arr【3】= {1,2,3};
  • 定义未知道数组的大小:        int*arr;

2.2 分类

2.2.1 静态顺序表

上图中可以发现我们重新定义了 typedef int SLDataType,为什么?

比如当我们在测试代码中有 100000行代码,1000+会定义整型变量 int,当要把这 1000+ 的代码部分改成 char 类型时,如果逐个将这些代码找出一句句修改会非常麻烦而且工作量巨大;             

而当 typedef int SLDataType之后 ,我们只需将其改成 typedef char SLDataType ,遍能一键替换为 char 或者想要修改的位置。

2.2.2 动态顺序表

2.3动态顺序表的实现

(注意:1.当我们每实现一个方法之后须测试一下,切记写完所有方法才测试,避免出现差错;

             2.在调用过程中分清传值和传址的区别;

                传值:形参是实参的值的拷贝,实参和形参指向的是两块不同的地址,但保存的数据是一样的

                传址:形参指向的是实参指向的地址) 

1.SeqList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//定义动态顺序表结构
typedef int SLDatatype;typedef struct SeqList {SLDatatype* arr;int capacity; //空间大小int size;     //有效数据个数
}SL;//typedef struct SeqList SL;//初始化
void SLInit(SL* ps);
//销毁
void SLDestroy(SL* ps);//打印顺序表
void SLPrint(SL* ps);//插入数据
void SLPushBack(SL* ps, SLDatatype x);
void SLPushFront(SL* ps, SLDatatype x);//删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//在指定位置之前插入数据
void SLInsert(SL* ps, SLDatatype x, int pos);
//删除指定位置的数据
void SLErase(SL* ps, int pos);

2.SeqList.c 

  • 打印顺序表
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}
  • 初始化  
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
  • 销毁
void SLDestory(SL* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}
  •  增容

当size == capacity 时,说明顺序表满了,空间不足,先增容,再插入;

增容一般是成倍数的增加(增容的操作本身就有一定的程序性能的消耗,若频繁的增容会导致程序效率底下),所以 ”一次增容一个就没有空间浪费“ 这种说法是错误的。 

增容分两种情况: 1.连续空间足够,直接扩容 

                              2.连续空间不够,1)重新找一块地址,分配足够的内存 

                                                          2)拷贝数据到新的地址 

                                                          3)销毁旧地址 

void SLCheckCapacity(SL* ps)
{//判断空间是否充足if (ps->size = ps->capacity){//增容//0*2 = 0//若capacity为0,给个默认值,否则×2倍int newCapacity = ps->arr == 0 ? 4 : 2 * ps->capacity;SLDatatype* tmp = (SLDatatype*)realloc(ps->arr, newCapacity * sizeof(SLDatatype));if (tmp = NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}
}
  • 尾插 

空间充足:将数据插入 size 指向的位置,size++;

void SLPushBack(SL* ps, SLDatatype x)
{assert(ps);//等价于assert(ps != NULL)SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}
  • 头插
void SLPushFront(SL* ps, SLDatatype x)
{assert(ps);//判断空间是否足够SLCheckCapacity(ps);//整体数据往后移一位,从后往前移for (int i = ps->size;i >0; i--){ps->arr[i] = ps->arr[i - 1];}//将数据插入下标为0的位置ps->arr[0] = x;
}
  • 在指定位置之前插入数据
void SLInsert(SL* ps, SLDatatype x, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//       头插          尾插 //pos及以后的数据整体向后移动一位,从后往前移,与头插的方法类似for (int i =ps->size ; i>pos; i--){ps->arr[i] = ps->arr[i - 1];}//将数据插入下标为pos的位置ps->arr[pos] = x;ps->size++; //不要忘记这一步
}
  • 尾删
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];}ps->size--;}
  • 在指定位置删除数据
void SLDelete(SL* ps, int pos)
{assert(ps);assert(ps->size);//顺序表为空,不可删除assert(pos >= 0 && pos < ps->size);//       头删          尾删 //pos及以后的数据整体向前移动一位,从前往后移,与SLInsert的方法类似for (int i = pos; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

 3.test.c

#include "SeqList.h"void SLtest01()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 10);SLPushBack(&s, 11);SLPushBack(&s, 12);printf("尾插后的数据:");SLPrint(&s);printf("头插后的数据:");SLPushFront(&s, 4);SLPrint(&s);printf("在下标为2的位置插入9后的数据:");SLInsert(&s, 9, 2);SLPrint(&s);printf("尾删后的数据:");SLPopBack(&s);SLPrint(&s);printf("头插后的数据:");SLPopFront(&s);SLPrint(&s);printf("删除下标为3的数据:");SLDelete(&s, 3);SLPrint(&s);SLDestroy(&s);
}int main()
{SLtest01();	return 0;
}

未完待续~~

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

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

相关文章

如何解决VMware 安装Windows10系统出现Time out EFI Network...

一、问题描述 使用VMware 17 安装windows10出现如下图所示Time out EFI Network… Windows10镜像为微软官方下载的ISO格式镜像&#xff1b; 二、问题分析 VMware 17 默认的固件类型是UEFI(E)&#xff0c;而微软官网下载的Windows10 ISO格式镜像不支持UEFI(E)&#xff0c;支…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构④ | 4.7

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.7 安全架构 4.7.1 安全威胁 4.7.2 定义与范围 4.7.3 整体架构设计 4.7.4 网络安全架构设计 4.7.5 数据库系统安…

C++基础语法:STL之迭代器

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 C基础:STL概述-CSDN博客 上一篇梳理了一些同STL有关的概念.同时对理解迭代器需要的类包含,内部类,链表等内容做了分析,这篇从<C Prime Plus> 6th Edition(以下称"本书")的P684,大标题16.4泛型编…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

Algorithms,最全的Python算法仓库!

学习编程、学习Python最好的方式就是练习&#xff0c;哪怕是新手&#xff0c;只要不断地敲代码输出&#xff0c;肯定会有神效。 Python的练手项目很多&#xff0c;特别是Github上&#xff0c;建议不管新手、老司机都去看看。 这里推荐给大家一个Gitthub上练习的项目&#xff…

[C++]——同步异步日志系统(5)

同步异步日志系统 一、日志消息格式化设计1.1 格式化子项类的定义和实现1.2 格式化类的定义和实现 二、日志落地类设计2.1 日志落地模块功能实现与测试2.2 日志落地模块功能功能扩展 一、日志消息格式化设计 日志格式化模块的作用&#xff1a;对日志消息进行格式化&#xff0c…

深度学习工具和资源推荐:全面指南

今天我们来聊聊深度学习的工具和资源。要学好深度学习&#xff0c;除了理论知识&#xff0c;还需要掌握一些强大的工具和找到好的资源。以下是我在学习过程中发现的一些非常有用的工具和资源&#xff0c;希望对你们有帮助。 目录 工具推荐 1. Python编程语言 2. TensorFlow…

接口测试返回参数的自动化对比!

引言 在现代软件开发过程中&#xff0c;接口测试是验证系统功能正确性和稳定性的核心环节。接口返回参数的对比不仅是确保接口功能实现的手段&#xff0c;也是测试过程中常见且重要的任务。为了提高对比的效率和准确性&#xff0c;我们可以通过自动化手段实现这一过程。本文将…

WGCLOUD登录页面支持输入验证码吗

支持的 v3.5.3版本开始&#xff0c;WGCLOUD支持在登录页面配置输入验证码&#xff0c;我们可以根据自己的场景需要&#xff0c;配置是否在登录页面显示验证码&#xff0c;如下说明 登录页面添加验证码说明 - WGCLOUD

[超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动+CUDA+cuDNN+Pytorch)--[3]安装cuDNN与Pytorch

本次配置过程的三篇博文分享分别为为&#xff1a; [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[1]安装显卡驱动 [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[2]安装Anaconda与CUDA [超级详细系列]ubuntu22.04配置深…

Web学习day04

mybatis 目录 mybatis 文章目录 一、查询 1.1结果映射 1.2多条件查询 1.3模糊查询 二、XML 书写规范 三、动态SQL 四、配置文件 4.1settings标签 4.2mappers标签 4.3environments标签 五、案例 5.1数据表 5.2实现类 5.3mapper实现 5.4工具类实现 5.5XML动态…

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统&#xff0c;后端基于Python语言&#xff0c;采用flask-restful开发后端接口&#xff0c;前端采用VueAntDesignVue实现。对其他类似系统的实现&#xff0c;比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

记一下blender曲线阵列

先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器&#xff0c;然后再给他添加一个curve修改器&#xff0c;使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后&#xff0c;死活无法沿着曲线阵列&#xff…

.快速幂.

按位与&#xff08;Bitwise AND&#xff09;是一种二进制运算&#xff0c;它逐位对两个数的二进制表示进行运算。对于每一位&#xff0c;只有两个相应的位都为1时&#xff0c;结果位才为1&#xff1b;否则&#xff0c;结果位为0。如&#xff1a;十进制9 & 5转化为二进制&am…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…

低代码商城构建专家:Mall-Cook

Mall-Cook&#xff1a;用Mall-Cook&#xff0c;让电商创新触手可及- 精选真开源&#xff0c;释放新价值。 概览 Mall-Cook是一个面向未来的商城低代码开发平台&#xff0c;它通过提供直观的可视化界面&#xff0c;让开发者和商家能够快速构建和部署跨平台的电商解决方案。这个…

微信小程序如何实现登陆和注册功能?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

服务器提交记录有Merge branch消除

背景&#xff1a;在共同开发分支release上&#xff0c;你提交了commit&#xff0c;push到服务器上时&#xff0c;发现有人先比你push了&#xff0c;所以你得先pull&#xff0c; 后再push&#xff0c;然而pull后自动产生了一个Merge branch的一个commit&#xff0c;这个commit本…

递归解决换零钱问题--回顾总结之递归的表达能力

前面为了保持叙述的流畅, 没有做太多的引申, 把总结推迟到了后面. 补上一些总结, 以防止出现 “下面呢? 下面没有了” 的尴尬. 方向性问题 虽然题目在一开始就暗示了这一点, 但首先, 我们还是要问, 它能用递归解决吗? 有点怀疑精神是好的, 既要低头走路, 更要抬头看路, 以防…