数据结构初阶 -- 顺序表
数据结构初阶 链表的讲解
目录
一. 线性表
1.1 定义
1.2 特点
二. 顺序表
2.1 定义
2.2 代码
2.3 功能需求
2.4 静态顺序表的特点以及缺点
2.5 动态的顺序表
2.6 动态顺序表接口的实现
三. 代码
头文件
主文件
一. 线性表
1.1 定义
- 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
- 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
看这个定义 我们再联想前面的知识
其实顺序表本质上就是数组
但是它在数组上增加了一点内容
1.2 特点
它分为静态的和动态的
这个特点和我们做的项目 通讯录 十分相似
它是连续存储的 不能跳过元素
二. 顺序表
2.1 定义
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
2.2 代码
struct SeqList
{int a[100]; //数组int size; //数组中存储了多少个
};
我们说类似这个结构的 就是一个顺序表
但是 为了我们以后改变数字方便 我们可以把这里的100 定义成一个宏 这样我们以后如果想修改顺序表的大小 只要改变宏就可以了
代码表示如下
// 静态顺序表
#define N 100
struct SeqList
{int a[N]; //数组int size; //数组中存储了多少个
};
同样的 我们想使用顺序表来管理一个字符串
#define N 100
struct SeqList
{char a[N]; int size;
};
我们可以改变int类型 变为char类型的数据 但是这样每次改也太麻烦了 所以我们依旧可以再上面定义一个宏变量
#define N 100
typedef char SLDateTypestruct SeqList
{int SLDateType[N]; int size;
};
可以使用这样的格式 方便以后一次性改变所有的变量类型
但是 这样子我们看整个结构体还是有点麻烦 我们再将这个结构体简化一下
typedef struct SeqList
{int SLDateType[N]; int size;
}SL;
2.3 功能需求
在创建好这个静态表之后 我们要开始大概创建它的一些功能
比如说以下的一些功能
vovoid SeqListInit(SL* ps);
void SeqListPushBack(SL* ps, SLDateType x);
void SeqListPopBack(SL* ps);
void SeqListPushFront(SL* ps, SLDateType x);
void SeqListPopFront(SL* ps);
2.4 静态顺序表的特点以及缺点
- 特点: 如果满了就不让插入
- 缺点: 不知道给多少合适
2.5 动态的顺序表
typedef struct SeqList
{SLDateType* a; int size; int capacity;
}SL;
跟我们的通讯录特别相似
其实原理本质上都是一样的
2.6 动态顺序表接口的实现
初始化
void SeqListInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}
尾插
- 没有空间
- 空间不够 扩容
- 空间足够
空间足够的情况
void SeqListPushBack(SL* ps, SLDateType x)
{ps->a[ps->size] = x;ps->size++;
}
代码表示如上
那么我们接下来我们写上面的两种情况
这里我们要注意的是 一开始我们将指针置空 占用的空间为0
所以说我们一开始至少要开始4个数据的空间 这里可以使用一个三目操作符解决
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
void SeqListPushBack(SL* ps, SLDateType x)
{// 如果没有空间或者空间不足 我们就扩容 // 扩容失败就报错if ((ps->size)==(ps->capacity)){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDateType* tmp =(SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));if (tmp==NULL){perror("pushback realloc");}}ps->a[ps->size] = x;ps->size++;
}
这里我们使用一个打印函数看看整个数据的内容
void SeqListPrint(SL* ps)
{int i = 0;for ( i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}
打印结果如下
在使用完成之后我们还需要一个接口函数来释放我们的动态开辟的内存 从而避免内存泄漏的问题
void SeqListDestory(SL* ps)
{free(ps->a);ps->a == NULL;ps->capacity = ps->size = 0;
}
接下来我们看尾删函数
void SeqListPopBack(SL* ps)
{ps->size--;
}
尾删的话其实我们只要将size-- 就可以
但是这里我们要注意一点 当size为0的时候 这里就不可以再删除了 所以我们还需要完善以下上面的代码
void SeqListPopBack(SL* ps)
{if (ps->size==0){perror("SeqListPopBack");}ps->size--;
}
接下来我们看头插
void SeqListPushFront(SL* ps, SLDateType x)
{// 考虑扩容问题if ((ps->size) == (ps->capacity)){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;ps->capacity = newcapacity;SLDateType* tmp = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));if (tmp == NULL){perror("pushback realloc");}ps->a = tmp;}// 头插int end = ps->size - 1;while (end>=0){ps->a[end + 1] = ps->a[end];}ps->a[0] = x;ps->size++;
}
头删
void SeqListPopFront(SL* ps)
{int bejin = 0;while (bejin<ps->size-1){ps->a[bejin] = ps->a[bejin + 1];bejin++;}ps->size--;
}
查找
int SeqListFind(SL* ps,int x)
{int i;for ( i = 0; i < ps->size; i++){if (ps->a[i]==x){return i;}}if (i==ps->size){printf("不存在这个数");}return -1;
}
在pos位置处插入数字
void SeqListPushPos(SL* ps, int x, int y)
{if ((ps->size) == (ps->capacity)){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;ps->capacity = newcapacity;SLDateType* tmp = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));if (tmp == NULL){perror("pushback realloc");}ps->a = tmp;}// 和头插差不多 // 只不过头插的起始位置有点变化了int i;for (i = ps->size - 1; i >= x; i--){(ps->a[i + 1]) = (ps->a[i]);}ps->a[x] = y;ps->size++;
}
在pos处删除数字
void SeqListPopPos(SL* ps, int x)
{assert(ps->size != 0);int i;for ( i =x; i <ps->size-1 ; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
这里我们基本实现了顺序表的所有接口函数
三. 代码
头文件
#pragma once
#define N 100
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDateType;typedef struct SeqList
{SLDateType* a; int size; int capacity;
}SL;void SeqListInit(SL* ps);
void SeqListDestory(SL* ps);
void SeqListPushBack(SL* ps, SLDateType x);
void SeqListPopBack(SL* ps);
void SeqListPushFront(SL* ps, SLDateType x);
void SeqListPopFront(SL* ps);
void SeqListPrint(SL* ps);
主文件
#include"SeqList.h"void SeqListPrint(SL* ps)
{ int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}void SeqListInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListDestory(SL* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2*ps->capacity ;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity*sizeof(SLDataType));if (tmp == NULL){printf("realloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}void SeqListPushBack(SL* ps, int x)
{/*SeqListCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;*/SeqListInsert(ps, ps->size, x);}void SeqListPopBack(SL* ps)
{/*if (ps->size == 0)return;*//*assert(ps->size > 0);ps->size--;*/SeqListErase(ps, ps->size - 1);
}void SeqListPushFront(SL* ps, int x)
{/*SeqListCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;*/SeqListInsert(ps, 0, x);
}void SeqListPopFront(SL* ps)
{assert(ps->size > 0);/*int cur = 1;for (cur = 1; cur < ps->size; cur++){ps->a[cur - 1] = ps->a[cur];}ps->size--;*/SeqListErase(ps, 0);
}int SeqListFind(SL* ps, SLDataType x)
{int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(pos >= 0 && pos <= ps->size);SeqListCheckCapacity(ps);int end = ps->size-1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SeqListErase(SL* ps, int pos)
{assert(pos >= 0 && pos < ps->size);int cur = pos + 1;while (cur < ps->size){ps->a[cur - 1] = ps->a[cur];cur++;}ps->size--;
}
相关文章:

数据结构初阶 -- 顺序表
数据结构初阶 链表的讲解 目录 一. 线性表 1.1 定义 1.2 特点 二. 顺序表 2.1 定义 2.2 代码 2.3 功能需求 2.4 静态顺序表的特点以及缺点 2.5 动态的顺序表 2.6 动态顺序表接口的实现 三. 代码 头文件 主文件 一. 线性表 1.1 定义 线性表(linear li…...

uniapp:3分钟搞定在线推送uni.createPushMessage,uni.onPushMessage
安卓端 在线推送功能演示: 1、dcloud后台申请开通uniPush dcloud后台 (1):找到我的应用 (2):点进去后,各平台信息,点击新增 (3):填…...

C/C++开发,无可避免的多线程(篇一).跨平台并行编程姗姗来迟
一、编译环境准备 在正式进入c/c多线程编程系列之前,先来搭建支持多线程编译的编译环境。 1.1 MinGW(win) 进入Downloads - MinGW-w64下载页面,选择MinGW-w64-builds跳转下载, 再次进行跳转: 然后进入下载页…...

如何把照片的底色修改为想要的颜色
如何给照片更换底色?其实有可以一键给照片更换底色的 APP ,但是几乎都要收费。如果想要免费的给照片更换底色的话,分享两种简单便捷的方法给你。掌握了这项技能,以后就不用店花钱处理啦!1、免费!线上快速 给…...

【高效办公】批量生成固定模板的文件夹名称
老师让你按照他的要求生成每位学生的文件夹,你是学委,让你马上完成该任务,但你又不想是手动一个一个码字,因此聪明的你就看到了本篇文章啦!!! 虽说一个人懒惰,并不是好的事情。 但这个似乎合情合理啊~ 然后,就动手想办法,一开始就真的打算码字了。。 思路 在实际开…...

redis的集群方式
1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 主服务器BGSAVE执行完后,向所有从服务…...

温控负荷的需求响应潜力评估及其协同优化管理研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

模电学习9. MOS管使用入门
模电学习9. MOS管使用入门一、mos管理简介1. 简介2. mos管理的特点3. MOS管的工作状态(1)放大功能(2)截止区(3)饱和区3. Mos管的分类(1)按照工作模式分类:(2&…...
【算法】【数组与矩阵模块】正数组中累加和为给定值的最长子数组长度,空间复杂度O(1)解法
目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介绍 …...
3.1.2 创建表
文章目录1.创建表2.表创建基础3.表的主键4.使用null值5.使用AUTO_INCREMENT6.指定默认值7. 字段备注8.引擎类型9.外键1.创建表 表的创建一般有俩种方式,一种是使用交互式创建和管理表的工具,比如我们安装的MariaDB,另一种是使用MySQL 语句进…...

使用netlify实现自动化部署前端项目(无服务器版本)
介绍 本文以 github仓库进行介绍关联netlify的无服务前端自动化部署。用途:个人网站设计、小游戏等当然这只是让你入门~具体细节等待你自己去探索 实现 打开官方网站 如果没有注册过的账户,你需要使用 github 去进行登录。注册完成后会自动给你提示填…...
MATLAB点云数据处理(二十九):可视化点云之pcshow参数详解与快捷键操作
文章目录 1 pcshow简述2 最简单的pcshow3 带参数的pcshow3.1 点大小参数----MakerSize3.2 背景色参数----Background3.3 指定竖直轴参数----VerticalAxis3.4 指定垂直轴方向参数----VerticalAxisDir3.5 投影参数----Projection3.6 指定可视化平面参数----ViewPlane3.7 颜色渲染…...

顺序表——重置版
本期我们来实现数据结构的顺序表(这个之前写过一次,不过本期和之前可能会略有不同,但大体相同),大家可以看一下我们之前完成的顺序表 (6条消息) 顺序表及其多种接口的实现_顺序表类中实现接口方法_KLZUQ的博客-CSDN博客…...
PyQt5自然语言处理入门案例笔记
前言 最近想将自然语言处理的项目进行可视化,尽量还是使用回Python语言,因此打算用PyQt来实现相应的功能。 入门案例 一个简单的自然语言处理的demo,使用PyQt框架,该demo可以读取文本文件,对文件中的文本进行情感分…...
使用 CSS 替换表行颜色?
跳到主内容 我正在使用一个带有交替行颜色的表格。 tr.d0 td {background-color: #CC9999;color: black; } tr.d1 td {background-color: #9999CC;color: black; }<table><tr class"d0"><td>One</td><td>one</td></tr>&…...

智能家居控制系统
🥁作者: 华丞臧. 📕专栏:【项目经验】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站…...

Linux 进程:fork()与vfork()的对比
目录一、fork函数二、vfork函数1.函数的原理2.函数的隐患3.解决函数隐患的方法在Linux的进程学习中,常使用fork函数来创建子进程,但其实还有一个vfork函数也可以创建子进程。但是这两个函数的实现机制不同,fork函数使用了写实拷贝技术&#x…...

环境搭建02-Ubuntu16.04 安装CUDA和CUDNN、CUDA多版本替换
1、CUDA安装 (1)下载需要的CUDA版本 https://developer.nvidia.com/cuda-toolkit-archive (2)安装 sudo sh cuda_8.0.61_375.26_linux.run(3)添加环境 gedit ~/.bashrc在文件末尾添加: ex…...

HOT100--(3)无重复字符的最长子串
点击查看题目详情 大思路: 创建哈希表,元素类型为<char, int>,分别是字符与其对应下标 用哈希表来存储未重复的子串,若有重复则记录下当前子串最大值maxhashsize 并且开始以相同方法记录下一子串 遍历完成以后,…...

vue keep-alive多层级路由支持
keep-alive使用 属性值 1.include - 字符串或正则表达式。只有名称匹配的组件会被缓存。 2.exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。 3.max - 数字。最多可以缓存多少组件实例。 注:匹配首先检查组件自身的 name 选项,如果 nam…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...