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

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


文章目录

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


前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


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

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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.mzph.cn/news/588196.shtml

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

相关文章

Django Rest Framework(DRF)框架搭建步骤,包含部分错误解决

一、初步搭建项目 1.使用PyCharm 2021创建Djiango项目&#xff0c;配置如下&#xff08;假设应用名叫djiango_python) Python &#xff08;3.6&#xff0c; 3.7&#xff0c; 3.8&#xff0c; 3.9&#xff0c; 3.10&#xff0c; 3.11&#xff09;> 当前版本 3.8.6Django &a…

【unity中使用高度图创建地图】

unity中使用高度图创建地图 插件 讲解案例为unity2022版本 这个是插件地址 也可以在资源商店中搜索 terrain-tools 介绍 Terrain Tools入门Terrain Tools是一个软件包&#xff0c;你可以选择将其添加到Unity 2019.1或更高版本中的任何项目中。要将该软件包添加到你的项目…

准备好通过 “Breakin’ B.I.G.” 在嘻哈音乐界大放异彩吧!

在 The Sandbox 推出人物化身系列后&#xff0c;是时候通过 “Breakin’ B.I.G.” 重返嘻哈音乐的黄金时代了。该体验于 12 月 20 日推出&#xff0c;一直持续到 1 月 3 日&#xff0c;让玩家回到 20 世纪 90 年代&#xff0c;体验以 Notorious B.I.G 为主角的 2D 街舞游戏。 获…

初始Web服务器

一、web服务器 1、什么是web服务器&#xff1f; web服务器就是web项目的容器&#xff0c;我们将开发好的web项目部署到web容器中&#xff0c;才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用&#xff1a; 在我的电脑上有一个已经做好的项目&#…

网络通信-入门1

网口框架 100M 2. 物理层解读 2.1 同步的方法&#xff1a;编码 为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置&#xff0c;在传输信号时不直接采用二进制编码。在 10BASE-T 的传输方式中采用曼彻斯特编码&#xff0c;在 100BASE-T 中则采用 4B/…

分布式技术之流量控制技术

文章目录 什么是流量控制&#xff1f;分布式系统流量控制策略漏桶策略令牌桶策略两种策略对比Sentinel 流量控制工作原理 什么是流量控制&#xff1f; 流量控制&#xff0c;如果学过计算机网络的话&#xff0c;第一反应肯定是网络传输中的流量控制。网络传输中的流量控制&…

家政行业的小程序都需要具备哪些功能?

家政服务小程序&#xff0c;覆盖多城&#xff0c;在线派单 适合行业&#xff1a;家电维修、家政保洁、养生护理、美容美发、预约服务上门等 系统功能&#xff1a;服务管理、商品管理、拼团/秒杀、订单管理、会员管理、派单管理、师傅管理、商家/服务点、财务管理、城市代理、次…

arkts中@Watch监听的使用

概述 Watch用于监听状态变量的变化&#xff0c;当状态变量变化时&#xff0c;Watch的回调方法将被调用。Watch在ArkUI框架内部判断数值有无更新使用的是严格相等&#xff08;&#xff09;&#xff0c;遵循严格相等规范。当在严格相等为false的情况下&#xff0c;就会触发Watch的…

Apollo自动驾驶系统:实现城市可持续交通的迈向

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言引言&#xff1a;1. 什么是微服务架构&#xff1f;2. 微服务架构的组成要素3. 微服务架构的挑战和解决方案4. 微服务架构的可扩展性和弹性 第二部分&#x…

ACW741.斐波那契额数列

输入整数 N&#xff0c;求出斐波那契数列中的第 N项是多少。 斐波那契数列的第 0项是 0&#xff0c;第 1项是 1&#xff0c;从第 2 项开始的每一项都等于前两项之和。输入格式 第一行包含整数 T&#xff0c;表示共有T个测试数据。接下来 T行&#xff0c;每行包含一个整数 N。输…

LeetCode刷题--- 黄金矿工

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述…

【Proteus仿真】【STM32单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈值…

[JS设计模式]Prototype Pattern

Prototype pattern Prototype pattern可便于同类型的多个对象共享属性。原型&#xff08;prototype&#xff09;是JS原生的对象&#xff0c;其他对象可以通过原型链&#xff08;prototype chain&#xff09;来访问原型。单独看这句描述可能还是有点儿抽象&#xff0c;下面通过…

深度解析ShardingJDBC:Java开发者的分库分表利器

一、ShardingSphere ShardingSphere 是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC 。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、电…

Unity 新版 Meta XR SDK 无法导入解决方法

文章目录 &#x1f4d5;教程说明&#x1f4d5;新版 SDK 说明&#x1f4d5;从 Meta 官网导入开发包⭐依赖包⭐如何导入⭐导入后包存放在哪里了&#xff1f;⭐场景样例文件去哪了&#xff1f; 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatia…

报表控件FastReport VCL 中的新 S3 传输 (Amazon)

在本文中&#xff0c;我们将探讨新的 S3 传输。从功能上来说&#xff0c;S3 与大多数人习惯使用的有很大不同&#xff0c;因此在本文的开头&#xff0c;我们将详细介绍它的主要功能。 FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全…

软件测试/测试开发丨Python内置库学习笔记

内置库 一、内置库OS 1、os概述 os: Operating Systemos 模块的常用功能跨平台的差异 2、os使用 导入 os 模块查看 os 模块使用文档 help(os)dir(os) import os# 查看os模块说明文档 help(os)# 查看os模块的属性和方法 print(dir(os))3、os 常用方法 &#xff08;1&…

全渠道客服系统推荐:选型指南与最佳实践分享

售后服务是影响客户满意度的最直接的因素。有些企业不注重产品的售后服务&#xff0c;不仅是对客户的伤害&#xff0c;更是对企业品牌的损害。所以&#xff0c;做好售后服务对于企业来讲至关重要。 企业谈到做好售后服务&#xff0c;少不了一款好用的客服系统工具。其中&#…

C# PrinterSettings修改打印机纸张类型,paperType

需求&#xff1a;直接上图&#xff0c;PrinterSettings只能改变纸张大小&#xff0c;打印质量&#xff0c;无法更改打印纸类型 爱普生打印机打印照片已经设置了最高质量&#xff0c;打印图片仍不清晰&#xff0c;需要修改打印纸类型&#xff0c;使用PrintDialog调出对话框&…

2023-12-30 AIGC-LangChain介绍

摘要: 2023-12-30 AIGC-LangChain介绍 LangChain介绍 1. https://youtu.be/Ix9WIZpArm0?t353 2. https://www.freecodecamp.org/news/langchain-how-to-create-custom-knowledge-chatbots/ 3. https://www.pinecone.io/learn/langchain-conversational-memory/ 4. https://de…