数据结构——动态顺序表
数据结构的动态顺序表有以下几个操作:创建,销毁,初始化,增删查改和打印以及内存空间不够时的扩容
本文的宏定义:
#define SeqTypeData int
1.动态顺序表的创建
typedef struct SeqListInit{//动态顺序表的创建SeqTypeData* a;int size;//实际有效空间int capacity;//申请空间大小
}SL;
2.动态顺序表的销毁
void SeqListDestroy(SL* ps) {//顺序表销毁free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
};
值得注意的是,ps->a要赋值NULL,避免野指针的出现。
3.动态顺序表的初始化
void SeqListInit(SL* ps){//顺序表初始化ps->a = NULL;ps->capacity = ps->size = 0;
};
4.动态顺序表的增加
插入时都要判断空间是否足够,是否需要扩容,以及ps->size要加一。
(1)头插
void SeqListPushFront(SL* ps, SeqTypeData x) {//顺序表头插SeqListCheckCapacity(ps);//判断是否需要扩容//挪动数据ps->size++;for (int i = 0; i < ps->size; i++) {ps->a[ps->size - i] = ps->a[ps->size - i - 1];}ps->a[0] = x;
}
头插也就是把数据都向后挪一位,再给第一位赋值。
(2)尾插
void SeqListPushBack(SL* ps, SeqTypeData x) {//顺序表尾插SeqListCheckCapacity(ps);//判断是否需要扩容ps->a[ps->size++] = x;
}
(3)任意位置插入
void SeqListInsert(SL* ps, int adr, SeqTypeData x)//adr为逻辑地址,等于数组下标加一
{if (adr > (ps->size + 1) || adr < 1){printf("adr invalid\n");return;}SeqListCheckCapacity(ps);//判断是否需要扩容int end = ps->size ;while (end >= adr-1){ps->a[end + 1] = ps->a[end];--end;}ps->a[adr-1] = x;ps->size++;
}
任意位置插入要记得判断插入位置的合法性,再将插入位置的数据向后移一位,再在插入位置赋值即可。
5.动态顺序表的删除
进行删除操作时,要判断表是否已经是空表,此时不可再删。删除成功时,ps->size减一。
(1)头删
void SeqListPopFront(SL* ps) {//顺序表头删if (ps->size == 0){printf("顺序表为空,不可再删\n");}else{for (int i = 0; i < ps->size; i++) {ps->a[i] = ps->a[i+1];}ps->size--;}
}
(2)尾删
void SeqListPopBack(SL* ps) {//顺序表尾删if (ps->size--);else{printf("顺序表为空,不可再删\n");}
}
(3)任意位置删除
void SeqListErase(SL* ps, int adr) {if (ps->size == 0){printf("顺序表为空,不可再删\n");}if (adr > (ps->size + 1)){printf("删除位置错误\n");}for (int i = adr; i < ps->size; i++) {ps->a[i-1] = ps->a[i];}ps->size--;
}
任意位置的删除也要检验删除位置的合法性。
6.动态顺序表的任意位置的修改
void SeqListCheck(SL* ps, int adr, SeqTypeData x) {//adr为逻辑地址,等于数组下标加一if(adr>(ps->size+1))printf("修改位置错误\n");elseps->a[adr - 1] = x;
}
任意位置的修改也要检验删除位置的合法性。
7.顺序表的打印
void SeqListPrint(SL ps) {//顺序表打印for (int i = 0; i < ps.size; i++){printf("%d ", ps.a[i]);}
}
8.动态顺序表的扩容
void SeqListCheckCapacity(SL* ps) {//顺序表检查是否需要扩容if (ps->size == ps->capacity) {SeqTypeData newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SeqTypeData* tem = (SeqTypeData*)realloc(ps->a, newcapacity * sizeof(SeqTypeData));if (tem == NULL) {printf("realloc fail\n");exit(-1);}ps->a = tem;ps->capacity = newcapacity;}
}
9.全部代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"#include <stdio.h>
#include <stdlib.h>
#include <assert.h>void SeqListInit(SL* ps){//顺序表初始化ps->a = NULL;ps->capacity = ps->size = 0;
};void SeqListDestroy(SL* ps) {//顺序表销毁free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
};void SeqListPrint(SL ps) {//顺序表打印for (int i = 0; i < ps.size; i++){printf("%d ", ps.a[i]);}if (ps.size == 0)printf("顺序表为空");printf("\n");
}//int SeqListCapacity(SL* ps) {//
// return ps->capacity;
//}void SeqListPushBack(SL* ps, SeqTypeData x) {//顺序表尾插SeqListCheckCapacity(ps);ps->a[ps->size++] = x;
}void SeqListPushFront(SL* ps, SeqTypeData x) {//顺序表头插SeqListCheckCapacity(ps);//挪动数据ps->size++;for (int i = 0; i < ps->size; i++) {ps->a[ps->size - i] = ps->a[ps->size - i - 1];}ps->a[0] = x;
}void SeqListCheckCapacity(SL* ps) {//顺序表检查是否需要扩容if (ps->size == ps->capacity) {SeqTypeData newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SeqTypeData* tem = (SeqTypeData*)realloc(ps->a, newcapacity * sizeof(SeqTypeData));if (tem == NULL) {printf("realloc fail\n");exit(-1);}ps->a = tem;ps->capacity = newcapacity;}
}void SeqListPopBack(SL* ps) {//顺序表尾删if (ps->size--);else{printf("顺序表为空,不可再删\n");}
}void SeqListPopFront(SL* ps) {//顺序表头删if (ps->size == 0){printf("顺序表为空,不可再删\n");}else{for (int i = 0; i < ps->size; i++) {ps->a[i] = ps->a[i+1];}ps->size--;}
}void SeqListFind(SL ps, SeqTypeData x) {//顺序表查找/*int cnt;*/for (int i = 0; i < ps.size; i++) {if (ps.a[i] == x) {printf("%d", i + 1);//返回逻辑下标/*cnt++;*/}}/*if (cnt == 0)printf("没有这个数字");*/
}void SeqListInsert(SL* ps, int adr, SeqTypeData x)//adr为逻辑地址,等于数组下标加一
{if (adr > (ps->size + 1) || adr < 1){printf("adr invalid\n");return;}SeqListCheckCapacity(ps);int end = ps->size ;while (end >= adr-1){ps->a[end + 1] = ps->a[end];--end;}ps->a[adr-1] = x;ps->size++;
}void SeqListErase(SL* ps, int adr) {//adr为逻辑地址,等于数组下标加一if (ps->size == 0){printf("顺序表为空,不可再删\n");}if (adr > (ps->size + 1)){printf("删除位置错误\n");}for (int i = adr; i < ps->size; i++) {ps->a[i-1] = ps->a[i];}ps->size--;
}void SeqListCheck(SL* ps, int adr, SeqTypeData x) {if(adr>(ps->size+1))printf("修改位置错误\n");elseps->a[adr - 1] = x;
}void menu()
{printf("请选择\n");printf("********1.头插 2.尾插********\n");printf("********3.头删 4.尾删********\n");printf("********5.随插 6.随删********\n");printf("********7.查找 8.打印********\n");printf("********9.修改 0.退出********\n");printf("请选择\n");
}int main()
{int input;SL ps;SeqTypeData x;int adr;SeqListInit(&ps);do {menu();scanf("%d", &input);switch (input){case 1:printf("请输入头插数字\n");scanf("%d", &x);SeqListPushFront(&ps, x);break;case 2:printf("请输入尾插数字\n");scanf("%d", &x);SeqListPushBack(&ps, x);break;case 3:SeqListPopFront(&ps);break;case 4:SeqListPopBack(&ps);break;case 5:printf("请输入插入位置和数字\n");scanf("%d%d", &adr, &x);SeqListInsert(&ps, adr, x);break;case 6:printf("请输入删除位置\n");scanf("%d", &adr);SeqListErase(&ps, adr);break;case 7:printf("请输入查找数字\n");scanf("%d", &x);SeqListFind(ps, x);break;case 8:SeqListPrint(ps);break;case 9:printf("请输入修改位置和数字\n");scanf("%d%d", &adr, &x);SeqListCheck(&ps, adr, x);break;case 0:printf("正在退出中");break;}} while (input);return 0;
}
10.效果展示

由于图片大小问题,只展示了部分功能。
相关文章:
数据结构——动态顺序表
数据结构的动态顺序表有以下几个操作:创建,销毁,初始化,增删查改和打印以及内存空间不够时的扩容 本文的宏定义: #define SeqTypeData int 1.动态顺序表的创建 typedef struct SeqListInit{//动态顺序表的创建SeqT…...
Android Studio实现内容丰富的安卓宠物医院管理系统
获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端: 1.注册登录 2.系统公告 3.宠物社区(可发布宠物帖子…...
华为OD机试真题-启动多任务排序-2024年OD统一考试(C卷)
题目描述: 一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。 现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则…...
在没有推出硬盘的情况下,重启mac电脑,外接移动硬盘无法加载显示?
一、mac磁盘工具显示未装载 1.打开终端,输入 diskutil list查看当前硬盘列表,大多数时候,可以解决。 二、使用命令行装载硬盘 执行上面命令后,仍不起作用,则手动挂载,在命令行输入如下内容: …...
C++笔记:从零开始一步步手撕高阶数据结构AVL树
文章目录 高度平衡二叉搜索树实现一颗AVL树结点与树的描述——定义类AVL树的插入操作步骤1:按照二叉搜索树的方法插入结点步骤2:自底向上调整平衡因子步骤3:触发旋转操作(AVL树平衡的精髓)右单旋左单旋左右双旋右左双旋…...
CodeSys通过C函数接口调用Qt
文章目录 1.背景介绍2.修改makefile2.1.将编译器由c改成c2.2.使能opencv库2.3.使能Qt库 3.在代码中使用Qt库函数 1.背景介绍 建议先查看之前的文章【CodeSys中调用C语言写的动态库】,了解如何创建一个能够被codesys调用的动态库。 假如想要在函数中使用Qt或者第三方…...
线性代数笔记18--行列式公式、代数余子式
1. 行列式公式推导 二阶行列式推导 [ a b c d ] [ a 0 c d ] [ 0 b c d ] [ a 0 0 d ] [ a 0 c 0 ] [ 0 b c 0 ] [ 0 b 0 d ] [ a 0 0 d ] − [ b 0 0 c ] a d − b c \begin{align} \begin{bmatrix} a & b \\ c & d \end{bmatrix}& \begin{bmatrix} a &…...
最新2024年项目基金撰写与技巧及GPT融合应用
随着社会经济发展和科技进步,基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题,具备突破性的科学思路和方法。因此,基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合,形成多学科交叉…...
Java八股文(Element Plus)
Java八股文のElement Plus Element Plus Element Plus 什么是Element UI 和 Element Plus? Element UI 和 Element Plus 是基于 Vue.js 的一套非常受欢迎的开源 UI 组件库,用于快速构建具有现代化设计和丰富交互效果的前端界面。 Element UI 和 Element…...
【Hadoop】Hadoop概述与核心组件
目录 Hadoop概述Hadoop 发展历史Hadoop 三大发行版本1.Apache Hadoop(常用)2.Cloudera Hadoop3.Hortonworks Hadoop优势优势总结——4高(高可靠、高扩展、高效、高容错) Hadoop组成1.HDFS管理者:NameNode(n…...
3D地图在BI大屏中的应用实践
前言 随着商业智能的不断发展,数据可视化已成为一项重要工具,有助于用户更好地理解数据和分析结果。其中,3D地图作为一种可视化工具,已经在BI大屏中得到了广泛地应用。 3D地图通过将地理信息与数据相结合,以更加直观…...
JavaScript 进阶(二)
一、深入对象 1.1创建对象三种方式 1. 利用对象字面量创建对象 2. 利用 new Object 创建对象 3.利用构造函数创建对象 1.2 构造函数 构造函数 : 是一种特殊的函数,主要用来初始化对象。 使用场景: 常规的 {...} 语法允许创建一个对象。…...
基于ssm+layui的图书管理系统
基于ssmlayui的图书管理系统 账户类型分为:管理员,用户管理员私有功能用户私有功能公共功能技术栈功能实现图 视频演示 账户类型分为:管理员,用户 图书管理系统主要登录账户类型为管理员账户与用户账户 管理员私有功能 账户管理…...
2024年最新阿里云和腾讯云云服务器价格租用对比
2024年阿里云服务器和腾讯云服务器价格战已经打响,阿里云服务器优惠61元一年起,腾讯云服务器61元一年,2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比,阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…...
双指针算法_复写零
题目: 给一个固定长度的数组arr,将数组中出现的每一个0都复写一遍,并且将其余元素都往右移动 且不要再超过数组长度的位置写入元素,在数组上直接修改 示例: 双数组模拟操作: 从示例来看,因为…...
自习室预订系统|基于springboot框架+ Mysql+Java+B/S架构的自习室预订系统设计与实现(可运行源码+数据库+设计文档+部署说明)
推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 学生功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…...
基于Java+SpringMVC+vue+element宠物管理系统设计实现
基于JavaSpringMVCvueelement宠物管理系统设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…...
用miniconda建立PyTorch、Keras、TensorFlow三个环境
一、配置清华镜像conda源 由于网络问题,直接使用conda默认的源下载包可能会非常慢。为了解决这个问题,可以配置国内镜像源来加速包的下载。清华大学TUNA协会提供了一个常用的conda镜像源。下面是如何配置清华镜像源的步骤: 1. 配置清华conda…...
【QT 5 +Linux下qt软件点击.sh脚本运行+Dconf编辑器+学习他人文章+番外篇:点击脚本运行软件】
【QT 5 Linux下qt软件点击.sh脚本运行Dconf编辑器学习他人文章番外篇:点击脚本运行软件】 1、前言2、实验环境3、自我学习总结-本篇总结1、说明:代替qt的快捷方式2、适用性更广3、了解工具:Dconf编辑器注意事项: 4、参考链接-感谢…...
多模态大模型Claude 3正式接入集简云与语聚!对标GPT-4且支持中文
自OpenAI发布GPT-4以来,引发了业务模式与应用使用的巨大变革,掀起了各大企业对于多模态大模型的研究热潮。3月初,AnthropicClaude在官网正式发布Claude 3系列多模态大模型,据了解,该模型在多个维度上超越了GPT-4&#…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
