24考研数据结构-线性表4

news2024/11/23 3:34:35

目录

      • 2.4.4单链表的查找操作(默认带头节点,不带头节点后续更新)
        • 2.4.4.1 按位查找操作
        • 2.4.4.2 按值查找操作
        • 2.4.4.3 求单链表的长度(带和不带头节点都写了)
        • 2.4.4.4 知识回顾与重要考点
      • 2.4.5 单链表的创建操作
        • 2.4.5.1 头插法建立单链表
        • 2.4.5.2 尾插法建立单链表
        • 2.4.5.3 链表的逆置

2.4.4单链表的查找操作(默认带头节点,不带头节点后续更新)

2.4.4.1 按位查找操作

GetElem(L, i): 按位查找操作,获取表L中第i个位置的元素的值;

LNode * GetElem(LinkList L, int i){
    if(i<0) return NULL;
    
    LNode *p;               //指针p指向当前扫描到的结点
    int j=0;                //当前p指向的是第几个结点
    p = L;                  //L指向头结点,头结点是第0个结点(不存数据)
    while(p!=NULL && j<i){  //循环找到第i个结点
        p = p->next;
        j++;
    }

    return p;               //返回p指针指向的值
}


注意:
1.边界情况 i=0,返回头节点;i>L.length,返回null;
2.j<i即查找到j = i 的节点,就是第i个节点。
3.平均复杂度O(n)

2.4.4.2 按值查找操作

LocateElem(L, e):按值查找操作,在表L中查找具有给定关键字值的元素;
平均复杂度O(n)

LNode * LocateElem(LinkList L, ElemType e){
    LNode *P = L->next;    //p指向第一个结点
    //从第一个结点开始查找数据域为e的结点
    while(p!=NULL && p->data != e){
        p = p->next;
    }
    return p;           //找到后返回该结点指针,否则返回NULL
}

2.4.4.3 求单链表的长度(带和不带头节点都写了)

Length(LinkList L) :计算单链表中数据结点**(不含头结点)的个数**,需要从第一个结点看是顺序依次访问表中的每个结点。算法的时间复杂度为O(n)

带头节点:

int Length(LinkList L){
    int len=0;       //统计表长
    LNode *p = L;
    while(p->next != NULL){  //只有指向的下一个节点不为null,才len++
        p = p->next;
        len++;
    }
    return len;
}


不带头节点:

int Length(LinkList L){
    int len=0;       //统计表长
    LNode *p = L;
    while(p!= NULL){  //当前指针(即头节点指向的第一个节点)不为空即可++,
    //带头节点的链表用这种方法长度会算上头节点。
        p = p->next;
        len++;
    }
    return len;
}


2.4.4.4 知识回顾与重要考点

在这里插入图片描述

2.4.5 单链表的创建操作

2.4.5.1 头插法建立单链表

带头节点;
若不带头节点,头插法就是插入头指针指向的第一个节点
平均时间复杂度O(n)
思路:每次都将生成的结点插入到链表的表头。

LinkList List_HeadInsert(LinkList &L){       //逆向建立单链表
    LNode *s;
    int x;
    L = (LinkList)malloc(sizeof(LNode));     //建立头结点
    L->next = NULL;                          //初始为空链表,这步不能少!

    scanf("%d", &x);                         //输入要插入的结点的值
    while(x!=9999){                          //输入9999表结束
        s = (LNode *)malloc(sizeof(LNode));  //创建新结点
        s->data = x;
        s->next = L->next;
        L->next = s;                         //将新结点插入表中,L为头指针
        scanf("%d", &x);   
    }
    return L;
   
}


在这里插入图片描述

2.4.5.2 尾插法建立单链表

带头节点;
若不带头节点则需要特殊处理第一次插入数据的情况,是直接赋值而不是对下一个节点赋值。
时间复杂度O(n)

思路:每次将新节点插入到当前链表的表尾,所以必须增加一个尾指针r,使其始终指向当前链表的尾结点。
好处:生成的链表中结点的次序和输入数据的顺序会一致。

LinkList List_TailInsert(LinkList &L){       //正向建立单链表
    int x;                                   //设ElemType为整型int
    L = (LinkList)malloc(sizeof(LNode));     //建立头结点(初始化空表)
    LNode *s, *r = L;                        //r为表尾指针
    scanf("%d", &x);                         //输入要插入的结点的值
    while(x!=9999){                          //输入9999表结束
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;
        r = s                                //r指针指向新的表尾结点
        scanf("%d", &x);   
    }
    r->next = NULL;                          //尾结点指针置空
    return L;
}



在这里插入图片描述

注意:
头插法和尾插法在初始化的时候
头插法:
    L = (LinkList)malloc(sizeof(LNode));     //建立头结点
    L->next = NULL;                          //初始为空链表,这步不能少!
尾插法:
	L = (LinkList)malloc(sizeof(LNode));     //建立头结点(初始化空表)
	r->next = NULL;                          //尾结点指针置空
都是为了保证最后一个节点指向的不是脏数据,即malloc动态分配空间的时候可能,
指向的是一个脏数据

在这里插入图片描述

在这里插入图片描述

2.4.5.3 链表的逆置

算法思想:逆置链表初始为空,原表中结点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空;

带头节点:

void listReverse(linkedList &L)
{
	node *p,*s;
	//1.准备工作
	p = L->next;
	L->next = NULL;
	
	while(p)
	{
		//2.1 s记录正在处理的结点,p记录下一轮待处理的结点
		s = p; 			//s承接上一轮记录的位置
		p = p->next; 	//p为下一轮记录位置
		//2.2 把s插入 已逆置的部分 中
		s->next = L->next;  // L->next代表已逆置的第一结点,s的指针域指向它
		L->next = s;	//(头结点的指针域,即)第一结点 设置为s
		//2.2步骤相当于:
		//s 对 队伍(已逆置部分)的队首(已逆置的第一结点)说:你不要排在柜台前了,你排在我后面
		//等队伍排在s后面后,s自己排到了柜台前
	}
}

讲解
我们先看第一轮循环做了什么:

阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)

在这里插入图片描述

第二轮:

阅读顺序:黑色(初始)、蓝色(操作)、红色(理解)

在这里插入图片描述
总结
不难发现:

  1. 链表逆置利用了s、p两个指针的移动实现
    每一轮循环体执行结束后,s指向刚刚逆置成功的结点,p指向下一轮待逆置的结点

  2. 为什么需要p?
    因为2.2步骤中s->next会被改写,
    若只有s,会丢失剩余的结点,
    这时候p起到暂存的作用,等待下一轮2.1步骤中的s=p找到它。

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

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

相关文章

删除Windows顽固启动项Program

卸载软件之后可能会遇到任务管理器中启动项显示有Program这种无效项目的情况 无效项目如图所示: 解决方法 打开注册表 Win R 打开注册表后定位到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run 可以直接复制粘贴到地址栏进行跳…

低版本打不开高版本CAD怎么办?教你转换CAD版本方法

转换CAD文件版本的好处是多方面的。首先&#xff0c;它可以确保文件格式的兼容性&#xff0c;从而使其可以在不同版本的CAD软件中打开和编辑。这是非常重要的&#xff0c;因为如果您想在不同的计算机上查看或编辑CAD文件&#xff0c;您可能需要使用不同版本的CAD软件。通过转换…

LLaMA2可商用|GPT-4变笨|【2023-0723】【第七期】

一、大咖观点&#xff1a; 傅盛&#xff1a;ChatGPT时代如何创业 - BOTAI - 博客园Google 已经被OpenAI 超越了吗&#xff1f;| AlphaGo 之父深度访谈《人民日报》&#xff1a;大模型的竞争&#xff0c;是国家科技战略的竞争WAIC 2023 | 张俊林&#xff1a;大语言模型带来的交…

Jmeter接口自动化生成测试报告html格式

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…

Android11 相机拍照权限,以及解决resolveActivity返回null

一、配置拍照和读写权限 <uses-permission android:name"android.permission.CAMERA"/> <uses-feature android:name"android.hardware.camera" /><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&…

swagger快速升级方案

背景 在使用SpringBoot 2.6以前去创建API文档工具一般会采用SpringFox提供的Swagger库&#xff0c;但是由于SpringBoot版本的不断升级和SpringFox摆烂不更新&#xff0c;导致了SpringBoot2.6之后的项目无法使用SpringFox去生成API文档&#xff0c;或者可以使用但是有很多的bug…

PyTorch深度学习实战(6)——神经网络性能优化技术

PyTorch深度学习实战&#xff08;6&#xff09;——神经网络性能优化技术 0. 前言1. 数据准备1.1 数据集分析1.2 数据集加载 2. 使用 PyTorch 训练神经网络2.1 神经网络训练流程2.2 PyTorch 神经网络训练 3. 缩放数据集4. 修改优化器5. 构建深层神经网络小结系列链接 0. 前言 …

AcWing167. 木棒(DFS+剪枝)

输入样例&#xff1a; 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0输出样例&#xff1a; 6 5 解析&#xff1a; DFS 搜索顺序&#xff1a;根据木棒的长度从小到大枚举每根木棒&#xff0c;对于每根木棒&#xff0c;枚举可以由哪些木棍拼成&#xff0c;如果所有的木棍拼成了长度相等的多…

Cisco学习笔记(CCNA)——Equipment Infrastructure Management

Equipment infrastructure management 路由器组件 路由器的组成及功能 CPU&#xff1a;执行操作系统的指令 随机访问存储器&#xff08;RAM内存&#xff09;&#xff1a;RAM中内容断电丢失 只读存储器&#xff08;ROM&#xff09;&#xff1a;开机自检软件&#xff0c;路由…

速锐得智能汽车车身域CANFD控制芯片MCU接口电路原理图

CAN总线技术不仅涉及汽车电子和轨道交通&#xff0c;还涉及医疗器械、工业控制、智能家居和机器人网络互连&#xff0c;这些行业对CAN产品的稳定性和抗干扰能力都有很高的要求。 上篇我们讲了在汽车CAN FD上&#xff0c;数据出错可能导致数据位被错误地解析为填充位&#xff0c…

MB5B在HDB上的性能调优

背景 MB5B是用于查询物料的收发以及现有库存。日常业务查询,通常会按照月份查看某片地区物料的库存以及收发状态。 调优思路 按照客户日常操作的习惯,得到日常操作的数据范围,选出数据量最为突出最有代表性的地区和物料;利用SE30分别运行不同数量级的数据,比如20个门店、…

系统程序的编译与处理

目录&#xff1a; 一&#xff0c;程序的编译与执行 二&#xff0c;预处理详解 三&#xff0c;#define的运用 四&#xff0c;条件编译 一&#xff0c;程序的编译与执行 1&#xff0c;编译环境 首先&#xff0c;要说明的是&#xff0c;计算机只能识别二进制指令&#xff0c…

文件共享服务器(五)sicis

目录 前言 一、概述 1.iscsi概念 2.iscsi介绍 3.相关名词 二、实验 1.构建iscsi服务 2.实现步骤 服务器端 客户端 3.注意事项 总结 前言 iSCSI是由IBM发明的基于以太网的存储协议&#xff0c;该协议与SUN的NFS协议都是为了解决存储资源共享问题的解决方案。两者意图…

传统商超苦战即时零售,或沦为炮灰

眼下&#xff0c;在美团闪购、京东到家、饿了么、淘宝买菜/淘鲜达、盒马&#xff0c;还有朴朴超市、叮咚买菜等一众类超市App或者平台的绝情裹挟下&#xff0c;包含沃尔玛、家乐福、永辉、大润发、联华、华润万家、步步高、中百等等这些传统商超企业巨头&#xff0c;正过得越来…

Unity噪声图生成(编辑器扩展)

最近发现项目里很多shader都需要噪声图&#xff0c;&#xff08;shadergraph中有自己的噪声图生成&#xff09;当遇到需要噪声图时去寻找很麻烦&#xff0c;所以从网上查阅资料编写了一个Unity扩展的噪声图生成。 Perlin噪声 Perlin噪声是一种渐变噪声算法&#xff0c;由Ken …

【面试】 redis击穿现象?如何防止击穿?

文章目录 背景击穿案例解决方案:通过synchronized双重检查机制&#xff1a;某个key只让一个线程查询&#xff0c;阻塞其它线程设置value永不过期&#xff08;设置热点数据永不过期&#xff09;使用互斥锁(mutex key) 背景 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁…

组件化开发复习

1.vue的根组件使用 // 1.创建appconst app Vue.createApp({// data: option apidata() {return {message: "Hello Vue",counter: 0,counter2: 0,content: ""}},watch: {content(newValue) {console.log("content:", newValue)}}}) createApp 函…

C#之事件

目录 一、发布者和订阅者 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;有关事件的重要事项 &#xff08;三&#xff09;有关事件的私有委托需要了解的重要事项 二、源代码组件概览 三、声明事件 事件是成员 四、订阅事件 五、触发事件 六、标准事件的…

分析-WinHttpReceiveResponse失败问题追踪

Windows中的WinHttp库提供了比较完善的访问HTTP资源的接口API&#xff0c;一次在使用WinHTTP爬取QQ邮箱过程中&#xff0c;WinHttpReceiveResponse的调用总是失败&#xff0c;于是对此问题进行跟踪。 开始分析QQ邮箱的HTTP交互协议时&#xff0c;用到了代理工具Fiddler&#xf…

t.einsum(‘ijk,jkl->ijl‘, [a,b])

这个东西虽然计算起来真的方便的很多&#xff0c;但是对于人的理解难度是真的加大的&#xff0c;特别是高纬度的时候&#xff0c;例如&#xff1a;t.einsum(‘ijk,jkl->ijl’, [a,b])三维计算的时候。因此&#xff0c;最好的方法就是举个例子并且换一种方式来实现相同的功能…