【数据结构】线性表与顺序表

  •  🚩 WRITE IN FRONT 🚩       

  • 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎
  • 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博主、华为云享专家、阿里云专家博主、掘金优秀创作者、腾讯云年度进取作者、全网粉丝量8w+、个人社区人数累计5w+、全网访问量100w+ 🏅
  • 🆔 本文章内容由 謓泽 原创 如需相关转载请提前告知博主 ⚠
  • 📑 创作时间:2022 年 12 月 04 日 📅
  • 📝 个人主页:謓泽的博客 📃
  • 📣 专栏系列:数据结构_謓泽的博客-CSDN博客📃
  • 🙌 Gitee:謓泽 (wsxsx) - Gitee.com ⭐️
  • 🎁 点赞👍+ 收藏⭐️+ 留言📝​
  • ✉️ 我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 📩

前言 

概述⇢数据结构🐟算法真的很难对于刚接触的新手来说,所以希望在学习这个知识点的小伙伴们以及博主自己都可以坚持下来。

⛳来和博主一起干了这碗🐓汤。

所谓困难,其实是自己的本事不够;很多纠结的事情,当我们做出决定并迈出第一步的时候,最困难的那部分其实就已经完成了。

线性表

概述⇢线性表是数据结构相对来说入门的数据结构,线性主要就是呈现出"线性",算了这样说也不太明白。直接用图形表示法会更加明显,带大家理解所谓的线性。

说明⇢像上述的形式通常我们在数组当中会经常的去使用也是线性结构

正题⇢线性表(linear list) 是n个具有相同特征的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,也是必须要牢牢掌握的。

常见的顺序表
1.顺序表
2.链表
3.栈
4.队列

注意⇢包括我们常用的数组(array)以及字符串(str)也是属于顺序表的。

顺序表实现

概述⇢顺序表是用于一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组进行存储。在数组上完成数据的增删查改等处理。

顺序表分类

⑴静态顺序表:使用定长的数组进行存储。

⑵动态顺序表:使用动态开辟的数组进行存储。

⒈示例-静态顺序表

概述⇢示例代码①会使用静态顺序表来实现相关的内容并且用结构体类型的方式来进行代码的示例,里面会设计到C语言当中比较高级的语法。如果你看起来觉得一头雾水的话,建议还是再去学习下C语言吧♬

1.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"void TestSeqList1()
{unsigned int i = 0;SL sl;//这里传递地址,是因为形参实际上是实参的临时拷贝。如果不传递地址的话,形参的函数出了作用域就会被销毁。所以,我们就需要用地址传递,使得它们的地址空间是一样的,这样形参就会实例话,相当于也改变了实参。SeqListInit(&sl);for (i = 0; i < PB_MAX; i++){SeqListPushBack(&sl, i);}
}int main(void)
{TestSeqList1();return 0;
}

2.SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"void SeqListInit(SL* ps)
{//对于结构体数组初始化可以用memset() - 内存填充块进行初始化操作。memset(ps->a, 0, sizeof(int) * MAX_SIZE);ps->Size = 0;
}void SeqListPushBack(SL* ps, int x)  //顺序表
{if (ps->Size >= MAX_SIZE){printf("SeqList is Full\n");return;}else{ps->a[ps->Size] = x;ps->Size++;printf("%d.SeqList is ok-%p\n",x,&(ps->a[ps->Size]));}
}void SeqListPushFront(SL* ps, int y) 
{}void SeqListPopBack(SL* ps)			
{}void SeqListPopFront(SL* ps)		 
{}

3.SeqList.h

#ifndef __SEQLIST_H
#define __SEQLIST_H#include <stdio.h>
#include <string.h>#define MAX_SIZE 10
#define PB_MAX   10typedef struct
{int a[MAX_SIZE];int Size;
}SL;extern void SeqListInit(SL* ps);			//增删查改等接口extern void SeqListPushBack(SL* ps, int x); //顺序表
extern void SeqListPushFront(SL* ps, int y);
extern void SeqListPopBack(SL* ps);			
extern void SeqListPopFront(SL* ps);		#endif

说明⇢静态的顺序表在实际情况下是有缺陷的。

1.它数组大小是固定死的,我们是需要根据情况对数组下标进行相对应的修改,不方便。

2.浪费空间,假设要存储10个字节。而你数组存放了1000个字节的单位,这样就会浪费内存空间。

总结⇢静态的顺序表不推荐使用!

⒉示例-动态顺序表✨

概述⇢好!接下来用动态顺序表的方式来实现。如果你对于动态存储比较模糊的话,推荐你看下博主写的这篇博客相信会对你有所帮助的。

🔗malloc链接-【C语言】动态内存开辟的使用『malloc』

🔗项目参考内容 【C语言】通讯录《动态内存版本》

1.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"void TestSeqList1(s)
{unsigned int i = 0;SL sl;//这里传递地址,是因为形参实际上是实参的临时拷贝。如果不传递地址的话,形参的函数出了作用域就会被销毁。所以,我们就需要用地址传递,使得它们的地址空间是一样的,这样形参就会实例话,相当于也改变了实参。SeqListInit(&sl);for (i = 0; i < PB_MAX; i++){SeqListPushInsert(&sl, i);//插入}printf("插入:");SeqListprint(&sl);		      //打印printf("\n");printf("插入->头插:");SeqListPushFront(&sl, 5);SeqListprint(&sl);		      //打印printf("\n");printf("插入->头插->尾删:");SeqListPopBack(&sl);SeqListprint(&sl);		      //打印printf("\n");printf("插入->头插->尾删->头删:");SeqListPopFront(&sl);SeqListprint(&sl);		      //打印printf("\n");printf("插入->头插->尾删->头删->尾插:");SeqListPushBack(&sl, 6);SeqListprint(&sl);		      //打印printf("\n");printf("插入->头插->尾删->头删->尾插->初始化:");SeqListInitClearZero(&sl);SeqListprint(&sl);		      //打印printf("\n");
}int main(void)
{TestSeqList1();return 0;
}

2.SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"void SeqListInit(SL* ps)
{ps->a = NULL;ps->Size = 0;ps->capacity = 0;
}void SeqListCheckCape(SL* ps)			//检查空间,如果满了,进行增容。
{//扩容一般2倍进行,可以用relloc()进行内存填充if (ps->Size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SQDateType* tmp = (SQDateType*)realloc(ps->a, sizeof(SQDateType) * newcapacity);//如果tmp是空指针的话,说明扩容失败。if (tmp == NULL){perror("realloc fail");exit(-1); //除了exit(0)其他参数均代表程序异常退出。}else{ps->a = tmp;ps->capacity = newcapacity;}}
}void SeqListPushInsert(SL* ps, int x)    //插入
{//扩容一般2倍进行,可以用relloc()进行内存填充SeqListCheckCape(ps);ps->a[ps->Size] = x;ps->Size++; 
}void SeqListPushFront(SL* ps, int y)    //头插
{SeqListCheckCape(ps);for (int end = ps->Size - 1; end >= 0; end--){ps->a[end + 1] = ps->a[end];}ps->a[0] = y;ps->Size++;
}void SeqListPopFront(SL* ps)            //头删
{assert(ps->Size > 0);int starts = 1;while (starts < ps->Size){ps->a[starts - 1] = ps->a[starts];starts++;}ps->Size--;
}void SeqListPopBack(SL* ps)			   //尾删
{assert(ps->Size > 0);//断言,当Size大于0的时候断言失败,当Size小于等于0的时候断言成功。ps->Size--;
}void SeqListPushBack(SL* ps, int z)    //尾插
{assert(ps->Size >= 0);ps->a[ps->Size++] = z;
}void SeqListInitClearZero(SL* ps)          //初始化清0
{int i = 0;for (i = 0; i < ps->Size; i++){ps->a[i] = 0;}
}void SeqListprint(SL* ps)			   //打印
{for (int i = 0; i < ps->Size; i++){printf("%d ", ps->a[i]);}
}

🕹说明⇢有很多小伙伴可能会在第十七行有所疑问?为什么realloc()的返回值是新的整形指针,而不能直接是 ps->a 这个是因为"relloc"可能返回null指针赋值给"ps->a"(后者将作为参数传递给"relloc"将导致原始内存块会被泄露,这是一个很不安全的做法。

3.SeqList.h

#ifndef __SEQLIST_H
#define __SEQLIST_H#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>#define PB_MAX   5typedef int SQDateType;//增强程序的可维护性typedef struct
{SQDateType* a;int Size;		//有效数据个数int capacity;	//容量
}SL;extern void SeqListInit(SL* ps);			 //增删查改等接口初始化√
extern void SeqListCheckCape(SL* ps);		 //检查空间,如果满了,进行增容√
extern void SeqListPushInsert(SL* ps, int x);//插入√
extern void SeqListPushFront(SL* ps, int y); //头插√
extern void SeqListPopFront(SL* ps);		 //头删√
extern void SeqListPopBack(SL* ps);			 //尾删√ 
extern void SeqListPushBack(SL* ps, int z);  //尾插√
extern void SeqListInitClearZero(SL* ps);    //初始化0√
extern void SeqListprint(SL* ps);			 //打印√#endif

运行结果↙

说明⇢相对于静态顺序表来说无疑用动态顺序表是更加好的选择。

总结⇢动态的顺序表可以更好的去帮助我们解决问题!

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

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

相关文章

【算法】分布式共识Paxos

一、引言 在分布式系统中&#xff0c;一致性是至关重要的一个问题。Paxos算法是由莱斯利兰伯特&#xff08;Leslie Lamport&#xff09;在1990年提出的一种解决分布式系统中一致性问题的算法。 二、算法原理 Paxos算法的目标是让一个分布式系统中的多个节点就某个值达成一致。算…

【Django】前端技术-网页样式表CSS

文章目录 一、申明规则CSS的导入方式行内样式内部样式外部样式 二、CSS的选择器1. 基本选择器标签选择器&#xff1a; 选择一类标签 标签{}类选择器 class&#xff1a; 选择所有class属性一致的表情&#xff0c;跨标签.类名{}ID选择器&#xff1a;全局唯一 #id名{} 2.层次选择器…

束搜索(与贪心、穷举对比)

一、贪心搜索 1、基于贪心搜索从Y中找到具有最高条件概率的词元&#xff0c;但贪心可能不是最优解 2、比如 &#xff08;1&#xff09;贪心&#xff1a;.5*.4*.2*.1.0024 &#xff08;2&#xff09;另外&#xff1a;.5*.3*.6*.6.0054 二、穷举搜索 &#xff08;1&#xff0…

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化 Multi-head Attention的核心作用 组件/步骤描述多头注意力机制&#xff08;Multi-head Attention&#xff09;Transformer模型中的关键组件&#xff0c;用于处理序列数据功能允许模型同时关注到…

数据库 执行sql添加删除字段

添加字段&#xff1a; ALTER TABLE 表明 ADD COLUMN 字段名 类型 DEFAULT NULL COMMENT 注释 AFTER 哪个字段后面; 效果&#xff1a; 删除字段&#xff1a; ALTER TABLE 表明 DROP COLUMN 字段;

科普文:分布式架构中的三高:高并发、高性能、高可用

关于高并发 高并发场景 互联网应用以及云计算的普及&#xff0c;使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑&#xff0c;转变为如何满足大量用户的高并发访问请求。 一个简单的计算处理过程&#xff0c;如果一旦面对大量的用户访问&#xff0c;整个技术挑战就…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等&#xff0c;后面的几个专业是计算机科学与技术的重要分支&#xff0c;而这个门类的其他分支并没有单列出来一个本科专业&#xff0…

leetcode热题系列章节11

378. 有序矩阵中第K小的元素 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第k小的元素。 请注意&#xff0c;它是排序后的第k小元素&#xff0c;而不是第k个元素。 示例: matrix [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k …

【数据结构】顺序表(c语言实现)(附源码)

​ &#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 1.顺序表的概念与结构 2.顺序表的分类 3.顺序表的实现 3.1 结构定义及方法的声明 3.2 方法的实现 3.2.1 初始化 3.2.2 销毁 3.2…

Nvidia GPU驱动安装报错显卡与驱动不兼容(本身兼容)

最近在公司服务器上遇到了一个特别离谱的问题&#xff0c;就是在本身在nividia官网上面下载的匹配的显卡驱动&#xff0c;安装之后采用下面命令查看驱动显示&#xff1a; $ nvidia-smiNVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make su…

web服务器搭建练习

练习要求&#xff1a; 搭建一个web服务器&#xff0c;客户端通过www.haha.com访问该网站时能够看到内容:this is haha 完成过程&#xff1a; 1. 创建新ip&#xff0c;重启ens [rootlocalhost ~]# nmtui [rootlocalhost ~]# nmcli connection up ens1602.创建目录&#xff0…

Java面试八股之Spring boot的自动配置原理

Spring boot的自动配置原理 Spring Boot 的自动配置原理是其最吸引人的特性之一&#xff0c;它大大简化了基于 Spring 框架的应用程序开发。以下是 Spring Boot 自动配置的基本原理和工作流程&#xff1a; 1. 启动类上的注解 Spring Boot 应用通常会在主类上使用 SpringBoot…

微信支付v3

查看证书序列号 引用&#xff1a;https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan https://myssl.com/cert_decode.html # 查看证书序列号openssl x509 -in apiclient_cert.pem -noout -serial 微信支付java <dependency>…

sql-libs通关详解

1-4关 1.第一关 我们输入?id1 看回显&#xff0c;通过回显来判断是否存在注入&#xff0c;以及用什么方式进行注入&#xff0c;直接上图 可以根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显&#xff0c;所以我们可以使用联合查询。联合查询原理简单说一下&…

中间层 k8s(Kubernetes) 到底是什么,架构是怎么样的?

你是一个程序员&#xff0c;你用代码写了一个博客应用服务&#xff0c;并将它部署在了云平台上。 但应用服务太过受欢迎&#xff0c;访问量太大&#xff0c;经常会挂。 所以你用了一些工具自动重启挂掉的应用服务&#xff0c;并且将应用服务部署在了好几个服务器上&#xff0c;…

自动驾驶-机器人-slam-定位面经和面试知识系列06之C++STL面试题(02)

这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客&#xff08;某些文章上会附上内推码&#xff09;也会同步更新&a…

达梦数据库激活

SSH登录 192.168.0.148 账号&#xff1a;root 密码&#xff1a;xxx 1.上传 dm.key 文件到安装目录 /bin 目录下 cd /home/dmdba/dmdbms/bin rz -E dm.key2.修改 dm.key 文件权限 chown -R dmdba.dinstall dm.key3.打开数据库工具&#xff0c;新建查询&#xff0c;输入 cd /…

Macbook - MacOS14连接WIFI但无法打开部门网页或应用

现象&#xff1a; 遇到MacBook部分网页可以打开&#xff0c;部分网页不行。包括应用也是同个现象&#xff0c;重启路由器连接手机热点也无法解决。 解决方案&#xff1a; 系统设置/网络/位置&#xff0c;默认是【自动】&#xff0c;添加并选择新的位置即可解决。&#xff08;具…

实验2-1-5 输出带框文字

#include<stdio.h> int main(){printf("************\n");printf(" Welcome \n");printf("************\n");}

2024年【危险化学品生产单位安全生产管理人员】最新解析及危险化学品生产单位安全生产管理人员考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员最新解析参考答案及危险化学品生产单位安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及危险化学品生产单位安全生产管理人员操作证已考过的学员汇总&#xff0c;…