数据结构学习之顺序表(各种操作合集)

顺序表(各种操作合集)

顺序表的两种创建方式:

方式1:根据函数的返回值创建

  • 通过返回值返回所申请的内存空间的首地址
  • 示例代码:
list_t *create_seq_list_1(){list_t *p = (list_t *)malloc(sizeof(list_t));if(NULL == p){printf("内存分配失败\n");exit(-1);}memset(p,0,sizeof(list_t));return p;}
  • 注意事项:
  • 1.分配完内存地址空间后,一定要检查内存分配是否成功
  • 2.若内存分配失败,需要使用shell命令exit(-1)退出

方式2:根据地址传参创建

  • 使用地址传参创建顺序表;
  • 示例代码:
int create_seq_list_2(list_t **p){if(NULL == p){printf("入参为NULL\n");return -1;}*p = (list_t *)malloc(sizeof(list_t));if(NULL == *p){printf("内存分配失败\n");return -1;}memset(*p,0,sizeof(list_t));return 0;}
  • 注意事项:
  • 1.所传入的形参必须是二级指针变量,因为二级指针用来存储一级指针变量的地址,即所申请的顺序表内存空间的地址
  • 2.形参传入到创建顺序表的功能函数后,一定要做入参合理性检查
  • 3.同方式1一样,分配完内存地址空间后,一定要检查内存分配是否成功

顺序表的两种插入方式:

方式1:尾插法

  • 在顺序表末端插入数据元素,代码如下:
  • 示例代码:
int insert_seq_list_1(list_t *seq_list,int data){if(NULL == seq_list){printf("入参为NULL\n");return -1;}if(N == seq_list->count){printf("顺序表已满,插入失败\n");return -1;}seq_list->a[seq_list->count].num = data;seq_list->count++;return 0;}
  • 注意事项:
  • 1.形参传入到具有插入数据元素功能的函数后,需要做入参合理性检查
  • 2.还需要判断此时顺序表所存储的数据元素是否已满
  • 3.本示例代码中的count是计数的变量每次插入一个数据元素后,需要加1,此处易忽略

方式2:任意位置插入新数据

  • 在顺序表的任意位置插入数据元素,代码如下:
  • 示例代码:
int insert_seq_list_2(list_t *seq_list,int pos, int data){if(NULL == seq_list){printf("入参为NULL\n");return -1;}if(N == seq_list->count){printf("顺序表已满,插入失败\n");return -1;}if( pos < 0 || pos > seq_list->count){printf("插入位置不合理,插入失败\n");return -1;}int i = 0;i = seq_list->count-1;while(i >= pos){seq_list->a[i+1] = seq_list->a[i];i--;}seq_list->a[pos].num = data;seq_list->count++;return 0;
}
  • 注意事项:
  • 1.同方式1:形参传入到具有插入数据元素功能的函数后,需要做入参合理性检查
  • 2.也同方式1:还需要判断此时顺序表所存储的数据元素是否已满
  • 3.判断所要插入数据元素的位置在顺序表中是否合理
  • 4.可以采用while循环或者for循环的方式找到所要插入数据元素的位置后,此位置的数据元素以及此位置之后的所有数据元素,依次向后挪动一个位置,目的是腾出所指定的待插入位置
  • 5.将所要插入的数据元素的值赋值给该位置的值,也就是覆盖,记得count加1

顺序表的两种删除方式:

方式1:尾删法

  • 在顺序表的末端删除所存储的数据元素,代码如下:
  • 示例代码:
int delete_seq_list_1(list_t *seq_list){if(NULL == seq_list){printf("入参为NULL\n");return -1;}if(0 == seq_list->count){printf("顺序表为空,删除失败\n");return -1;}seq_list->count--;return 0;
}
  • 注意事项:
  • 1.形参传入到具有删除数据元素功能的函数后,需要做入参合理性检查
  • 2.还需要判断此时顺序表所存储的数据元素是否为空
  • 3.count是计数的变量每次删除一个数据元素后,需要减1,此处易忽略

方式2:任意位置删除旧数据

  • 在顺序表的任意位置删除数据元素,代码如下:
  • 示例代码:
int delete_seq_list_2(list_t *seq_list,int pos){if(NULL == seq_list){printf("入参为NULL\n");return -1;}if(0 == seq_list->count){printf("顺序表为空,删除失败\n");return -1;}if( pos < 0 || pos >= seq_list->count){printf("删除位置不合理,删除失败\n");return -1;}int i = pos;while(i < seq_list->count-1){seq_list->a[i] = seq_list->a[i+1];i++;}seq_list->count--;return 0;}
  • 注意事项:
  • 1.同方式1:形参传入到具有删除数据元素功能的函数后,需要做入参合理性检查
  • 2.也同方式1:还需要判断此时顺序表所存储的数据元素是否为空
  • 3.判断所要删除数据元素的位置在顺序表中是否合理,一定要区别在任意位置插入数据元素的位置合理性检查,两者略有不同,防止越界操作,所导致运行结果出错
  • 4.可以采用while循环或者for循环的方式找到所要删除数据元素的位置后,此位置之后的所有数据元素,依次向前挪动一个位置,目的是删除所指定的待删除位置
  • 5.删除所指定位置的数据元素后,记得count减1

顺序表的两种修改方式:

方式1:根据位置修改

  • 根据顺序表中数据元素的位置进行修改,代码如下:
  • 示例代码:
int modify_seq_list_1(list_t *seq_list,int pos, int data){if(NULL == seq_list){printf("入参为NULL\n");return -1;}if( pos < 0 || pos >= seq_list->count){printf("修改位置不合理,修改失败\n");return -1;}seq_list->a[pos].num = data;return 0;
}
  • 注意事项:
  • 1.形参传入到具有修改数据元素功能的函数后,需要做入参合理性检查
  • 2.判断所要修改数据元素的位置在顺序表中是否合理,if条件语句内容和任意位置删除功能函数一致;

方式2:根据数值修改

  • 根据顺序表中数据元素的值进行修改,代码如下:
  • 示例代码:
int modify_seq_list_2(list_t *seq_list,int data1, int data2){if(NULL == seq_list){printf("入参为NULL\n");return -1;}int i = 0;int count = 0;while(i < seq_list->count){if(seq_list->a[i].num == data1){seq_list->a[i].num = data2;count++;}i++;}if(0 == count){printf("顺序表中无所要修改的值\n");}return 0;
}
  • 注意事项:
  • 1.同方式1,形参传入到具有修改数据元素功能的函数后,需要做入参合理性检查
  • 2.可以采用while循环或者for循环的方式找到所要修改数据元素的值后,将新值赋值于旧值即可;
  • 3.该函数中定义的count变量,用来记录顺序表中有无所要修改的值

顺序表的查找:

  • 根据顺序表中数据元素的位置进行查找,代码如下:
  • 示例代码:
int search_seq_list(list_t *seq_list,int pos,int *num){if(NULL == seq_list || NULL == num){printf("内存分配失败\n");return -1;}if( pos < 0 || pos >= seq_list->count){printf("查找位置不合理,查找失败\n");return -1;}*num = seq_list->a[pos].num;return 0;
}
  • 注意事项:
  • 1.形参传入到具有查找数据元素功能的函数后,需要做入参合理性检查,比如函数中的形参seq_list和num
  • 2.判断所要查找数据元素的位置在顺序表中是否合理,if条件语句内容和任意位置删除功能函数一致;

顺序表的排序:

  • 根据顺序表中每个数据元素的大小,对数据元素做冒泡排序,代码如下:
  • 示例代码:
int sort_seq_list(list_t *seq_list){if(NULL == seq_list){printf("入参为NULL\n");return -1;}for(int i = 0 ; i < seq_list->count - 1; i++){for(int j = 0; j < seq_list->count - 1 - i; j++ ){if(seq_list->a[j].num > seq_list->a[j+1].num){data_t temp = seq_list->a[j];seq_list->a[j] = seq_list->a[j+1];seq_list->a[j+1] = temp;}}}printf("本次排序结束\n");return 0;
}
  • 注意事项:
  • 1.定义一个结构体变量,作为第三方变量,根据if条件语句交换两个数据元素的位置
  • 2.注意越界问题,比如第二层for循环j < seq_list->count - 1 - i;-1是为了防止越界

顺序表的去重:

  • 剔除顺序表中的重复的数据元素,例如:
11 33 55 55 66 66 66 66 
本次去重结束
11 33 55 66 
  • 示例代码:
int del_rep_seq_list(list_t *seq_list){if(NULL == seq_list){printf("入参为NULL\n");return -1;}for(int i = 0; i < seq_list->count; i++){for(int j = i + 1; j < seq_list->count;){if(seq_list->a[i].num == seq_list->a[j].num){for(int k = j; k < seq_list->count-1; k++){seq_list->a[k] = seq_list->a[k+1];}seq_list->count--;} else {j++;}}}printf("本次去重结束\n");return 0;
}
  • 注意事项:
  • 1.第二层for循环是为了在顺序表中寻找相同的数据元素
  • 2.顺序表去重的具体操作方法和在顺序表的任意位置删除数据元素操作一致

顺序表的清空:

  • 只需要将结构体变量的成员count赋值0即可清空顺序表
  • 示例代码:
int clean_seq_list(list_t *seq_list){if(NULL == seq_list){printf("入参为NULL\n");return -1;}seq_list->count = 0;printf("清空顺序表完成\n");return 0;
}
  • 注意事项:
  • 形参传入到具有清空数据元素功能的函数后,需要做入参合理性检查;

顺序表的销毁:

  • 示例代码:
int destroy_seq_list(list_t **seq_list){if(NULL == seq_list || NULL == *seq_list){printf("入参为NULL\n");return -1;}free(*seq_list);*seq_list = NULL;printf("销毁顺序表完成\n");return 0;}
  • 注意事项:
  • 1.形参传入到具有销毁数据元素功能的函数后,需要做入参合理性检查;
  • 2.使用free函数释放顺序表的内存空间后,要记得做*seq_list = NULL;操作,这样是为了防止内存空间出现野指针

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

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

相关文章

009 Linux_文件系统 | 软硬链接

前言 本文将会向你介绍文件系统与软硬链接 文章重点 本文将会先向你介绍文件是如何在磁盘上进行管理的&#xff0c;关于文件的管理将会从管理属性和管理内容两方面来谈&#xff0c;最后会向你介绍软硬链接的概念 文件在磁盘中的管理 首先&#xff0c;假设一个磁盘200GB&#…

大健康中医领域的客户画像标签数据(一)

大健康中医领域的客户画像标签数据 目前国内市场上针对大健康领域的客户数据如何收集&#xff0c;如何系统分析客户在大健康中医领域的一体化链路数据。 分步骤 1&#xff0c;健康领域的客户标签 基础标签: - 年龄:老年、中年、青年 - 性别:男性、女性 - 客户类型:个人、医…

Linux中的共享内存

定义&#xff1a; 共享内存允许两个或者多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;。由于一个共享内存段会称为一个进程用户空间的一部分&#xff0c;因此这种 IPC 机制无需内核介入。所有需要做的就是让一个进程将数 据复制进共享内存中&#xff…

acwing讲解篇之94. 递归实现排列型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 定义递归深度deep&#xff0c;数字使用情况used&#xff0c;选择的数字顺序path 进行递归 终止条件为递归深度达到n层时&#xff0c;打印path&#xff0c;然后返回 深度加一 遍历未使用的数字&#xff0c;选择数字&am…

【rust/bevy】使用points构造ConvexMesh

目录 说在前面问题提出Rapier具体实现参考 说在前面 操作系统&#xff1a;win11rust版本&#xff1a;rustc 1.77.0-nightlybevy版本&#xff1a;0.12 问题提出 在three.js中&#xff0c;可以通过使用ConvexGeometry从给定的三维点集合生成凸包(Convex Hull) import { ConvexGeo…

【51单片机Keil+Proteus8.9】温室盆栽灌溉系统

实验五 实验名称 温室盆栽灌溉系统 软件设计&#xff1a; 1. 定义对应的引脚和端口的别名。 2. 编写延时函数&#xff0c;用于控制程序的执行速度。 3. 编写LCD控制函数&#xff0c;包括发送命令和发送数据两种操作。 4. 编写显示函数&#xff0c;用于在LCD上显示字符串…

无人机打击激光器

激光器的应用非常广泛&#xff0c;涵盖了多个领域。以下是一些主要的激光器应用&#xff1a; 医疗领域&#xff1a;激光器在医疗行业中有着重要应用&#xff0c;比如用于激光手术&#xff08;如眼科手术&#xff09;、皮肤治疗、牙科治疗、肿瘤治疗等。 工业制造&#xff1a;在…

html form中的input有哪些类型?各是做什么处理使用的

在HTML表单中&#xff0c;input元素有多种类型&#xff0c;主要包括以下几种&#xff1a; button&#xff1a;用于定义可点击的按钮。 checkbox&#xff1a;用于定义复选框&#xff0c;用户可以选择多个选项。 file&#xff1a;用于定义文件输入字段&#xff0c;用户可以从本地…

无忧秘书智脑:轻松驾驭“看图说话”功能,职场沟通更高效

在现代职场中&#xff0c;有效的沟通是提升工作效率的关键。然而&#xff0c;有时候我们面对一张图片或图表&#xff0c;却难以用言语准确表达其中的信息。这时&#xff0c;无忧秘书智脑的“看图说话”功能就派上了用场。这篇文章将手把手教你如何使用这一功能&#xff0c;以及…

在使用go语言开发的时候,程序启动后如何获取程序pid

在Go语言中&#xff0c;标准库并没有直接提供获取进程ID&#xff08;PID&#xff09;的函数。通常&#xff0c;你可以使用os包和syscall包来调用底层的操作系统函数来获取PID。 以下是一个获取程序PID的示例代码&#xff1a; package mainimport ("fmt""os&qu…

【MATLAB源码-第119期】基于matlab的GMSK系统1bit差分解调误码率曲线仿真,输出各个节点的波形以及功率谱。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 GMSK&#xff08;高斯最小频移键控&#xff09;是一种数字调制技术&#xff0c;广泛应用于移动通信&#xff0c;例如GSM网络。它是一种连续相位调频制式&#xff0c;通过改变载波的相位来传输数据。GMSK的关键特点是其频谱的…

springboot(ssm仓库管理系统 wms出入库管理系统Java系统

springboot(ssm仓库管理系统 wms出入库管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…

Nginx安装配置

目录 准备工作 安装Nginx及相关组件 a、yum安装: b、tar安装: c、也可以yum安装pcre、zlib、openssl&#xff0c;tar安装nginx 启动Nginx 简单配置Nginx Nginx配置静态web服务器 Nginx实现负载均衡(不要使用刷新按钮,在地址栏回车) 1.负载均衡策略 2.配置Nginx的负载均衡与分发…

使用 Zabbix + Grafana 搭建服务器监控系统

搭建 Linux 服务器监控的目的是自己有一台阿里云服务器内存是 2g 的 , 多开一些软件就会把内存和 CPU 使用率弄的很高&#xff0c;最终导致服务器卡死。 所以基于这个痛点&#xff0c;想知道当前的 CPU 和内存是多少。阿里云 ECS 控制台中也提供对服务器的监控 , 但是为了学习…

TypeScript 函数教程 - 深入理解和使用 TypeScript

🚀 欢迎来到我的专栏!专注于Vue3的实战总结和开发实践分享,让你轻松驾驭Vue3的奇妙世界! 🌈✨在这里,我将为你呈现最新的Vue3技术趋势,分享独家实用教程,并为你解析开发中的难题。让我们一起深入Vue3的魅力,助力你成为Vue大师! 👨‍💻💡不再徘徊,快来关注…

文字的baseLine算法

使用canvas的drawText方法时候&#xff0c;除了要传入画笔和text还需要传入一个x坐标和y坐标。这边的x和y坐标是Baseline的坐标。 public void drawText(NonNull String text, float x, float y, NonNull Paint paint) {super.drawText(text, x, y, paint);} top:是 baseLine到…

mysql B+树索引

数据库索引用于提高查询性能和数据访问效率。索引可以加速数据的查找和筛选&#xff0c;减少查询的时间复杂度。数据库索引有很多类型&#xff0c;这里不展开也不比较&#xff0c;只介绍最常见一种索引结构B树索引。mysql中InnoDB引擎默认使用的就是BTREE索引。 B树数据结构 …

ubuntu设置每天定时关机

ubuntu设置每天定时关机 终端输入命令&#xff1a; sudo crontab -e输入密码&#xff0c;回车。 我这里使用nano作为编辑器&#xff0c;你可以选择vim。 在末尾输入以下命令&#xff1a; 59 23 * * * sudo -u root shutdown now设置&#xff1a;每天23:59分&#xff0c;电脑…

GitHub图床TyporaPicGo相关配置

本文作者&#xff1a; slience_me 文章目录 GitHub图床&Typora&PicGo相关配置1. Github配置2. picGo配置3. Typora配置 GitHub图床&Typora&PicGo相关配置 关于Typora旧版的百度网盘下载路径 链接&#xff1a;https://pan.baidu.com/s/12mq-dMqWnRRoreGo4MTbKg?…

SiamRPN代码研读

SiamRPN 1、概述 SiamRPN 是一种用于视觉目标跟踪的算法。它结合了 Siamese 网络&#xff08;孪生网络&#xff09;和 Region Proposal Network&#xff08;区域提议网络&#xff09;的概念。这种算法的主要目的是在视频序列中准确地跟踪单个目标。下面是它的一些关键特点&…