【数据结构】顺序表-元素去重
- 数据元素
结点定义,复杂数据类型,可用作整体性的管理系统。如果单独研究某些数据,比如只看学号或成绩,那么直接使用int之类的简单数据类型亦可。对应修改:typedef int Elemtype;
typedef struct student{ //定义学生个体 char name[100]; //姓名 int num; //学号
} Student;typedef Student Elemtype;
使用Elemtype做数据类型,对应修改为其他数据时更加便捷,增强代码复用性。
- 顺序表定义
整体性思维,顺序表整体包含数据部分和长度两个属性。数据部分采用指针的方式指向首个元素的地址,通过下标的方式进行访问与使用。
typedef struct { //定义顺序表的数据结构Elemtype *p; //线性表首地址 int length; //当前的长度
} SeqList;
- 初始化顺序表
为顺序表申请存储空间,成功后将表长度属性置0。注意C语言调用函数malloc申请,free进行释放,需加头文件。C++使用new与delete进行释放。
#include <stdlib.h>
// C语言
L.p = (Elemtype *)malloc(sizeof(Elemtype) * MAXSIZE);
free(L.p);// C++写法
L.p=new Elemtype[MAXSIZE];
delete L.p;
//初始化线性表
int InitList(SeqList &L) { //为顺序表的元素分配内存空间,大小为100个int的大小L.p = (Elemtype *)malloc(sizeof(Elemtype) * MAXSIZE); if(!L.p)exit(0); //overflow 分配失败L.length = 0; //初始表长度为0return 0;
}
- 顺序表插入元素
向第k个位置前插入元素,那么对于长度为L.length的顺序表,可以插入的位置为1-L.length,所以判断非法位置时以此判断。
插入元素注意每个元素需往后挪一个位置,最后把k号位空出来。注意:必须先挪后面的元素,否则元素覆盖将出现数据丢失。
最后由于插入元素,顺序表长度++;
//向表尾插入元素
void InsertList(SeqList &L,Elemtype e) { if(L.length >= MAXSIZE) //判断当前的顺序表是不是已经满了return ;L.p[L.length]=e; //如果没有满,就在顺序表的后面添加元素eL.length++; //添加后顺序表长度+1return;
}//向第k个位置插入元素
void InsertList_k(SeqList &L,int k,Elemtype e) { if(L.length >= MAXSIZE) //判断当前的顺序表是不是已经满了return ;if(k<1||k>L.length+1) //插入位置不合法 return ; for(int j=L.length;j>=k;j--)L.p[j]=L.p[j-1];L.p[k-1]=e;L.length++; //添加后顺序表长度+1return;
}
- 遍历顺序表
循环一次遍历即可。倘若访问第k个位置,那么由于顺序表的特性(逻辑相邻,存储也相邻,可通过计算直接进行访问),通过下标即可访问对应位置。
Elemtype e=L.p[k-1];
//遍历顺序表
void PrintList(SeqList &L) { int i; for(i=0;i<L.length;i++) { //循环遍历打印printf("[ %s - %d ] \n",L.p[i].name,L.p[i].num); } printf("\n"); return;
}
- 删除元素
1)删除第k个元素,需要把元素往向前移动,以保证逻辑相邻,存储上依旧相邻。
2)删除顺序表中的重复元素:4种策略
①桶排序,具有去重效果,取数时只取一次;
②先排序,再对相邻元素进行去重;
③申请额外的空间,依次访问原始顺序表中的元素,与新表中元素不重复即存到末端。
④分别取每一个元素,将后续表中所有重复元素进行删除处理。
方法1,2去重后有序。方法3,4去重后数据相对位置不变。
假设顺序表数据元素个数为n,数据取值范围为m。
方法1时间复杂度O(n),空间复杂度O(m)。----受限于数据元素的取值范围,因为需要准备那么多个‘桶’。
方法2时间复杂度O(nlogn),空间复杂度O(1)。----排序采用O(nlogn)的算法,去重时可以考虑双指针,i指向当前处理的数据,j单独记录非重复元素个数,i向后移动直到元素不重复,将i位置元素移动到j的位置,并j++。时间复杂度为O(1)。
方法3时间复杂度O(n^2),空间复杂度O(n)。----双层循环比较原始顺序表与新顺序表中的每一个元素是否相同。
方法4时间复杂度O(n^3),空间复杂度O(1)。----双层循环寻找重复元素位置,额外一层循环用于删除元素后的移动操作。
//删除第k个元素
void Delete_k(SeqList &L,int k) { if(k<1||k>L.length) //删除位置不合法 return ; for(int j=k-1;j<L.length-1;j++)L.p[j]=L.p[j+1];L.length--; //删除后顺序表长度-1return;
}//删除重复值
void Deletep(SeqList &L) {int i,j;int temp; for(i=0;i<L.length-1;++i) { //循环整个顺序表for(j=i+1;j<L.length;j++) //每次判断当前元素和它之后的所有元素是否重复if(L.p[i].num==L.p[j].num) {//如果有与i相同的元素j,则j后面的所有的元素往前一位,覆盖掉jfor(int k=j;k<L.length;k++)L.p[k]=L.p[k+1];L.length--; j--;}}
}
- 查找元素
查找方式:序号查找,按元素值进行查找。
按元素查找,需要遍历顺序表,依次比较,时间复杂度为O(n)。
//查找第k个元素
void find_k(SeqList L,int k, Elemtype &e) { if(k<1||k>L.length) //查找位置不合法 return ; e=L.p[k-1]; return;
}//查找元素e的位置
int find_e(SeqList L,Elemtype e) { for(int i=0;i<L.length;i++) //循环整个顺序表if(L.p[i].num==e.num) return i+1;
}
- 完整代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
//线性顺序表
typedef struct student{ //定义学生个体 char name[100]; //姓名 int num; //学号
} Student;typedef Student Elemtype;typedef struct { //定义顺序表的数据结构Elemtype *p; //线性表首地址 int length; //当前的长度
} SeqList; //初始化线性表
int InitList(SeqList &L) { //为顺序表的元素分配内存空间,大小为100个int的大小L.p = (Elemtype *)malloc(sizeof(Elemtype) * MAXSIZE); if(!L.p)exit(0); //overflow 分配失败L.length = 0; //初始表长度为0return 0;
}//向表尾插入元素
void InsertList(SeqList &L,Elemtype e) { if(L.length >= MAXSIZE) //判断当前的顺序表是不是已经满了return ;L.p[L.length]=e; //如果没有满,就在顺序表的后面添加元素eL.length++; //添加后顺序表长度+1return;
}//向第k个位置插入元素
void InsertList_k(SeqList &L,int k,Elemtype e) { if(L.length >= MAXSIZE) //判断当前的顺序表是不是已经满了return ;if(k<1||k>L.length+1) //插入位置不合法 return ; for(int j=L.length;j>=k;j--)L.p[j]=L.p[j-1];L.p[k-1]=e;L.length++; //添加后顺序表长度+1return;
}//遍历顺序表
void PrintList(SeqList &L) { int i; for(i=0;i<L.length;i++) { //循环遍历打印printf("[ %s - %d ] \n",L.p[i].name,L.p[i].num); } printf("\n"); return;
}//删除第k个元素
void Delete_k(SeqList &L,int k) { if(k<1||k>L.length) //删除位置不合法 return ; for(int j=k-1;j<L.length-1;j++)L.p[j]=L.p[j+1];L.length--; //删除后顺序表长度-1return;
}//删除重复值
void Deletep(SeqList &L) {int i,j;int temp; for(i=0;i<L.length-1;++i) { //循环整个顺序表for(j=i+1;j<L.length;j++) //每次判断当前元素和它之后的所有元素是否重复if(L.p[i].num==L.p[j].num) {//如果有与i相同的元素j,则j后面的所有的元素往前一位,覆盖掉jfor(int k=j;k<L.length;k++)L.p[k]=L.p[k+1];L.length--; j--;}}
} //查找第k个元素
void find_k(SeqList L,int k, Elemtype &e) { if(k<1||k>L.length) //查找位置不合法 return ; e=L.p[k-1]; return;
}//查找元素e的位置
int find_e(SeqList L,Elemtype e) { for(int i=0;i<L.length;i++) //循环整个顺序表if(L.p[i].num==e.num) return i+1;
}int main() {SeqList list; //定义变量InitList(list); //初始化线性表list,对list进行修改,这里是值传递int n; //定义要存放的数的个数scanf("%d",&n); //输入n的值int i;Student temp; for(i=0;i<n;i++) { //循环给顺序表输入数值scanf("%d",&temp.num);scanf("%s",temp.name);
// InsertList_k(list,1,temp); // 输入数据后逆序存储,相当于前插法InsertList_k(list,list.length+1,temp); //输入数据顺序存储,相当于后插法}Deletep(list) ;//删除冗余数值printf("顺序表长度:%d\n",list.length);//打印删除后的顺序表的长度PrintList(list);//打印顺序表return 0;
}
相关文章:
【数据结构】顺序表-元素去重
数据元素 结点定义,复杂数据类型,可用作整体性的管理系统。如果单独研究某些数据,比如只看学号或成绩,那么直接使用int之类的简单数据类型亦可。对应修改:typedef int Elemtype; typedef struct student{ //定义学生…...
物理安全——问答
目录 1、计算机的物理安全包含哪些内容 1. 设备保护 2. 访问控制 3. 电力与环境安全 4. 数据存储保护 5. 硬件防护 6. 监控与审计 7. 灾难恢复与应急响应 8. 拆卸与维修安全 2、物理安全有哪些需要关注的问题 1、计算机的物理安全包含哪些内容 1. 设备保护 防止盗窃&…...
element-plus中,Loading 加载组件的使用
一.基本使用 给一个组件,如:table表格,加上v-loading"true"即可。 举例:复制如下代码。 <template><el-table v-loading"loading" :data"tableData" style"width: 100%"><…...
Mybatis_Plus中的常用注解
目录 1、TableName TableId TableId的type属性 TableField 1、TableName 经过以上的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操…...
云数据库概念
1.云数据库概念 云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了数据库的存储能力,消除了人员、硬件、软件的重复配置,让软、硬件升级变得更加容易。云…...
高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系
一句话总结 在高并发金融系统中,审计方案设计需平衡"观测粒度"与"系统损耗",通过双AOP实现非侵入式采集,三表机制保障操作原子性,最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...
UDP视频传输中的丢包和播放花屏处理方法
在处理UDP视频传输中的丢包和花屏问题时,需要结合编码优化、网络传输策略和接收端纠错技术。以下是分步骤的解决方案: 1. 前向纠错(FEC,Forward Error Correction) 原理:在发送数据时附加冗余包,接收方通过冗余信息恢复丢失的数据包。 实现方法: 使用Reed-Solomon、XO…...
企业内训|DeepSeek技术革命、算力范式重构与场景落地洞察-某头部券商
3月19日北京,TsingtaoAI公司负责人汶生受邀为某证券公司管理层和投资者举办专题培训,围绕《DeepSeek技术革命、算力范式重构与场景落地洞察》主题,系统阐述了当前AI技术演进的核心趋势、算力需求的结构性变革,以及行业应用落地的关…...
K8S学习之基础五十二:k8s配置jenkins
k8s配置jenkins...
VS Code C/C++项目设置launch.json中的environment参数解决支持库路径问题
问题描述 Windows 11 VS Code C/C 开发环境搭建分别写了c和cpp两个示例代码,在运行过程中c代码没有发现问题(可能简单,没有用到太多支持),但使用了stl的cpp代码并没有运行出来,如下图: 出问题…...
怎样解决 Windows 11 上的 DirectX 错误,最新DX 问题解决方法
在使用 Windows 11 操作系统的过程中,大家可能会遇到 DirectX 错误的情况,这可能会给游戏体验、多媒体应用甚至是系统的整体性能带来负面影响。不过别担心,本文将为大家详细介绍如何解决 Windows 11 上的 DirectX 错误,让您的系统…...
Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式
以下是Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式: // 1. 目标类(被增强的类) package com.example;public class TargetService {public void doTask(String param) {System.out.println("…...
.net平台C#对于2D/二维点云处理用哪些库?
对于单线激光雷达生成的2D点云数据的处理, 虽然比较简单, 但网上的资料比较少, PCL是避不开的, 但它主要处理的是3D点云, 对2D也可以处理, 但它是C语言的, 如果使用的是C语言开发&#x…...
PH热榜 | 2025-03-30
1. Deepcord 标语:Discord 数据分析:获取指标洞察与受众研究 介绍:Deepcord:为社区建设者提供的Discord分析工具。跟踪超过50万个服务器的指标,发现热门社区,监控竞争对手,找到你的目标受众。…...
STM32H743学习记录
2025/03/30 SRAM速率计算方式 MCU主频 乘以 单片机位数 除以 每个字节的位数(8)即可得出单片机的SRAM速率 如72M主频32位单片机速率 72 * 32 / 8 288 M/s FLASH速率计算方式 FLASH大小 乘以 单片机位数 除以 每个字节位数(8)…...
Open webui的使用
问题 之前本地量化模型管理器ollama的文章,我们知道可以通过ollama来管理本地量化模型,也能够在命令行中与相关模型进行对话。现在我们想要在有个web页面通过浏览器来与本地模型对话。这里我们就使用Open webui作为界面来与本地模型对话。 安装启动 这…...
swagger上传图片请求报错
1.如下是上传图片的接口 ApiOperation(value "WF开卡审核-关店换卡信用卡证明")PostMapping(value "/uploadPhoto/{id}")public Result<?> uploadPhoto(List<MultipartFile> file,PathVariable Long id) {return wfAuditService.uploadPhot…...
STM32单片机的桌面宠物机器人(基于HAL库)
效果 基于STM32单片机的桌面宠物机器人 概要 语音模块:ASR PRO,通过天问block软件烧录语音指令 主控芯片:STM32F103C8T6 使用HAL库 屏幕:0.96寸OLED屏,用来显示表情 4个舵机,用来当作四只腿 底部一个面…...
python 语法篇(一)
目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数(1)re.search()--搜索第一个匹配项(2)re.match() - 从字符串开头匹配(3)re.findall() - 返回所有匹配项的列表(4)re.fi…...
【记录自己第一个github 100星项目】采用flask框架构建一个前端页面,进行OpenManus的调用,对OpenManus生成的文件进行预览。
OpenManus-WebUI...
flutter android端抓包工具
flutter做的android app,使用fiddler抓不了包,现介绍一款能支持flutter的抓包工具Reqable,使用方法如下: 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk…...
求矩阵某列的和
设计函数sum_column( int A[E1(n)][E2(n)], int j ),E1(n)和E2(n)分别为用宏定义的行数和列数,j为列号。在该函数中,设计指针ptr&A[0][j],通过*ptr及ptrptrE2(n)访问第j列元素,从而求得第j列元素的和。在主函数中定…...
Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(ollama方式)
操作系统:Ubuntu Linux 22.04 一、安装模型运行环境 打开链接https://ollama.com/download/linux 1.安装ollama (1)一条指令即可实现的简易版安装方法(也可称为在线安装) curl -fsSL https://ollama.com/install.s…...
软件工程面试题(十五)
1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…...
深度学习处理时间序列(6)
RNN的高级用法 循环dropout(recurrent dropout):这是dropout的一种变体,用于在循环层中降低过拟合。 循环层堆叠(stacking recurrent layers):这会提高模型的表示能力(代价是更…...
【鸿蒙5.0】向用户申请麦克风授权
#效果图 步骤 在 config.json 里声明权限:在项目的 config.json 文件中添加麦克风权限的声明,告知系统应用需要使用该权限。检查权限状态:在代码里检查应用是否已经获得了麦克风权限。请求权限:若应用未获得麦克风权限࿰…...
用 Python 实现机器学习小项目:从入门到实战
用 Python 实现机器学习小项目:从入门到实战 在人工智能蓬勃发展的今天,机器学习早已成为技术人绕不开的关键词。无论你是初学者还是转行者,学习一门编程语言并通过小项目实战,都是掌握机器学习的最佳方式。本文将以 Python 为编程…...
从“制造”到“智造”:生产线自动检测的技术变革与实践
从“制造”到“智造”:生产线自动检测的技术变革与实践 在工业4.0的浪潮下,生产线自动检测技术正成为制造业转型升级的关键驱动力。传统的人工检测方式因效率低、误差高、成本高等问题,逐渐被更智能、更高效的自动检测技术所取代。本文将从技术背景、核心技术、应用场景以及…...
【解决】导入PNG图片,转 Sprite 格式成功但资产未生效问题
开发平台:Unity 6.0 图片格式:.png 问题描述 当 PNG 成功转换为 Sprite(精灵)时,资产状态将显示扩展箭头,即表明该资产可 Sprite 使用。 解决方法:设置正确的 Sprite Mode Single 关于 Spr…...
Maven:Java项目构建与依赖管理工具
Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型(POM),本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化,通过一系列约定和…...
