当前位置: 首页 > news >正文

2w网站2w网站建设建设/哪家公司做推广优化好

2w网站2w网站建设建设,哪家公司做推广优化好,广州网站开发报价,典型的o2o平台有哪些不可否认的是,前几节我们讲解的顺序表存在一下几点问题: 1. 中间、头部的插入和删除,需要移动一整串数据,时间复杂度O(N) 2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗 3. 增容一般是2倍的增…

        不可否认的是,前几节我们讲解的顺序表存在一下几点问题:

        1. 中间、头部的插入和删除,需要移动一整串数据,时间复杂度O(N)

        2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗

        3. 增容一般是2倍的增长,这势必会造成空间的浪费

        那如何解决这些问题呢,此时,链表出现了

1. 链表的概念和结构

        我们之前说过,线性表的特点就是逻辑上是连续的,物理上不一定连续。顺序表是逻辑上是连续的,物理上也是连续的。而今天的链表就是逻辑上是连续的,但是物理上是不连续的

        最简单的链表是由节点们串在一起组成的,每个节点包含了两个内容:

                1. 要存入的有效数据

                2. 下一个节点的地址

        可以看出,每个节点在物理上都是独立的,不连续的。但是每个节点在逻辑上又有关联,每个节点都知道下一个节点的指针,要找到下一个节点就访问那个指针就好了

        具体来讲就是把 plist 当成一个钥匙,最开始保存的是第一个节点的地址,用完第一个节点的数据之后,把第一个节点中存储的地址再给到plist,这样plist就可以开第二个节点了,以此类推···

        下面我们依照上面的图片做一个简单的节点结构

                                

        到这里,链表的地基就学会了,下面我们尝试实现一下

2. 单链表(Single linked list)的实现

        跟顺序表一样,先是把准备工作,三个文件准备好

                                

        再把链表节点写出来

                                 ​​​​​​

        在这里我要重点声明一下,接下来如果从主函数前去访问链表时用的都是plist参数,从主函数中给子函数传参也是plist,就像这样

        ​​​​​​​        ​​​​​​​                

        然后就正式进入链表实现啦,大家伙坐稳喽

2.1 链表的打印

        打印的逻辑就是先拿到第一个节点的地址 pcur,把这个地址访问到 data 打印出来,然后将pcur的内容变成下一个要打印的节点的地址,直到pcur的内容是NULL为止

        ​​​​​​​        ​​​​​​​        

2.2 链表的插入

        因为插入就一定需要申请一个新的节点,所以我们先把这个功能封装好

        向堆区申请一块空间用来存放节点,记录这个节点的地址

        当然,如果你想把newnode的类型改成 SLTNode 也可以,不过后面要用到节点地址的时候就要取地址一下,很麻烦,所以我们干脆直接返回节点的地址

2.2.1 尾插

        在链表的尾端插入一个数据。

        因为如果链表为空(没有节点)的时候要修改 plist 的内容,让它指向我们新添加的第一个节点,所以我们传参的时候要传 &plist ,因此函数参数要用二级指针来接收这个可能会被修改的plist

        如果链表不为空,就去找尾节点,把为节点的next成员内容从NULL变成我们新添加的节点地址,可以这么理解:

        这个图里有一点不恰当,就是这个 pphead 要解引用一次 (*pphead) 才能找到第一个节点的地址

        ​​​​​​​

        接下来我们运行一下看看效果

2.2.2 头插

        头插比尾插好理解一点,直接上思路图(画的太丑了QAQ)

        

        很明显,链表是否为空对于需要的操作是没有影响的,上代码:

        

        最后运行一下看结果:

        

        因为每次都是把节点插到最前面,所以反着打出来是对的

2.3 链表的删除

2.3.1 尾删

        尾删的逻辑就是找到最后一个节点 ptail 和倒数第二个节点 prev ,把倒数第二个节点的next成员置为空指针,释放掉最后一个节点。当然,如果链表为空,也就是说没有节点的话就不能执行删除操作,用assert断言报错

        ​​​​​​​        ​​​​​​​        

        上代码:

        

2.3.2 头删

        头删也是需要两个指针控制,要注意的就是要先释放掉*pphead也就是第一个节点,然后再把*pphead的内容改成第二个节点的地址,接上第二个节点

        ​​​​​​​              ​​​​​​​

        代码如下:

        ​​​​​​​        

2.4 查找

        链表的查找很简单,就是遍历链表,找到了就返回节点地址,没找到就返回空指针

        

2.5 在任意位置插入数据

2.5.1 在指定位置前插入数据

        可以用SLTFind找到要被前插的节点的地址pos,在这个节点前面插入节点,还需要直到它前面那个节点的地址prev

        ​​​​​​​        ​​​​​​​        

        在实现这个功能的时候我们要注意,当pos是头节点的情况:

        

        下面使用一下

        

2.5.2 在指定位置后插入数据

        这个比较简单,但是要注意给地址的顺序,要先把后面那个节点的地址给到新节点,再把指定位置pos节点的地址成员改成新节点的地址,否则就会导致后面那个节点地址的丢失,没办法接到新节点后面了

        还有就是我们不需要知道链表的头节点是什么了,只需要关注pos就行了

        ​​​​​​​                ​​​​​​​

        

2.6 在任意位置删除节点

2.6.1 删除pos节点

        删除pos节点要先知道它前面的那个节点prev,然后把prev跟pos后面那个节点先连起来,最后再把pos释放掉。还有要注意的一点就是当pos就是链表头节点的时候要特殊处理一下

        ​​​​​​​        ​​​​​​​          

        

2.6.2 删除pos后面的一个节点

        这个功能也是只需要关注pos后面的内容就行,所以只需要传pos一个参数。还要注意一点就是pos不能是链表中的最后一个节点,否则它后面没有节点了还删什么

        ​​​​​​​        

        ​​​​​​​        

2.7 链表的销毁

        两个变量,pcur记录当前要准备销毁的节点地址,next记录下一个节点地址,防止销毁上一个节点之后找不到下一个节点了。然后两个变量一直循环向后扫描销毁,直到pcur指向NULL

        ​​​​​​​                ​​​​​​​

                        

3. 链表的分类

        链表按带头或不带头,单向或双向,循环或不循环,排列组合有8种

        我们刚刚学的单链表全称就是:不带头单向不循环链表

        带头不带头是说链表有没有一个不存储有效数据的节点,放在第一个存放有效数据节点之前

        ​​​​​​​        ​​​​​​​        

        单向双向是说链表能通过后一项找到前一项就是双向的,如果只能根据前一项找到后一项链表就是单项的。或者说双向链表的节点中的两个存放地址的成员中,一个存下一个节点的地址,一个存上一个节点的地址。

        ​​​​​​​        ​​​​​​​        

        循环不循环是说最后一个节点指向第一个节点就是循环链表,要是最后一个节点指向NULL就是不循环链表

                        

        虽然链表的种类很多,但是常用的只有两种:

                1.单链表(不带头单向不循环链表)

        单链表结构简单,一般不会单独用来存贮数据,它一般作为其他数据结构的子结构出现

                2.双向链表(带头双向循环链表)

        双向链表结构最复杂,一般用来单独存储数据。它虽然复杂,但是之后实现它的实际就会发现它有很多优势,致使实现它反而变得简单了,后面会有实现它的章节的。

4. 本节代码

        SList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//链表是由节点构成的
typedef int SLTDataType;typedef struct SListNode 
{SLTDataType data;struct SListNode* next;
}SLTNode;//链表的打印
void SLTPrint(SLTNode* phead); //链表的插入
//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);//链表的头删和尾删
//尾删
void SLTPopBack(SLTNode** pphead);
//头删
void SLTPopFront(SLTNode** pphead);//查找
SLTNode* SLTFind(SLTNode** pphead, SLTDataType x);//在任意位置插入数据
//在指定位置前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//在指定位置后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);//在任意位置删除节点
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);
//删除pos后面的一个节点
void SLTEraseAfter(SLTNode* pos);//销毁链表
void SLTDestory(SLTNode** pphead);

        SList.c

#include"SList.h"//链表的打印	
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur){printf("%d -> ", pcur->data);pcur = pcur->next;}printf("NULL\n");
}//申请一个新节点
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));newnode->data = x;newnode->next = NULL;return newnode;
}//链表的插入
//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);//申请一个新节点SLTNode* newnode = SLTBuyNode(x);//链表为空,新节点作为头if (*pphead == NULL){*pphead = newnode;return;}//链表不为空,找尾节点SLTNode* ptail = *pphead;while (ptail->next){ptail = ptail->next;}//找到尾节点了ptail->next = newnode;
}//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);//申请一个新节点SLTNode* newnode = SLTBuyNode(x);//链表为不为空,操作都一样//斩断第一个连接,再把新节点接进去newnode->next = *pphead;*pphead = newnode;
}//链表的头删和尾删
//尾删
void SLTPopBack(SLTNode** pphead)
{assert(pphead);//链表不能为空assert(*pphead);//链表不为空//链表只有一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;return;}//链表有多个节点SLTNode* ptail = *pphead;SLTNode* prev = NULL;//找到尾节点while (ptail->next){prev = ptail;ptail = ptail->next;}prev->next = NULL;free(ptail);ptail = NULL;}//头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead);//链表不能为空assert(*pphead);//让第二个节点变成新的头节点//释放旧的头节点SLTNode* sec = (*pphead)->next;free(*pphead);*pphead = sec;
}//查找
SLTNode* SLTFind(SLTNode** pphead, SLTDataType x)
{assert(pphead);//遍历链表SLTNode* pcur = *pphead;while (pcur){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}//在任意位置插入数据
//在指定位置前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead);assert(pos);//这里断言*pphead不能为空//因为指定节点的地址pos不能为空,所以这个链表也不能为空assert(*pphead);//当pos是头节点,执行头插if (pos == *pphead){SLTPushFront(pphead, x);return;}//当pos不是头节点//申请一个新节点SLTNode* newnode = SLTBuyNode(x);SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = newnode;newnode->next = pos;
}//在指定位置后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);//申请一个新节点SLTNode* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}//在任意位置删除节点
//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(pos);assert(*pphead);//如果pos指向头节点,执行头删if (*pphead == pos){SLTPopFront(pphead);return;}SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;
}//删除pos后面的一个节点
void SLTEraseAfter(SLTNode* pos)
{assert(pos);//pos->next不能为空//就是说pos不能是最后一个节点assert(pos->next);SLTNode* del = pos->next;pos->next = pos->next->next;free(del);del = NULL;
}//销毁链表
void SLTDestory(SLTNode** pphead)
{assert(pphead);assert(*pphead);SLTNode* pcur = *pphead;SLTNode* next = NULL;while (pcur){next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

相关文章:

数据结构·单链表

不可否认的是&#xff0c;前几节我们讲解的顺序表存在一下几点问题&#xff1a; 1. 中间、头部的插入和删除&#xff0c;需要移动一整串数据&#xff0c;时间复杂度O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗 3. 增容一般是2倍的增…...

Redis(秒杀活动、持久化之RDB、AOF)

目录 秒杀活动 一、测压工具jmete的使用 二、java实现秒杀活动 1、myseckillcontroller 2、先启动pos请求添加商品&#xff0c;再启动jmeter进行压测 Redis持久化 一 、Redis持久化之RDB 1.RDB是什么 2. 备份是如何执行的 3.Fork 4. RDB持久化流程 5. dump.rdb文件 6…...

Window安装Python和开发Pycharm

准备&#xff1a; 1&#xff1a;安装Python环境 https://www.python.org/downloads/windows/ 2: 下载Pycharm https://www.jetbrains.com/pycharm/download/other.html...

技术驱动宠物健康:宠物在线问诊系统的高效搭建手册

在数字化时代&#xff0c;技术正在催生出许多创新的医疗服务&#xff0c;而宠物在线问诊系统便是其中一项引领潮流的创举。本文将为你提供一份高效搭建宠物在线问诊系统的手册&#xff0c;通过技术代码示例&#xff0c;让你轻松打造一套技术驱动的宠物健康管理系统。 1. 架构…...

玩转k8s:yaml介绍

一.Yaml文件详解 1.Yaml文件格式 &#xff08;1&#xff09;Kubernetes 支持 YAML 和 JSON 格式管理资源对象 &#xff08;2&#xff09;JSON 格式&#xff1a;主要用于 api 接口之间消息的传递 &#xff08;3&#xff09;YAML 格式&#xff1a;用于配置和管理&#xff0c;…...

【spdk】spdk compressdev测试

spdk-23.09\go\rpc\README.md go client 启应用 启哪个应用&#xff1f; ./build/bin/iscsi_tgt --wait-for-rpc & /usr/local/daos-2.4/prereq/release/spdk/share/spdk/scripts/rpc.py bdev_malloc_create -b Malloc0 1024 4096 #1G bs4k /usr/local/daos-2.4/prereq…...

Linux中并发程序设计(进程的创建和回收、exec函数使用)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注&#xff1a;进程是存在RAM中&#xff0c;程序是存放在ROM(flash)中的进程内容 BSS段&#xff…...

2023年DevOps国际峰会暨 BizDevOps 企业峰会(DOIS北京站):核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展&#xff0c;软件开发的模式和流程也在不断地演变。在众多软件开发方法中&#xff0c;DevOps已成为当下热门的软件开发运维一体化模式。特别是在中国&#xff0c;随着越来越多的企业开始认识到DevOps的价值&#xff0c;这一领域的研究与实践活动日益活跃。本…...

pdf 转html 在线预览和查询

方案一&#xff1a;pdf2htmlex package com.realize.controller;import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.realize.util.MsgUtil; import com.realize.util.OssUtil; import com.realize.util.PdfConvertUtil; import com.reali…...

docker 体验怀旧游戏(魂斗罗等)

docker run --restart always -p 8081:80 --name fc-games -d registry.cn-hangzhou.aliyuncs.com/bystart/fc-games:latest ip:8081访问 jsnes: js制作了一个网页版的NES模拟&#xff0c;可以在网页上玩fc游戏 (gitee.com)...

JS中判断数据类型总结以及方法封装

判断数据类型封装方法&#xff1a; 1&#xff09;type返回字符串类型 2&#xff09;is开头返回Boolean类型 测试实例&#xff1a; JavaScript 判断数据类型的方式共有四种 typeofinstanceofconstructorObject.prototype.toString typeof typeof 操作符返回一个字符串,表示操…...

【Midjourney】绘画风格关键词

1.松散素描(Loose Sketch) "Loose sketch"&#xff08;松散素描&#xff09;通常指的是一种艺术或设计中的手绘风格&#xff0c;其特点是线条和形状的表现相对宽松、自由&#xff0c;没有过多的细节和精确度。这样的素描通常用于表达创意、捕捉概念或者作为设计的初步…...

教你如何低成本自建「幻兽帕鲁」服务器,快速一键部署

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…...

拥抱社交电商浪潮:微信小程序商城崛起引领电商新风向-亿发

在经过多年的发展后&#xff0c;各大传统电商平台的流量增速基本上已经见顶。同时&#xff0c;新兴的带有社交性质的电商平台&#xff0c;如抖音、小红书和微信商城&#xff08;小程序商城&#xff09;等&#xff0c;使得传统中心化平台的流量关注度逐渐分散。由于中心化平台需…...

一个使用pyqt的word文档查重工具

一个使用pyqt的word文档查重工具 使用场景代码使用截图打包好的软件下载链接结尾 使用场景 有时我们在借鉴一篇文档之后还不想有太多重复&#xff0c;这个时候可以使用这个工具对两个word文档进行对比 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWind…...

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别&#xff1f; 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1&#xff09;固定窗口计数器算法 2&#xff09;滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…...

邦芒忠告:职场新人最需要避开的十大雷坑

职场人最害怕的就是踩雷进坑&#xff0c;很多新入职场的小白都会战战兢兢&#xff0c;生怕哪里不对&#xff0c;冒犯了哪一位&#xff0c;或者触犯了哪一条潜规则。害怕自己踩到雷&#xff0c;没有走好职场第一步。最近&#xff0c;单位进了几个新人&#xff0c;看到他们就想起…...

MySQL-进阶-索引

一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree&#xff08;多路平衡查找树&#xff09; 2、BTree 3、Hash 三、索引分类 四、索引语法 1、语法 2、案例 五、SQL性能分析 1、查看执行频次 2、慢查询日志 3、show-profile 4、explain...

GitLab入门指南:上传与下载操作一网打尽

GitLab简介&#xff1a; GitLab是一个基于Git的开源仓库管理系统&#xff0c;提供了一个Web界面的Git存储库管理器&#xff0c;并集成了多种开发工具的功能&#xff0c;如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署&#xff0c;也可以使用其提供…...

GPT应用_PrivateGPT

项目地址&#xff1a;https://github.com/imartinez/privateGPT 1 功能 1.1 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT 相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大…...

Qt‘s 撤销框架(Qt‘s Undo Framework)

一、开篇序言 我们常常有这样的业务场景,需要支持撤回的动作(即 undo)。如果让你来设计,聪明的你肯定也能立即想到解决问题的办法,对,将操作的 command { 对象,指令,属性 } 保存到一个容器中。 如果是仅需要单步撤销, 使用栈容器 保存command,动作执行即指令入栈, …...

【C++】stack、queue的使用及模拟实现

目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器&#xff0c;它的特点是后进先出&#xff0c;只能在容器的一端进行插入和删除操作。 stack的使用很简单&#xff0c;主要有…...

外包干了2个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

html5实现好看的年会邀请函源码模板

文章目录 1.设计来源1.1 邀请函主界面1.2 诚挚邀请界面1.3 关于我们界面1.4 董事长致词界面1.5 公司合作方界面1.6 活动流程界面1.7 加盟支持界面1.8 加盟流程界面1.9 加盟申请界面1.10 活动信息界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLei…...

【C++】反向迭代器模拟实现

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.利用适配器的思想…...

【低照度图像增强系列(5)】Zero-DCE算法详解与代码实现(CVPR 2020)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标…...

三维重建衡量指标记录

1、完整性比率 Completeness Rati (CR) 完整性比率 完整性比率是用于评估三维重建质量的指标之一&#xff0c;它衡量了重建结果中包含的真实物体表面或点云的百分比。完整性比率通常是通过比较重建结果中的点云或三维模型与真实或标准点云或模型之间的重叠来计算的。 具体计算…...

在WinForms中控制模态对话框的关闭行为

博客文章&#xff1a;在WinForms中控制模态对话框的关闭行为 引言 在Windows Forms (WinForms) 应用程序中&#xff0c;对话框的行为控制是提升用户体验的关键部分。特别是在使用模态对话框时&#xff0c;防止用户不经意间关闭它变得尤为重要。本文将探讨如何通过重写 FormClo…...

java web mvc-02-struts2

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails Struts2 Apache Struts是一个用于创…...

文件上传之大文件分块上传

分久必合&#xff0c;合久必分 优势部分&#xff1a;减少了内存占用&#xff0c;可实现断点续传&#xff0c;并发处理&#xff0c;利用带宽&#xff0c;提高效率 不足之处&#xff1a;增加复杂性&#xff0c;增加额外计算存储 应用场景&#xff1a;云存储大文件上传、多媒体平台…...