顺序表的插入,删除,修改和查找(详细解析)

目录

一.顺序表的初始化----静态分配

二.顺序表的初始化----动态分配

三.顺序表的插入

1.插入操作

2.插入操作的时间复杂度

三.顺序表的删除操作

1.顺序表的删除

 2.删除操作的时间复杂度

四.顺序表的查找

1.按位查找操作:查找第i位置的元素

2.按位查找操作的时间复杂度:O(1)

3.按值查找操作

4.按值查找的时间复杂度


一.顺序表的初始化----静态分配

#include<stdio.h>
#define MaxSize 10
typedef struct{int data[MaxSize];int length;
}SqList;void InitList(SqList &L)
{for(int i=0;i<length;i++)  L.data[i]=0;L.length=0;}int main()
{SqList L;InitList(L);return 0;
}

不能写为

#include<stdio.h>
#define MaxSize 10
typedef struct{int data[MaxSize];int length;
}SqList;void InitList(SqList &L)
{L.length=0;
}int main()
{SqList L;InitList(L);for(int i=0;i<MaxSize;i++){printf("data[%d]=%d\n",i,L.data[i]);}return 0;
}

结果为

 其中有两个错误

1.未初始化数据

因为在初始化时没有设置数据元素的默认值,内存中会出现上述“4203657”,“21”这类遗留脏数据

2.i<MaxSize

上述代码中的i<MaxSize操作其实是不合理的,应该访问到顺序表的最后一个元素截止,不应该访问大于数据表长度的元素,即i<L.length

若L.length>MaxSize会报错,若将MaxSize设的稍微大些,有可能造成内存的浪费,所以最好的解决方式就是动态内存分配

二.顺序表的初始化----动态分配

#include<stdio.h>
#include<stdlib.h>#define InitSize 10
typedef struct{int *data;//指示动态分配数组的指针:L.data=(int *)malloc(InitSize*sizeof(int));int MaxSize;//顺序表的最大容量int length;//顺序表的当前长度}SeqList;void InitList(SeqList &L)
{
//申请一段连续的存储空间L.data=(int*)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;}//开辟一段新的空间
void IncreaseSize(SeqList &L,int len)
{int *p=L.data;L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i<L.length;i++){L.data[i]=p[i];//将数据复制到新区域
//虽然动态分配能让数据表的大小灵活的改变,但是会增大时间开销}L.MaxSize=L.MaxSize+len;free(p);}int main()
{SeqList();InitList();IncreaseSize(L,5);return 0;}

free函数会将*p(p指针)所指向的整块存储空间释放,归还给系统,同时p是一个局部变量,当这个函数结束后,p这个变量的存储空间也将被释放 

三.顺序表的插入

1.插入操作

#define MaxSize 10    //定义最大长度
typedef struct
{ElemType data[MaxSize];int length;//顺序表当前长度
}SqList;//顺序表类型定义void ListInsert(SqList &L,int i,int e)
{for(int j=L.length;j>=i;j--)//将第i个元素及之后的元素后移L.data[j]=L.data[j-1];L.data[i-1]=e;
//将需要插入的元素赋值e,因为数组从L.data[0]开始,所以这里第i个元素是[i-1]表示的L.length++;
}int main()
{SqList L;//声明一个顺序表InitList(L);ListInsert(L,3,3);//在三个位置插入数据元素3}

 如下图所示,表示ListInsert(L,3,3)

 若执行ListInsert(L,9,3),则会产生如下现象

 中间的值data[6],data[7]空了,而在顺序表中元素应该相邻存放,说明这段代码不够健壮,应该做如下调整

bool ListInsert(SqList &L,int i,int e)
{if(i<1||i>L.length+1)//判断i的范围是否有效return false;if(L.length>=MaxSize)//判断当前存储空间是否已满return false;for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return true;
}

2.插入操作的时间复杂度

最好情况:新元素插入到表尾,不需要移动元素
i= n+1,循环0次;最好时间复杂度=O(1);

最坏情况:新元素插入到表头,需要将原有的n个元素全都向后移动

i= 1,循环 n 次;最坏时间复杂度O(n);

平均情况:假设新元素插入到任何一个位置的概率相同,即i= 1,2,3,...,length+1 的概率都是 p=1/n+1,i= 1,循环 n 次;i=2 ,循环 n-1,i+3,循环n-2次,.....i=n+1时,循环0次
平均循环次数 =np +(n-1)p +(n-2)p + 1*p=(n(n+1)/2)*(1/n+1)=n/2

三.顺序表的删除操作

1.顺序表的删除

bool ListDelete(SqList &L,int i,int &e)
{if(i<1||i>L.length)return false;e=L.data[i-1];for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}int main()
{SqList L;InitList(L);int e=-1;if(ListDelete(L,3,e))printf("已删除第3个元素,删除元素值为=%d\n",e);elseprintf("位序i不合法,删除失败\n");return 0;}

插入

for(int j=L.length;j>=i;j--)//从后到前依次往后挪

 

删除

for(int j=i;j<L.length;j++)//从前到后依次往前挪

 

 2.删除操作的时间复杂度

最好情况:删除表尾元素,不需要移动其他元素
i= n,循环 0 次;最好时间复杂度 = O(1)

最坏情况:删除表头元素,需要将后续的 n-1 个元素全都向前移动

i= 1,循环 n-1 次;最坏时间复杂度 = O(n);

平均情况:假设删除任何一个元素的概率相同,即i= 1,2,3,...,length 的概率都是 p=1/n

平均循环次数 =(n-1)p +(n-2)p + 1*p=(n(n-1)/2)*(1/n)=n-1/2

四.顺序表的查找

1.按位查找操作:查找第i位置的元素

#define InitSize 10    //顺序表的初始长度
#include<stdio.h>
#include<stdlib.h>
typedef struct
{int *data;    //指示动态分配数组的指针int MaxSize;int length;
}SeqList;void InitList(SeqList &L)
{L.data=(int *)malloc(InitSize*sizeof(int));L.length=10;L.MaxSize=InitSize;
}int GetElem(SeqList L,int i)
{return L.data[i-1];
}int main()
{SeqList L;InitList(L); for(int i=0;i<L.length;i++)L.data[i]=i;int a;printf("请输入您要查找的位置:"); scanf("%d",&a);printf("第%d个元素是%d\n",a,L.data[a-1]);return 0;}

2.按位查找操作的时间复杂度:O(1)

3.按值查找操作

#define InitSize 10
#include<stdio.h>
#include<stdlib.h>typedef struct{int *data;int MaxSize;int length;
} SeqList;void InitList(SeqList &L)
{L.data = (int *)malloc(InitSize * sizeof(int));L.length = 10;L.MaxSize = InitSize;
}// 在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L, int e)
{for(int i=0; i<L.length; i++){if(L.data[i] == e)return i + 1; // 数组下标为i的元素值等于e,返回其位序为i+1}return 0; // 未找到该元素,返回0
}int main()
{SeqList L;InitList(L);for(int i=0; i<L.length; i++){L.data[i] = i; // 给顺序表赋值}int e = 9;int a = LocateElem(L, 9); // 在顺序表L中查找元素9if(a != 0){printf("该值位于%d\n", a); // 找到该值,输出它的位序}else{printf("未找到该值!\n"); // 未找到该值,输出提示信息}return 0;
}

4.按值查找的时间复杂度

最好情况:目标元素在表头
循环1次;最好时间复杂度 = O(1)

最坏情况:目标元素在表尾

循环 n 次;最坏时间复杂度 = O(n);
平均情况:假设目标元素出现在任何一个位置的概率相同,都是1/n
目标元素在第1位,循环1次;在第2位,循环2次;在第 n位,循环 n 次...... ;
平均循环次数 =1*1/n +1/n*2 +1/n*3 + =(n(n+1)/2)*(1/n)=n+1/2

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

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

相关文章

用友时空KSOA SQL注入漏洞复现(HW0day)

0x01 产品简介 用友时空KSOA是建立在SOA理念指导下研发的新一代产品&#xff0c;是根据流通企业最前沿的I需求推出的统一的IT基础架构&#xff0c;它可以让流通企业各个时期建立的IT系统之间彼此轻松对话&#xff0c;帮助流通企业保护原有的IT投资&#xff0c;简化IT管理&#…

面试笔记:Android 架构岗,一次4小时4面的体验

作者&#xff1a;橘子树 此次面试一共4面4小时&#xff0c;中间只有几分钟间隔。对持续的面试状态考验还是蛮大的。 关于面试的心态&#xff0c;保持悲观的乐观主义心态比较好。面前做面试准备时保持悲观&#xff0c;尽可能的做足准备。面后积极做复盘&#xff0c;乐观的接受最…

测试开发探索:“WeTalk“网页聊天室的测试流程与自动化

目录 引言&#xff1a; 测试开发目标&#xff1a; "WeTalk"项目背景 关于登录测试用例的设计 测试开发策略与流程 集成测试&#xff1a;Selenium JUnit 接口测试&#xff1a;Postman 测试用例的设计与实现 自动化测试演示&#xff1a; 用例一&#xff1a;登…

K8s环境下监控告警平台搭建及配置

Promethues是可以单机搭建的&#xff0c;参考prometheus入门[1] 本文是就PromethuesGrafana在K8s环境下的搭建及配置 Prometheus度量指标监控平台简介 启动minikube minikube start 安装helm 使用Helm Chart 安装 Prometheus Operator: helm install prometheus-operator stabl…

vscode-启动cljs

打开vscode &#xff0c;打开cljs项目文件 先npm installvscode安装插件Calva: Clojure & ClojureScript启动REPL 选择Start yout project with a REPL and connect(a.k.a. jack) 后选择shadow-cljs&#xff0c;然后选择shadow&#xff0c;如果需要选择build的话&#xf…

Java课题笔记~ Spring 集成 MyBatis

Spring 集成 MyBatis 将 MyBatis 与 Spring 进行整合&#xff0c;主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以该整合&#xff0c;只需要将 SqlSessionFactory 的对象生成器SqlSessionFactoryBean 注册在 Spring 容器中&#xff0c;再将其注入给 Dao…

MyBatis-Plus学习笔记(尚硅谷)

一、MyBatis-Plus 1.简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档&…

Centos7.9上(离线)安装Gitlab

1、下载Gitlab的rpm安装包Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm&#xff0c;如果依赖缺失&#xff0c;yum安装即可 3、vi /etc/gitlab/gitlab.rb 配置external_url&…

【Flutter】【基础】CustomPaint 绘画功能(一)

功能&#xff1a;CustomPaint 相当于在一个画布上面画画&#xff0c;可以自己绘制不同的颜色形状等 在各种widget 或者是插件不能满足到需求的时候&#xff0c;可以自己定义一些形状 使用实例和代码&#xff1a; CustomPaint&#xff1a; 能使你绘制的东西显示在你的ui 上面&a…

带你了解什么是内容协商---如何返回不同媒体类型的数据

&#x1f600;前言 本篇博文是关于客户端接收能力不同&#xff0c;SpringBoot 返回不同媒体类型的数据如何处理的说明&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#…

【数据结构】-- 栈和队列

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;数据结构 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言一、栈&#x1f4d9;1.1 栈…

7.3 详解NiN模型--首次使用多层感知机(1x1卷积核)替换掉全连接层的模型

一.前提知识 多层感知机&#xff1a;由一个输入层&#xff0c;一个或多个隐藏层和一个输出层组成。&#xff08;至少有一个隐藏层&#xff0c;即至少3层&#xff09; 全连接层&#xff1a;是MLP的一种特殊情况&#xff0c;每个节点都与前一层的所有节点连接&#xff0c;全连接…