数据结构【线性表篇】(一)

数据结构【线性表篇】(一)


文章目录

  • 数据结构【线性表篇】(一)
  • 前言
      • 为什么突然想学算法了?
      • 为什么选择码蹄集作为刷题软件?
  • 目录
  • 一、顺序表
    • (一)、顺序表的定义
    • (二)、顺序表的插入删除
    • (三)、顺序表的查找
  • 二、完整代码
    • (一)、顺序表的增删改查-完整代码(静态存储)
    • (二)、顺序表的增删改查-完整代码(动态存储)
  • 三、结语


前言

在这里插入图片描述

为什么突然想学算法了?

> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下竞争压力逐渐增大,无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个寒假巩固速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

在这里插入图片描述


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
.
在这里插入图片描述


目录

一、顺序表

(一)、顺序表的定义

参考代码

//顺序表的定义
typedef struct{int num;        //号数int people;      //人数
}Customer;

//顺序表的实现——静态分配
#define Maxsize 10          //定义最大长度
typedef struct{int data[Maxsize];       //用静态的“数组”存放数据元素int length;             //顺序表的当前长度
}SqList;                   //顺序表的类型定义(静态分配方式) sequence:顺序,序列//顺序表的实现——动态分配
#define InitSize 10           //定义最大长度
typedef struct{int *data;               //指示动态分配数组的指针int MaxSize;            //顺序表的最大容量int length;              //顺序表的当前长度
}SeqList;                   //顺序表的类型定义(动态分配方式)//key: 动态申请和释放内存空间
//C -- malloc、free函数
//       L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize)
//  ElemType*: malloc函数返回一个指针,需要强制转型为你定义的数据元素类型指针
//  InitSize:  malloc函数的参数,指明要分配多大的连续内存空间
//C++ -- new、delete关键字

//基本操作——初始化一个程序表(静态分配)
void InitList(SqList &L){for(int i=0;i<L.length;i++)L.data[i]=0;        //将所有数据元素设置为默认初始值L.length=0;             //顺序表初始长度为0
}//基本操作——初始化一个程序表(动态分配)
void InitList(SeqList &L){//用malloc函数申请一片连续的存储空间L.data = (int*) malloc(InitSize*sizeof(int));for(int i=0;i<L.length;i++)L.data[i]=0;        //将所有数据元素设置为默认初始值L.length=0;L.MaxSize=InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList &L,int len){int *p=L.data;L.data=(int*) malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i<L.length;i++){L.data[i]=p[i];      //将数据复制到新区域}L.MaxSize=L.MaxSize+len; //顺序表最大长度增加lenfree(p);                 //释放原来的内存空间
}
//输出顺序表
void printList(SqList &L){printf("当前顺序表的值依次为:\n");for(int i=0;i<L.length;i++){printf("%d\n",L.data[i]);}printf("\n");
}
int main(){SqList sqList;           //声明一个顺序表(静态)InitList(sqList);          //初始化顺序表(静态)
//----------------------------------------------------SeqList seqList;        //声明一个顺序表(动态)InitList(seqList);   //初始化顺序表(动态)return 0;
}

(二)、顺序表的插入删除

//顺序表的基本操作(以下方法均为静态,动态方法与之类似)
//插入(在表L中的第i个位置上插入指定元素e)
bool ListInsert(SqList &L,int i,int e){if(i<1 || i>L.length+1)      //判断i的范围是否有效return false;if(L.length>=Maxsize)        //当前存储空间已满,不能插入return false;for(int j=L.length;j>=i;j--) //将第i个元素及之后的元素后移L.data[j]=L.data[j-1];L.data[i-1]=e;               //在位置i处放入eL.length++;return true;
} //平均时间复杂度=O(n)
//删除(删除表L中第i个位置的元素,并用e返回删除元素的值)
bool ListDelete(SqList &L,int i,int &e){if(i<1 || i>L.length)       //判断i的范围是否有效return false;e=L.data[i-1];              //将被删除的元素赋值给efor(int j=i;j<L.length;j++) //将第i个位置后的元素前移L.data[j-1]=L.data[j];L.length--;                 //线性表长度减1return true;
}//平均时间复杂度=O(n)
int main(){SqList sqList;           //声明一个顺序表(静态)InitList(sqList);     //初始化顺序表(静态)//插入操作——在位置i处插入元素eListInsert(sqList,1,3);ListInsert(sqList,2,4);ListInsert(sqList,2,1);printList(sqList);//删除操作int e=-1;                //用变量e把删除的元素“带回来”if(ListDelete(sqList,1,e))printf("已删除第1个元素,删除元素值为%d\n",e);elseprintf("位序i不合法,删除失效\n");printList(sqList);//查找操作int a=LocateElem(sqList,4); //按值查找int b=GetElem(sqList,2);     //按位查找
printf("%d %d",a,b);//----------------------------------------------------SeqList seqList;        //声明一个顺序表(动态)InitList(seqList);   //初始化顺序表(动态)// 在顺序表中随便插入几个元素IncreaseSize(seqList,5);return 0;
}

(三)、顺序表的查找

//查找(静态)
//按位查找
int GetElem(SqList L,int i){ //获取表L中的第i个位置的元素的值return L.data[i-1];
} //时间复杂度O(1)//按值查找
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L,int e){for(int i=0;i<L.length;i++)if(L.data[i]==e)return i+1;     //数组下标为i的元素值等于e,返回其为序i+1return 0;               //退出循环,说明查找失败
} //时间复杂度O(n)
//查找(动态)
//按位查找
int GetElem(SeqList L,int i){ //获取表L中的第i个位置的元素的值return L.data[i-1];
}//按值查找
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L,int e){for(int i=0;i<L.length;i++)if(L.data[i]==e)return i+1;     //数组下标为i的元素值等于e,返回其为序i+1return 0;               //退出循环,说明查找失败
}

二、完整代码

(一)、顺序表的增删改查-完整代码(静态存储)

#include<iostream>
using namespace std;//定义顺序表的静态存储结构
#define Maxsize 10
typedef struct{int data[Maxsize];int length;
}SqList;//初始化顺序表
void InitSqList(SqList &L){for(int i=0;i<Maxsize;i++){L.data[i]=0;}L.length=0;
}//在顺序表位置i处插入元素e
bool InsertSqList(SqList &L,int i,int e){if(i<1 || i>L.length+1) return false;if(L.length >= Maxsize) return false;for(int j=L.length;j>i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return true;
}//在顺序表位置i处删除元素e
bool DeleteSqList(SqList &L, int i, int &e){if(i<1 || i>L.length+1) return false;e = L.data[i-1];for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}//修改顺序表位置i处元素
bool ChangeSqList(SqList &L, int i,int e){if(i<1 || i>L.length+1) return false;L.data[i-1]=e;return true;
}//查找顺序表位置i处元素
bool FindLoacteSqList(SqList &L,int i,int &e){if(i<1 || i>L.length+1) return false;e = L.data[i-1];return true;
}//查找元素e在顺序表中的位置
bool FindElemSqList(SqList &L,int &i, int e){for(int j=0;j<L.length;j++){if(L.data[j]==e){i=j+1;return true;}}return false;
}//输出顺序表
void PrintfSqList(SqList L){for(int i=0;i<L.length;i++)cout<<L.data[i]<<" ";
}int main(){SqList L;InitSqList(L);for(int i=1;i<=10;i++){InsertSqList(L,i,i);}PrintfSqList(L);cout<<endl;//删除i处元素ecout<<"删除i处元素e"<<endl;int e;cout<<DeleteSqList(L,3,e)<<endl;cout<<e<<endl;PrintfSqList(L);cout<<endl<<endl;//修改位置i处元素ecout<<"修改位置i处元素e"<<endl;cout<<ChangeSqList(L,4,10)<<endl;PrintfSqList(L);cout<<endl<<endl;//查找//查找位置i处元素ecout<<"查找位置i处元素e"<<endl;cout<<FindLoacteSqList(L,4,e)<<endl;cout<<e<<endl<<endl;//查找元素e的位置int i;cout<<"查找元素e的位置"<<endl;cout<<FindElemSqList(L,i,10)<<endl;cout<<i<<endl;return 0;
}

(二)、顺序表的增删改查-完整代码(动态存储)

#include<iostream>
using namespace std;
#define Maxsize 10//顺序表的动态存储
typedef struct{int *data;          //指向动态开辟的数组int length;         //有效数据个数int Size;           //容量空间的大小
}SqList;//初始化顺序表
//基本操作——初始化一个程序表(动态分配)
void InitSqList(SqList &L){//用malloc函数申请一片连续的存储空间L.data =(int*)malloc(Maxsize * sizeof(int));L.length=0;L.Size=Maxsize;
}//增加动态数组的长度
void IncreaseSize(SqList &L,int len){int *p=L.data;L.data=new int(Maxsize+len);for(int i=0;i<L.length;i++){L.data[i]=p[i];      //将数据复制到新区域}L.Size=L.Size+len; //顺序表最大长度增加lendelete p;
}//在顺序表位置i处插入元素e
bool InsertSqList(SqList &L,int i,int e){if(i<1 || i>L.length+1) return false;if(L.length >= L.Size) return false;for(int j=L.length;j>i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return true;
}//在顺序表位置i处删除元素e
bool DeleteSqList(SqList &L, int i, int &e){if(i<1 || i>L.length+1) return false;e = L.data[i-1];for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}//修改顺序表位置i处元素
bool ChangeSqList(SqList &L, int i,int e){if(i<1 || i>L.length+1) return false;L.data[i-1]=e;return true;
}//查找顺序表位置i处元素
bool FindLoacteSqList(SqList &L,int i,int &e){if(i<1 || i>L.length+1) return false;e = L.data[i-1];return true;
}//查找元素e在顺序表中的位置
bool FindElemSqList(SqList &L,int &i, int e){for(int j=0;j<L.length;j++){if(L.data[j]==e){i=j+1;return true;}}return false;
}//销毁顺序表
void DeleteSqList(SqList &L){free(L.data);L.data = NULL;L.length = L.Size = 0;
}//输出顺序表
void PrintfSqList(SqList L){for(int i=0;i<L.length;i++)cout<<L.data[i]<<" ";
}int main(){SqList L;InitSqList(L);for(int i=1;i<=10;i++){InsertSqList(L,i,i);}PrintfSqList(L);cout<<endl;//对动态顺序表进行扩容cout<<"对动态顺序表进行扩容"<<endl;IncreaseSize(L,10);cout<<"扩容后的长度为:"<<L.Size<<endl;InsertSqList(L,11,3);//不能直接隔着插,如直接在19处插1,因为中间是空的,代码里的互换会出问题,需要都初始化后,才能插//InsertSqList(L,19,1);//但这样是可以的,先都初始化,然后再在19处插1for(int i=12;i<=18;i++) InsertSqList(L,i,i);InsertSqList(L,19,1);PrintfSqList(L);cout<<endl;//删除i处元素ecout<<"删除i处元素e"<<endl;int e;cout<<DeleteSqList(L,3,e)<<endl;cout<<e<<endl;PrintfSqList(L);cout<<endl<<endl;//修改位置i处元素ecout<<"修改位置i处元素e"<<endl;cout<<ChangeSqList(L,4,10)<<endl;PrintfSqList(L);cout<<endl<<endl;//查找//查找位置i处元素ecout<<"查找位置i处元素e"<<endl;cout<<FindLoacteSqList(L,4,e)<<endl;cout<<e<<endl<<endl;//查找元素e的位置int i;cout<<"查找元素e的位置"<<endl;cout<<FindElemSqList(L,i,10)<<endl;cout<<i<<endl;//销毁动态顺序表DeleteSqList(L);return 0;
}

三、结语

感谢大家一直以来的不断支持与鼓励,码题集题库中的进阶塔350题正在逐步更新,之后会逐步跟进星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?

另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~

愿你的结局,配得上你一路的颠沛流离。
在这里插入图片描述

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

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

相关文章

骑砍战团MOD开发(29)-module_scenes.py游戏场景

骑砍1战团mod开发-场景制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Cw411N7G4/ 一.骑砍游戏场景 骑砍战团中进入城堡,乡村,战斗地图都被定义为场景,由module_scenes.py进行管理。 scene(游戏场景) 天空盒(Skyboxes.py) 地形(terrain code) 场景物(scene_…

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中)

文章目录 3D数学基础矢量/向量概述 - 什么是向量单位矢量&#xff1a;只关注方向不关注大小 数学运算矢量的加法与减法减法的几何意义计算一个点到另一个点的位移矢量的点积与叉积 矩阵矩阵的几何意义 3D数学基础 矢量/向量 在笔记中 变量使用小写字母表示&#xff0c;a由于…

Springboot集成RabbitMq二

接上一篇&#xff1a;Springboot集成RabbitMq一-CSDN博客 1、搭建项目-消费者 与之前一样 2、创建配置类 package com.wym.rabbitmqconsumer.utils;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.spring…

2023-12-16 LeetCode每日一题(统计区间中的整数数目)

2023-12-16每日一题 一、题目编号 2276. 统计区间中的整数数目二、题目链接 点击跳转到题目位置 三、题目描述 给你区间的 空 集&#xff0c;请你设计并实现满足要求的数据结构&#xff1a; **新增&#xff1a;**添加一个区间到这个区间集合中。 **统计&#xff1a;**计算…

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具&#xff0c;标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP&#xff1a;192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…

用Audio2Face驱动UE - MetaHuman

新的一年咯&#xff0c;很久没发博客了&#xff0c;就发两篇最近的研究吧。 开始之前说句话&#xff0c;别轻易保存任何内容&#xff0c;尤其是程序员不要轻易Ctrl S 在UE中配置Audio2Face 先检查自身电脑配置看是否满足&#xff0c;按最小配置再带个UE可能会随时崩&#x…

设计模式--适配器模式

适配器模式 适配器模式&#xff08;Adapter&#xff09;&#xff0c;将一个类的接口转换为客户希望的另一个接口&#xff0c;Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 系统的数据和行为都正确&#xff0c;但接口不符合时&#xff0c;我们应该…

19、BLIP-2

简介 github 通过利用预训练的视觉模型和语言模型来提升多模态效果和降低训练成本&#xff0c;预训练的视觉模型能够提供高质量的视觉表征&#xff0c;预训练的语言模型则提供了强大的语言生成能力。 实现过程 为了弥合模态差距&#xff0c;提出了一个分两个阶段预训练的 Qu…

YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone

前言:Hello大家好,我是小哥谈。MobileViTv3是一种改进的模型架构,用于图像分类任务。它是在MobileViTv1和MobileViTv2的基础上进行改进的,通过引入新的模块和优化网络结构来提高性能。本节课就给大家介绍一下如何在主干网络中引入MobileViTv3网络结构,希望大家学习之后能够…

MySQL基础学习: 由delete和insert操作导致的死锁问题

一、问题复现&#xff1a;表结构 CREATE TABLE user_props (user_id bigint NOT NULL ,prop_key varchar(100) NOT NULL ,prop_value varchar(100) NOT NULL,PRIMARY KEY (user_id,prop_key) )二、死锁测试 &#xff08;1&#xff09;开启两个事务 &#xff08;2&#xff09;…

C#中使用is关键字检查对象是否与给定类型兼容

目录 一、定义 二、示例 三、生成 在程序的开发过程中经常会使用类型转换&#xff0c;如果类型转换不成功则会出现异常&#xff0c;从抛出异常到捕获并处理异常&#xff0c;无形中增加了系统的开销&#xff0c;而且太过频繁地处理异常还会严重地影响系统的稳定性。is关键字可…

力扣hot100 对称二叉树 递归 队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f468;‍&#x1f3eb; 参考思路 递归的难点在于&#xff1a;找到可以递归的点 为什么很多人觉得递归一看就会&#xff0c;一写就废。 或者说是自己写无法写出来&#xff0c;关键就是你对递归理解的深不深。 对于此题&#xf…

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台&#xff0c;该平台旨在为 Solana 原生铭文项目&#xff0c;以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash&#xff0c;将会有更多的 Solana 生态的铭…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前&#xff0c;让我们以 O2 系统为例&#xff0c;解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统&#xff0c;专注于提升投放效率、分析广告效果&#xff0c;拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

springboot日志

1、日志用途 故障排查和调试&#xff1a;当项目出现异常或者故障时&#xff0c;日志记录可以快速帮助我们定位到异常的部分以及知道异常的原因。性能监测和优化&#xff1a;通过在关键代码路径中添加日志记录&#xff0c;可以了解应用程序的性能表现&#xff0c;并根据性能表…

最新-mybatis-plus 3.5分页插件配置

mybatis-plus 3.5分页插件配置 前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5&#xff0c;升级后发现原本的分页竟然不起作用了&#xff0c;每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包&#xff0c;因为版本太低…

洛谷普及组P1044栈,题目讲解(无数论基础,纯打表找规律)

[NOIP2003 普及组] 栈 - 洛谷 我先写了个打表的代码&#xff0c;写了一个小时&#xff0c;o(╥﹏╥)o只能说我真不擅长dfs。 int n; std::unordered_map<std::string, int>map; void dfs(std::vector<int>&a, int step,std::stack<int>p, std::string …

JDK17 - 开发者视角,从 JDK8 ~ JDK17 都增加了哪些新特性

目录 前言 一、站在开发视角&#xff0c;从 JDK8 升级到 JDK17 都有哪些新特性 1.1、JDK8 新特性 1.1.1、Optional 类 a&#xff09;简介 b&#xff09;使用方法 c&#xff09;使用场景 1.2、JDK9 新特性 1.2.1、Optional - ifPresentOrElse 解决 if-else 1.2.2、Opt…

泄放电路与LDO扩流电路

直接用并联电阻的方式进行能量泄放&#xff0c;这种方式简单直接但是电阻会损耗掉一定能量&#xff1a; 安规电容旁边的电阻&#xff1a; 2.三极管泄放电路&#xff1a;针对于大功率场景电阻不便于直接使用的时候&#xff0c;主要目的是电源断开时泄放大电容C1的能量。利用了三…

CNN——LeNet

1.LeNet概述 LeNet是Yann LeCun于1988年提出的用于手写体数字识别的网络结构&#xff0c;它是最早发布的卷积神经网络之一&#xff0c;可以说LeNet是深度CNN网络的基石。 当时&#xff0c;LeNet取得了与支持向量机&#xff08;support vector machines&#xff09;性能相…