顺序表(C/C++)

        本篇将讲解一些关于顺序表的内容,顺序表分为静态顺序表和动态顺序表,其中经常用到的为动态顺序表,所以本篇将以动态顺序表为重点给出一些关于动态顺序表的操作。

        因为顺序表的实现逻辑较为简单,对于代码的讲解大多以注释给出。

1.顺序表相关操作

        以下包括顺序表的抽象类型定义、两种顺序表的定义方式、以及一些相关操作:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>//元素类型
typedef int DataType;
//静态表元素个数
#define MAX_SIZE 10//静态顺序表
typedef struct {       DataType arr[MAX_SIZE];int size;
}SL;//动态顺序表
typedef struct {       DataType* arr;int size;         int capacity;
}SqList;//顺序表初始化
void SLInit(SqList* ps);	//顺序表尾插/头插
void SLPushBack(SqList* ps,DataType x); 
void SLPushFront(SqList* ps, DataType x);//顺序表尾部删除/头部删除
void SLPopBack(SqList* ps);
void SLPopFront(SqList* ps);//指定位置之前插入/删除数据
void SLInsert(SqList* ps, int position, DataType x);
void SLErase(SqList* ps, int position);//在顺序表中找到相关的元素
int SLFind(SqList* ps, DataType x);//打印顺序表
void SLPrint(SqList* ps);				

2.顺序表的插入与初始化 

        顺序表的插入包括头插和尾插,头插就是在顺序表的第一个元素位置插入,尾插就是在最后一个元素后面插入。

//顺序表的初始化
void SLInit(SqList* ps) {ps->arr = NULL;ps->capacity = 0;ps->size = 0;
}//检查顺序表的当前容量
void SLCheckCapacity(SqList* ps) {if (ps->capacity == ps->size) {//三目操作符对容量进行分配int newCapacity = (ps->capacity == 0) ? 4 : 2 * ps->capacity; DataType* newBase = (DataType*)realloc(ps->arr, newCapacity * sizeof(DataType));if (newBase == NULL) {perror("realloc:");exit(1);}ps->arr = newBase;ps->capacity = newCapacity;}
}//头插
void SLPushFront(SqList* ps, DataType x) {SLCheckCapacity(ps);int count = ps->size;//将所有元素都向后移一位while (count != 0) {ps->arr[count] = ps->arr[count - 1];count--;}ps->arr[count] = x;ps->size++;
}//尾插
void SLPushBack(SqList* ps,DataType x) {SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}

3.顺序表的删除 

        以下为顺序表的头部删除和尾部删除。

//尾删
void SLPopBack(SqList* ps) {//检查顺表是否存在,以及容量是否为0assert(ps);assert(ps->size);ps->size--;
}void SLPopFront(SqList* ps) {assert(ps);assert(ps->size);//将所有元素都向前覆盖for (int i = 0; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

4.顺序表的指定插入与删除

        以下的代码对指定位置的插入与删除:

//指定位置插入
void SLInsert(SqList* ps, int position, DataType x) {//判断位置是否合法assert(position >= 0 && position <= ps->size);assert(ps);for (int i = ps->size; i > position; i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[position] = x;ps->size++;
}//指定位置删除
void SLErase(SqList* ps, int position) {assert(ps);assert(position >= 0 && position < ps->size);//从指定位置开始往前覆盖for (int i = position; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

5.顺序表的查找以及遍历 

        顺序表的查找为在表中找到对应的元素,遍历就是将所有元素给打印出来:

//顺序表的遍历
void SLPrint(SqList* ps) {assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++) {printf("%d ", ps->arr[i]);}printf("\n");
}//顺序表的查找
int SLFind(SqList* ps, DataType x) {assert(ps);assert(ps->size);int i = 0;for (i = 0; i < ps->size; i++) {if (ps->arr[i] == x) {return i + 1;}}return -1;
}

6.全部代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>//元素类型
typedef int DataType;//动态顺序表
typedef struct {       DataType* arr;int size;         int capacity;
}SqList;void SLInit(SqList* ps) {ps->arr = NULL;ps->capacity = 0;ps->size = 0;
}void SLCheckCapacity(SqList* ps) {if (ps->capacity == ps->size) {int newCapacity = (ps->capacity == 0) ? 4 : 2 * ps->capacity;DataType* newBase = (DataType*)realloc(ps->arr, newCapacity * sizeof(DataType));if (newBase == NULL) {perror("realloc:");exit(1);}ps->arr = newBase;ps->capacity = newCapacity;}
}//尾插
void SLPushBack(SqList* ps,DataType x) {SLCheckCapacity(ps);//检验容量ps->arr[ps->size] = x;ps->size++;
}//头插
void SLPushFront(SqList* ps, DataType x) {SLCheckCapacity(ps);int count = ps->size;while (count != 0) {ps->arr[count] = ps->arr[count - 1];count--;}ps->arr[count] = x;ps->size++;
}void SLPrint(SqList* ps) {assert(ps);assert(ps->size);for (int i = 0; i < ps->size; i++) {printf("%d ", ps->arr[i]);}printf("\n");
}void SLPopBack(SqList* ps) {assert(ps);assert(ps->size);ps->size--;
}void SLPopFront(SqList* 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 SLInsert(SqList* ps, int position, DataType x) {assert(position >= 0 && position <= ps->size);for (int i = ps->size; i > position; i--) {ps->arr[i] = ps->arr[i - 1];}ps->arr[position] = x;ps->size++;
}void SLErase(SqList* ps, int position) {assert(ps);assert(position >= 0 && position < ps->size);for (int i = position; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];}ps->size--;
}int SLFind(SqList* ps, DataType x) {assert(ps);assert(ps->size);int i = 0;for (i = 0; i < ps->size; i++) {if (ps->arr[i] == x) {return i + 1;}}return -1;
}int main() {SqList SL;SLInit(&SL);SLPushBack(&SL, 1);SLPushBack(&SL, 2);SLPushBack(&SL, 3);SLPushBack(&SL, 4);SLPrint(&SL);  //1 2 3 4SLPushFront(&SL, 7);SLPushFront(&SL, 6);SLPushFront(&SL, 5);SLPrint(&SL);  //5 6 7 1 2 3 4SLPopBack(&SL);SLPopBack(&SL);SLPopFront(&SL);SLPrint(&SL);  //6 7 1 2SLErase(&SL, 0);SLInsert(&SL, 2, 9);SLPrint(&SL);  //7 1 9 2int ret = SLFind(&SL, 9);if (ret == -1) {printf("have not the element\n");}else {printf("the location of element is %d\n", ret);}return 0;
}

7.测试 

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

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

相关文章

PLSQL去除一个字符串中的数字

PLSQL去除一个字符串中的数字 SQL Select regexp_replace(abc1234ABC678aaad590AAA, [0-9], ) As 去数字后From dual;效果

11.2 PCL从ROS获取激光雷达的点云数据及处理

这部分内容结合了前面的内容。其实很简单&#xff0c;分三步走就可以&#xff1a;首先是通过ROS打开激光雷达&#xff0c;查看PCL配置需要的信息。然后是用PCL通过ROS发布的topic获取激光雷达的数据。最后将ROS和PCL结合。 实现上面两步的前提是我们已经部署好了ROS环境及PCL环…

python下常用的爬虫模块

目录 一&#xff1a;requests 二&#xff1a;BeautifulSoup 三&#xff1a;Scrapy 四&#xff1a;Selenium 一&#xff1a;requests requests 是一个用于发送 HTTP 请求的 Python 库。它提供了简洁的 API 来发送各种类型的 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE…

AP8851L 宽电压降压恒压DC-DC 电源管理芯片

产品描述 AP8851L 一款宽电压范围降压型 DC-DC 电源管理芯片&#xff0c;内部集成使能 开关控制、基准电源、误差放大器、过 热保护、限流保护、短路保护等功能&#xff0c; 非常适合在宽输入电压范围具有优良 的负载和线性调整度。 AP8851L 芯片包含每周期的峰值 限流、…

云原生到底是什么意思

云原生到底是什么意思&#xff1f; 引言 随着云计算技术的迅速发展&#xff0c;云原生成为了一个备受关注的话题。云原生不仅仅是一种新的软件架构&#xff0c;更是一种变革性的开发方法论。本文将深入解析云原生的意义、特点以及为什么它在现代软件开发中变得如此重要。 云…

C++力扣题目40--组合总和II

力扣题目链接(opens new window) 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是…

数据仓库面试题

1 思维导图&数仓常见面试题 2 题目 1. 数据仓库是什么&#xff1f; 数据仓库是一个面向主题的&#xff08;订单、支付、退单等&#xff09;、集成的&#xff08;整合多个信息源的大量数据&#xff09;、非易失的&#xff08;一般不会进行删除和修改操作&#xff09;且随时…

低声下气捧于正,嘉行还“行”不“行”?

随着祝绪丹辞演于正新剧一事愈演愈烈&#xff0c;嘉行传媒又站上了舆论的风口浪尖。 事情的起因是于正的新剧开机&#xff0c;演员阵容和此前透露的有所差别&#xff0c;他声称明明已经与嘉行传媒艺人祝绪丹谈好合作&#xff0c;对方却为了另一部剧的女一号而放了他鸽子。 网…

【Java】十年老司机转开发语言,新小白从学习路线图开始

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

使用Linux搭建svn

1.安装 Apache 和 Subversion 软件包 sudo yum install httpd subversion mod_dav_svn2.启动 Apache 服务 sudo systemctl start httpd3.设置 Apache 服务开机自启动 sudo systemctl enable httpd4.创建/svn 目录 sudo mkdir /svn5.设置 /svn 目录的权限&#xff1a; sudo…

Elasticsearch各种文档操作

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据查询所有文档匹配查询文档关键字精确查询文档多关键字精确查询文档字段匹配查询文档指定查询字段查询文档 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作 查询所有文档 在 …

SpringMVC参数接收见解4

# 4.参数接收Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换…

加快网络安全事件响应速度的6个步骤

现代安全工具不断提高保护组织网络和端点免受网络犯罪分子侵害的能力。但坏人偶尔还是会找到办法进来。 安全团队必须能够阻止威胁并尽快恢复正常运行。这就是为什么这些团队不仅必须拥有正确的工具&#xff0c;而且还要了解如何有效地应对事件。可以自定义事件响应模板等资源…

【控制篇 / 分流】(7.4) ❀ 02. 对不同运营商IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带用来上网&#xff0c;一条电信&#xff0c;一条联通&#xff0c;访问常用的某些网站速度时快时慢。领导要求&#xff0c;根据上网流量的目标运营商IP归属&#xff0c;将流量送到相应的运营商出口去&#xff0c;避免跨运营商上网。那么应该怎么做&#xf…

Vim 是一款强大的文本编辑器,广泛用于 Linux 和其他 Unix 系统。以下是 Vim 的一些基本用法

Vim 是一款强大的文本编辑器&#xff0c;广泛用于 Linux 和其他 Unix 系统。以下是 Vim 的一些基本用法&#xff1a; 打开文件&#xff1a; vim filename 基本移动&#xff1a; 使用箭头键或 h, j, k, l 分别向左、下、上、右移动。Ctrl f: 向前翻页。Ctrl b: 向后翻页。…

Docker 设置 Redis 的密码失效

在网上找了设置Docker里的设置Redis密码,一段时间就失效了 1. 进入redis的容器 docker exec -it 容器ID redis-cli2. config set requirepass 密码 解决方法 1. 创建 redis.conf 配置文件 # Redis configuration file example. # # Note that in order to read the configu…

【温故而知新】HTML5代码规范/语义元素

文章目录 一、概念二、HTML5代码规范三、案例代码四、语义元素 一、概念 HTML5是HTML的最新版本&#xff0c;它引入了许多新的元素和功能&#xff0c;以适应现代网页开发的需求。以下是HTML5的一些主要特点&#xff1a; 新增语义元素&#xff1a;HTML5引入了许多新的语义元素…

用julia演示蝴蝶效应:洛伦兹吸引子

文章目录 Lorentz吸引子julia绘图关闭抗锯齿 蝴蝶效应的名字来源于蝴蝶扇动翅膀的动作&#xff0c;虽然这个动作微小&#xff0c;但可能会在数周后引起飓风等极端天气的发生。这种现象表明&#xff0c;微小的变化可能会被放大并产生非线性的结果。这个概念最早由美国气象学家爱…

linux 网络文件共享服务

存储类型 DAS 直连式存储 SAN 存储区域网络 NAS 网络附近存储 FTP文件传输协议 文件传输协议 FTP 早期的三个应用级协议之一&#xff0c;基于c/s架构 数据传输格式&#xff1a;二进制&#xff08;默认&#xff09;和文本 tcp 21端口&#xff08;权限&#xff0c;…

jmeter--8.加密传输

目录 1. Base64加密 2. MD5加密 3. SHA加密&#xff08;sha1\sha\sha224\sha256\sha384\sha512&#xff09; 4. RSA加密-公钥加密&#xff0c;私钥解密 1. Base64加密 1.1 在需要加密传输的接口下新增BeanShell 预处理程序&#xff0c;${username}可替换成value值&#xff…