【数据结构】顺序表-元素去重

  1. 数据元素

结点定义,复杂数据类型,可用作整体性的管理系统。如果单独研究某些数据,比如只看学号或成绩,那么直接使用int之类的简单数据类型亦可。对应修改:typedef int Elemtype;

typedef struct student{ 	//定义学生个体 char name[100];	//姓名 int num;		//学号 
} Student;typedef Student Elemtype;

使用Elemtype做数据类型,对应修改为其他数据时更加便捷,增强代码复用性。

  1. 顺序表定义

整体性思维,顺序表整体包含数据部分和长度两个属性。数据部分采用指针的方式指向首个元素的地址,通过下标的方式进行访问与使用。

typedef struct { 	//定义顺序表的数据结构Elemtype *p;	//线性表首地址  int length;		//当前的长度  
} SeqList; 
  1. 初始化顺序表

为顺序表申请存储空间,成功后将表长度属性置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;  
}
  1. 顺序表插入元素

向第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;  
}
  1. 遍历顺序表

循环一次遍历即可。倘若访问第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. 删除元素

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--;}}   
}  
  1. 查找元素

查找方式:序号查找,按元素值进行查找。
按元素查找,需要遍历顺序表,依次比较,时间复杂度为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;  
}  

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

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

相关文章

Spring 事件监听机制介绍以及源码分析

在复杂的业务系统中&#xff0c;模块间的过度耦合往往会导致代码维护困难、扩展性受限。Spring 事件监听机制基于观察者模式&#xff0c;提供了一种优雅的解耦方案&#xff0c;使得组件间通过事件驱动实现松耦合通信。这种机制不仅被 Spring 框架内部使用&#xff08;如容器生命…

【VSCode的安装与配置】

目录&#xff1a; 一&#xff1a;下载 VSCode二&#xff1a;安装 VSCode三&#xff1a;配置 VSCode 一&#xff1a;下载 VSCode 下载地址&#xff1a;https://code.visualstudio.com/download 下载完成之后&#xff0c;在对应的下载目录中可以看到安装程序。 二&#xff1a;安装…

2024年认证杯SPSSPRO杯数学建模C题(第二阶段)云中的海盐全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现&#xff1a; 巴黎气候协定提出的目标是&#xff1a;在2100年前&#xff0c;把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平&#xff0c;并为1.5摄氏度而努力。但事实上&#xff0c;许多之前的…

Scala基础语法与简介

对象 -对象有属性和行为。例如&#xff1a;一只狗的状属性有&#xff1a;颜色&#xff0c;名字&#xff0c;行为有&#xff1a;叫、跑、吃等。对象是一个类的实例。 类 -类是对象的抽象&#xff0c;而对象是类的具体实例。 方法 -方法描述的基本的行为&#xff0c;一个类可以…

鸿蒙UI开发

鸿蒙UI开发 本文旨在分享一些鸿蒙UI布局开发上的一些建议&#xff0c;特别是对屏幕宽高比发生变化时的应对思路和好的实践。 折叠屏适配 一般情况&#xff08;自适应布局/响应式布局&#xff09; 1.自适应布局 1.1自适应拉伸 左右组件定宽 TypeScript //左右定宽 Row() { …

BeeWorks:为企业打造专网部署即时通讯解决方案

在数字化快速发展的今天&#xff0c;企业的沟通与协作越来越依赖于高效的即时通讯工具。然而&#xff0c;保障信息安全和数据隐私也变得愈发重要。这种情况下&#xff0c;专网部署即时通讯软件成为许多企业的首要选择。BeeWorks作为一款优质的专网部署即时通讯软件&#xff0c;…

uniapp笔记-swiper组件实现轮播图

思路 主要就是参考 swiper | uni-app官网 实现轮播图。 实例 新建一个banner.vue通用组件。 代码如下&#xff1a; <template><view>轮播图</view> </template><script> </script><style> </style> 随后在index.vue中导…

企业在人工智能创新与安全之间走钢丝

2025 年全球 AI/ML 工具使用量将激增&#xff0c;企业将 AI 融入运营之中&#xff0c;员工也将 AI 嵌入日常工作流程中。报告显示&#xff0c;企业对 AI/ML 工具的使用同比增长 3,000% 以上&#xff0c;凸显了各行各业迅速采用 AI 技术&#xff0c;以提升生产力、效率和创新水平…

vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.

问题描述&#xff1a; vue项目中&#xff0c;对表单数组赋值时&#xff0c;控制台抛出警告&#xff1a; 问题代码&#xff1a; 问题分析&#xff1a; 1、Vue 要求每个虚拟 DOM 节点必须有唯一的 key。该警告信息通常出现在使用v-for循环的场景中&#xff0c;多个同级节点使用…

Containerd+Kubernetes搭建k8s集群

虚拟机环境设置&#xff0c;如果不是虚拟机可以忽略不看 1、安装配置containerd 1.1 添加 Kubernetes 官方仓库 安装cri-tools的时候需要用到 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kub…

ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程

ventoy启动服务器版iso镜像&#xff0c;注意看server名称&#xff0c;跟之前desktop版ubuntu不一样。没有gui界面。好&#xff0c;进入命令行界面。语言彻底没汉化了&#xff0c;选英文吧&#xff0c;别的更看不懂。 跟桌面版ubuntu类似&#xff0c;选择是否精简系统&#xff0…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制&#xff0c;并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后&#xff0c;解锁资源&#xff0c;再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bi…

蓝桥杯备考:真题之飞机降落(暴搜+小贪心)

我们最多有十架飞机&#xff0c;可以选择dfs暴力搜索&#xff0c;枚举每种情况 那么&#xff0c;我们降落的时候怎么确定新的起点也就是newend呢&#xff1f; 如果飞机飞到机场的时刻是大于原来的end的&#xff0c;我们就让tili作为newend 否则&#xff0c;我们就让end作为ne…

解决 Element UI 嵌套弹窗的状态管理问题!!!

解决 Element UI 嵌套弹窗的状态管理问题 &#x1f527; 问题描述 ❓ 在使用 Element UI 开发一个多层嵌套弹窗功能时&#xff0c;遇到了以下问题&#xff1a; 弹窗只能打开一次&#xff0c;第二次点击无法打开 &#x1f6ab;收到 Vue 警告&#xff1a;避免直接修改 prop 值…

实时图像处理:让你的应用更智能

一、项目背景 在数字化飞速发展的今天&#xff0c;图像处理技术已成为众多领域不可或缺的核心组件。从医疗影像的精准诊断&#xff0c;到自动驾驶汽车对道路环境的实时感知&#xff0c;再到安防系统中对异常行为的迅速捕捉&#xff0c;实时图像处理正以惊人的速度改变着我们的…

AWVS中lodash如何验证

作为一名漏扫攻城狮&#xff0c;时不时会在AWVS中看到lodash这个漏洞&#xff0c;但是我只管导出报告&#xff0c;该怎么验证呢&#xff1f; 验证POC 下面就是用于验证的POC&#xff0c;把这个html中的src进行修改为扫描的网站中的lodash.min.js然后浏览器打开 <!DOCTYPE …

【算法学习计划】贪心算法(上)

目录 前言&#xff08;什么是贪心&#xff09; leetcode 860.柠檬水找零 leetcode 2208.将数组和减半的最少操作次数 leetcode 179.最大数 leetcode 376.摆动序列 leetcode 300.最长递增子序列 leetcode 334.递增的三元子序列 leetcode 674.最长连续递增序列 leetcode …

Ubuntu 22.04 安装向日葵远程控制

1. 前言 由于公司客户的服务器用是图形化桌面&#xff0c;所以我们需要一个远程控制工具来控制服务器&#xff0c;目前市面上两款比较热门的控制软件就是ToDesk和向日葵了&#xff0c;我们今天就来学习一下向日葵的使用 2. 下载软件 前往向日葵官网下载 向日葵远程控制app官…

Linux网络编程(七)——套接字的多种可选项

文章目录 7 套接字的多种可选项 7.1 套接字可选项和I/O缓冲大小 7.1.1 套接字多种可选项 7.1.2 getsockopt & setsockopt 7.1.3 SO_SNDBUF & SO_RCVBUF 7.2 地址再分配 SO_REUSEADDR 7.2.1 发生地址分配错误&#xff08;Binding Error&#xff09; 7.2.2 Time-…

使用 langchain_deepseek 实现自然语言转数据库查询SQL

文章目录 Github官网简介腾讯云DeepSeek APIDeepSeek APIChatDeepSeek安装相关库创建 .env 文件验证 API 接口 生成数据库查询SQL获取测试用数据库验证数据库查询生成数据库查询SQL Github https://github.com/langchain-ai/langchain 官网 https://python.langchain.com/do…