数据结构——动态顺序表
数据结构的动态顺序表有以下几个操作:创建,销毁,初始化,增删查改和打印以及内存空间不够时的扩容
本文的宏定义:
#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&#…...
好写作AI:本科毕业论文的“通关秘籍制造机”
对于众多本科生而言,撰写毕业论文就像是一场艰难的“冒险之旅”,从选题时的迷茫,到内容创作的绞尽脑汁,再到格式调整的繁琐,每一步都充满挑战。不过别担心,好写作AI(官网:https://ww…...
【typst-rs】Typst CLI 入口代码解析
这段代码是 Typst CLI 工具的入口点(main.rs),Typst 是一个基于 Rust 的排版系统。让我详细解析这段代码的结构和功能。 模块声明 (1-18行) mod args; mod compile; mod completions; mod deps; mod download; mod eval; mod fonts; mod gree…...
百度网盘资源加速工具:突破下载限制的开源解决方案
百度网盘资源加速工具:突破下载限制的开源解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 如何在不升级会员的情况下实现百度网盘高速下载?这款…...
AI赋能开发:在快马平台让qun329数据处理更智能
在开发过程中,处理复杂数据是每个开发者都会遇到的挑战。最近我在做一个名为qun329的数据处理项目时,就遇到了数据异常检测、缺失值填充和性能优化等一系列问题。幸运的是,通过InsCode(快马)平台的AI辅助开发功能,这些问题都得到了…...
深朴智能与生数科技达成深度战略合作,共筑物理世界的通用智能
4月2日,通用具身智能机器人企业北京深朴智能科技有限公司(以下简称“深朴智能”)与通用世界模型公司北京生数科技有限公司(以下简称“生数科技”)宣布达成深度战略合作。双方将围绕“通用具身智能大脑”这一核心方向展…...
VR环保学习机|开启沉浸式环保教育新时代
在环保教育不断升级的今天,如何让公众尤其是青少年真正理解环保的重要性、养成绿色习惯,已经成为教育领域的重要课题。传统的图文讲解虽然内容充足,却往往缺少互动性和代入感,难以让学习者产生深刻的记忆。VR环保学习机正是在这样…...
Graphormer模型架构深度解析:Positional Encoding如何编码分子图拓扑结构?
Graphormer模型架构深度解析:Positional Encoding如何编码分子图拓扑结构? 1. Graphormer模型概述 Graphormer是微软研究院开发的一种基于纯Transformer架构的图神经网络模型,专门为分子图(原子-键结构)的全局结构建…...
如何永久保存微信聊天记录?WeChatMsg终极免费解决方案完全指南
如何永久保存微信聊天记录?WeChatMsg终极免费解决方案完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...
MiniCPM-V-2_6政务场景应用:身份证/营业执照图像识别+结构化提取
MiniCPM-V-2_6政务场景应用:身份证/营业执照图像识别结构化提取 1. 引言:让政务文档处理更智能高效 在日常政务工作中,工作人员经常需要处理大量的身份证和营业执照图像。传统的人工录入方式不仅效率低下,还容易出错。一张身份证…...
商家做小程序需要考虑哪些关键问题?
商家做小程序需要考虑哪些关键问题?在实际业务中,商家是否要做小程序,核心并不在于技术本身,而在于是否能够解决获客、转化与用户沉淀的问题。小程序是一种依托平台运行的轻量级应用,主要用于连接用户、承载交易与优化…...
