首页 > 其他分享 >数据结构学习笔记---线性表:顺序表(插入)

数据结构学习笔记---线性表:顺序表(插入)

时间:2024-11-08 09:20:34浏览次数:7  
标签:线性表 删除 int 元素 --- length 循环 数据结构 data

顺序表的基本操作——插入

首先,静态分配一个顺序表

#include <stdio.h>
#include <stdlib.h>

#define MaxSize 5  // 定义队列的最大长度

typedef struct {
	int data[MaxSize];
	int length;
}SqList;

然后实现插入方法,for循环

我们提前插入了四个元素,顺序排放

原理是以i为插入位置(位序),e为插入的元素,j为这个顺序表的长度为5,当j所代表的长度大于等于插入位置时,这个循环就会继续,每一轮循环之后j自减1,此时j为5,然后进入循环把原本在位序4的元素放到位序5的位置,然后循环继续到j<i,此时插入元素e,因为位序和数组下标不同,位序比下标多1,最后扩大顺序表的长度+1.

void ListInsert(SqList& L, int i, int e) {
	for (int j = L.length; j >= i; j--)
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;
	L.length++;
}

但此时代码还不够健壮,我们无法让别人知道自己想插入的操作是否合法,此时要考虑到:

L的范围是(1,length+1),并且插入操作不能违反顺序表的规则,不能隔空插入

我们可以使用bool型来实现这个需求

bool ListInsert(SqList& L, int i, int e) {
	if (i<1 || i>L.length + 1)
		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;
}

这样代码就能够拥有足够的“防患于未然性”

插入操作的时间复杂度

关注最深层循环语句的执行次数与问题规模n的关系

L.data[j] = L.data[j - 1];

问题规模n=L.length(表长)

最好情况:新元素插入到表尾,不需要移动元素 i = n+1 ,循环 0 次; 最好时间复杂度 = O(1) 最坏情况:新元素插入到表头,需要将原有的 n 个元素全都向后移动 i=1 ,循环 n 次; 最坏时间复杂度 =O(n); 平均情况:假设新元素插入到任何一个位置的概率相同,即 i=1,2,3,…,length+1 的概率都是p=/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 平均时间复杂度 =O(n)

顺序表的基本操作——删除

删掉某一处元素然后把后面的数据往前移一位再让顺序表长度减1

和插入相反

ListDelete(&L,i,&e) :删除操作。删除表 L 中第 i 个位置的元素, 并用 e 返回删除元素的值。
//删除
bool ListDelete(SqList &L, int i, int &e) {
	if (i<1 || i>L.length)     //判断i的范围是否有效
		return false;
	e = L.data[i - 1];         //将被删除的元素赋值给e
	for (int j = i; j < L.length; j++)//将第i个位置后的元素前移
		L.data[j - 1] = L.data[j];
	L.length--;                //线性表长度减1
	return true;
}

int main() {
	SqList L;               //声明一个顺序表
	InitList(L);            //初始化顺序表
	L.data[0] = 3;
	L.data[1] = 4;
	L.data[2] = 5;
	L.data[3] = 6;
	L.data[4] = 7;
	int e = -1;            //用变量e把删除的元素“带回来”
	if (ListDelete(L,3,e))
		printf("已删除第三个元素,删除元素值为=%d\n", e);
	else
		printf("位序i不合法,删除失败\n");
	return 0;
}

这里的变量e根据顺序表中的数据类型而改变,内存会专门开辟一个空间给e用

依然使用bool类型使代码健壮起来,防止输入不正常值

if语句调用删除语句,意思为删除L顺序表的第三个元素并用e这个元素代表返回

如果在bool中的语句没有返回false,那么就把要删除的值复制给e,然后让后面的每一个值的位序前移一位

然后线性表长度减一,返回true,输出删除语句

(e在删除方法中是一个引用数据类型,它和main函数中的值在内存当中对应同一个值,如果我们在删除方法中没有添加引入符号,就无法使用,这时相当于方法中的e是赋给了内存中的一个新的开辟空间,是main函数中e的一个复制品,没有与main函数中的e联系起来,这时main中的e还是-1)

前面的&L同理,也是复制了一个区域,进行操作,没有与main函数联系,在这一块,有点像Java里面的方法调用

删除是先把前面的元素往前移,然后下一个往前移 插入是先把最后一个元素往后移,再后移其他元素

删除操作的时间复杂度

问题规模 n = L.length (表长) 最好情况:删除表尾元素,不需要移动其他元素 i = n ,循环 0 次; 最好时间复杂度 = O(1) 最坏情况:删除表头元素,需要将后续的 n-1 个元素全都向前移动 i = 1 ,循环 n-1 次; 最坏时间复杂度 = O(n); 平均情况:假设删除任何一个元素的概率相同,即 i = 1,2,3, … , length 的概率都是 p = 1/n i = 1 ,循环 n-1 次; i=2 时,循环 n-2 次; i=3 ,循环 n-3 次 …… i =n 时,循环 0 次 问题规模 n = L.length (表长) 平均循环次数 = (n-1)p + (n-2)p + …… + 1 ⋅ p = n-1/2 平均时间复杂度 = O(n)

标签:线性表,删除,int,元素,---,length,循环,数据结构,data
From: https://blog.csdn.net/THRUSTER11111/article/details/143595694

相关文章

  • 20222410 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容总结一下本周学习内容,不要复制粘贴2.实验过程2.1查询baidu.com并获取指定信息2.1.1DNS注册人及联系方式使用whois+域名,可以获取DNS注册人及联系方式whoisbaidu.com还可以使用在线域名查询工具获取相关信息:可以查出注册人为MarkMonitor,Inc.,联系方式为abus......
  • F5 BIG-IP Next WAF 20.3.0 发布下载,新增功能介绍
    F5BIG-IPNext20.3.0-多云安全和应用交付BIG-IP是硬件平台和软件解决方案的集合,提供专注于安全性、可靠性和性能的服务请访问原文链接:https://sysin.org/blog/f5-big-ip-next/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgBIG-IPNext您所熟知和信赖的BIG......
  • GB/T 713-2023 第4部分:规定低温性能的镍合金钢 08Ni3DR、07Ni5DR、06Ni7DR、06Ni9DR
    08Ni3DR、07Ni5DR、06Ni7DR、06Ni9DR承压设备用钢板和钢带 第4部分:规定低温性能的镍合金钢承压设备包括锅炉、压力容器、气瓶和压力管道,这类设备广泛用于国民经济各个方面,其共同特点是涉及生产和生命安全,一-旦发生事故危害性较大。制造承压设备的材料多种多样,钢材是实......
  • ABAP开发-内存管理
    系列文章目录文章目录系列文章目录前言一、概述二、程序间调用三、外部会话和内部会话四、SAP内存与ABAP内存五、实例总结前言一、概述内存是程序之间为了传递数据而使用的共享存储空间,在每个程序里使用的内存有SAP内存和ABAP内存SAP内存分类SAP内存......
  • 一款好用的富文本编辑器am-editor
    am-editor是一款创新的富文本编辑器,以下是对其的详细介绍:一、核心特点自定义渲染引擎:am-editor摒弃了传统的contenteditable属性,采用自定义渲染引擎,实现了对编辑行为的精确控制,从而提高了用户体验。跨框架支持:该编辑器支持React和Vue等前端主流框架,能够无缝对接这些框架,并利......
  • 数据结构-关键技术分享
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso数据结构与算法基础:介绍数据结构与算法的基本概念、重要性和应用场景,为读者打下坚实的基础。数据项与数据对象:详细解释数据项作为数据不可分割的最小单位,以及数据对象作为性质相同的数据元素的集合的概念。逻辑结构与物理......
  • 【专题】2024摇摆的消费者-消费者体验营销报告汇总PDF洞察(附原数据表)
    原文链接: https://tecdat.cn/?p=38173在当今经济社会的多元发展格局下,消费领域呈现出复杂且多变的态势。从日常购物到各类大宗商品消费,从国内市场到跨境交易,消费者的行为、需求以及市场趋势都在不断演变。一方面,消费者对于购物体验的重视程度愈发凸显,其不仅关注产品本身,更在意......
  • 【路径规划】基于A*-三次样条曲线求解UAV路径规划问题
    摘要本文提出了一种结合A算法与三次样条曲线的无人机(UAV)路径规划方法。该方法通过A算法找到从起点到终点的最优路径,再利用三次样条曲线对路径进行平滑处理,以确保无人机在复杂地形中实现平稳的导航和避障能力。实验结果表明,基于A*和三次样条曲线的路径规划方法在避免障碍的同......
  • eNSP校园网络毕业设计汇总2-内容任选【实验+文档】
    文章目录校园网1(DSVPN、IPSECVPN、MSTP、双机热备、)校园网2(IPSECVPN、双机热备、专线网络)校园网3(QinQ隧道技术、无线、双机热备)校园网4(DSVPN、MPLSVPN、无线、双机热备)校园网5(SSLVPN、服务器负载分担、双机热备、出口负载分担、运营商双归属、策略路由、无线)校园网1(D......
  • Pytorch用BERT对CoLA、新闻组文本数据集自然语言处理NLP:主题分类建模微调可视化分析-C
     原文链接:https://tecdat.cn/?p=38181原文出处:拓端数据部落公众号自然语言处理(NLP)领域在近年来发展迅猛,尤其是预训练模型的出现带来了重大变革。其中,BERT模型凭借其卓越性能备受瞩目。然而,对于许多研究者而言,如何高效运用BERT进行特定任务的微调及应用仍存在诸多困惑。本文......