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

网站排名突然掉没了app平台开发费用

网站排名突然掉没了,app平台开发费用,浪漫的html表白源代码,好的seo公司营销网一.前言 数据结构思维导图如下,灰色标记的是之前讲过的,本文将带你走近单链表(红色标记部分),希望大家有所收获🌹🌹 二.链表的定义和概念 在讲单链表之前,我们先学习一下链表 2.1 链表的定义 链表是一种…

一.前言

数据结构思维导图如下,灰色标记的是之前讲过的,本文将带你走近单链表(红色标记部分),希望大家有所收获🌹🌹

在这里插入图片描述

二.链表的定义和概念

在讲单链表之前,我们先学习一下链表

2.1 链表的定义

链表是一种物理存储单元上非连续非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,即

  • 逻辑结构:线性
  • 物理结构:非线性

2.2 节点的构成要素

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。即数据+指向下一个结点的指针,节点常用结构体实现。

struct ListNode
{
LTDataType data;
struct ListNode* next;
}

2.3 与数组结构的对比差异

数组链表
存储方式连续存储
需要预先分配固定大小的内存空间
非连续存储,通过指针连接
动态分配内存,不需要预先确定大小
内存使用空间利用率高 (因为所有元素都紧密排列)
可能存在未使用的空间(e.g.数组大小固定但实际使用元素少)
空间利用率相对较低
每个节点需要额外的内存来存储指针
插入和删除操作可能需要移动大量元素以保持连续性
时间复杂度为O(n),因为可能需要移动插入点之后的所有元素
通常只需要改变指针,不需要移动元素
时间复杂度为O(1) (已知插入或删除位置的节点)
随机访问支持高效的随机访问,可通过索引快速访问任意元素
访问时间复杂度为O(1)
不支持高效的随机访问,必须从头节点开始遍历链表
访问时间复杂度为O(n)。
空间局部性有很好的空间局部性,因为元素连续存储,适合缓存优化空间局部性差,因为元素分散存储,可能导致缓存未命中
实现复杂度实现简单,大多数编程语言内置支持实现相对复杂,需要手动管理节点和指针
适用场景适合需要频繁随机访问的场景
适合元素数量已知且变化不大的场景
适合插入和删除操作频繁的场景
适合元素数量频繁变化的场景

三.链表的分类

链表的结构非常多样,以下情况组合起来就有8种(2*2*2)链表结构
在这里插入图片描述
链表说明:
在这里插入图片描述
在这里插入图片描述
虽然有这么多的链表结构,但是我们实际中最常用的还是两种结构:

  1. 单链表:不带头单向不循环链表
  2. 双向链表:带头双向循环链表

四.单链表

前期准备

创建三个文件:

  1. SList.h: 存放各种头文件和函数声明
  2. SLIst.c : 各种函数的实现
  3. test.c: 测试和执行代码 最好写完一部分测试一部分 防止后期调试一堆bug

实现

首先在头文件中写上

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

接下来我们一步步实现单链表各种操作

1.定义链表结构

typedef int SLTDataType;//方便之后一键替换类型typedef struct SListNode
{SLTDataType data; //结点数据struct SListNode* next; //指针保存下⼀个结点的地址
}SLTNode;

2.申请新节点和打印函数

因为后面会多次用到申请新节点和打印函数,所以我们把它们都各自封装成函数方便调用

//申请新节点
SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));if (node == NULL){perror("malloc fail!");exit(1);}node->data = x;node->next = NULL;return node;
}
//打印函数
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur){printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}

3.查找数据

SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{assert(phead);SLTNode* pcur = phead;while (pcur){if (pcur->data == x){return pcur;}pcur = pcur->next;}//没有找到return NULL;
}

4.插入操作

包括尾插、头插、在指定位置之前插入数据、在指定位置之后插入数据
(1)尾插

void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);//pphead --> &plist// *pphead --> plist//申请新节点SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else{//找尾结点SLTNode* pcur = *pphead;while (pcur->next){pcur = pcur->next;}//pcur  newnodepcur->next = newnode;}
}

(2)头插

void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//newnode *ppheadnewnode->next = *pphead;*pphead = newnode;
}

(3)在指定位置之前插入数据

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead);assert(pos);if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* newnode = SLTBuyNode(x);//找prev :pos的前一个结点SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}//prev newnode --> posnewnode->next = pos;prev->next = newnode;}
}

(4)在指定位置之后插入数据

void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);//pos newnode --> pos->nextnewnode->next = pos->next;pos->next = newnode;
}

测试如下
在这里插入图片描述

5.删除操作

包括尾删、头删、删除指定节点、删除指定位置之后的结点、删除指定位置之前的结点(该操作是给你们留的作业😜 学完这篇自己独立实现一下 答案可以让我发给你或者其实调试通过了应该没什么问题跟前面的实现逻辑一样)
(1)尾删

void SLTPopBack(SLTNode** pphead)
{//链表为空:不可以删除assert(pphead && *pphead);//处理只有一个结点的情况:要删除的就是头结点	if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{//找 prev ptailSLTNode* ptail = *pphead;SLTNode* prev = NULL;while (ptail->next){prev = ptail;ptail = ptail->next;}prev->next = NULL;free(ptail);ptail = NULL;}
}

测试如下
在这里插入图片描述

(2)头删

void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* next = (*pphead)->next;//*pphead --> nextfree(*pphead);*pphead = next;
}

(3)删除指定节点

void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);//头删if (pos == *pphead){SLTPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}//prev pos pos->nextprev->next = pos->next;free(pos);pos = NULL;}
}

(4)删除指定位置之后的结点

void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);//pos pos->next pos->next->nextSLTNode* del = pos->next;pos->next = pos->next->next;free(del);del = NULL;
}

6.销毁链表

void SListDestroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

在这里插入图片描述

五.总结

单链表的详细实现代码已经上传到我的资源了,大家点进主页或者在本文最上方可以下载查看,自己去写一下,边写边调试会更容易理解和掌握。
接下来会逐步介绍上述思维导图数据结构剩下的部分,创作不易,希望大家多多支持,有什么想法欢迎讨论🌹🌹

http://www.yayakq.cn/news/771464/

相关文章:

  • 吴江建设局网站打不开seo系统
  • 网站制作公司杭州佛山专业网站建设公司
  • 网站建设不足之处dw可以做有后台的网站么
  • 怎么做关不掉的网站建站行业获客
  • 大兴网站建设设计公司ecilpse做网站
  • 网站开发培训北京宁波网站建设的企业
  • 河南郑州建设网站制作小型购物网站开发费用
  • 国内品牌营销成功案例seo管理工具
  • 运营一个网站的成本深圳物流公司收费标准
  • 凡客诚品网站设计特点免费外贸网站源码
  • 湛江网站制作江网站制作货运代理东莞网站建设
  • 网销都是在那些网站做推广网站开发前后端工具组合
  • 北京网站建设维护上海网站优化推广公司
  • 怎样看网站的建设时间表四川企业网站开发
  • 西宁建一个网站公司南京最好的网站设计公司
  • 顺企网我做网站做网站手机
  • 哪个公司网站做的好如何制作自己的官网
  • 苏州高端网站制作官网什么是网络营销中的免费营销策略
  • 二级域名做网站好不好老域名新网站推广
  • 彩票网站和app建设wordpress备案申请
  • 西安市建设局网站网站建设汽车后市场解决方案
  • 网站开发人员招聘广告语外贸网络推广的方式
  • 网站建设工作总结报告做网站有一个火箭回顶部
  • 济南做网站公司有哪些网站站建设建设中页中页
  • 建设网站的会计分录企业标准信息公共服务平台
  • 网站开发 书汕头免费建设网站制作
  • 在灵璧怎样做网站厦门网站建站
  • 网站页面建设规划文案广东人才招聘网
  • 包头市建设工程安全监督站网站crm客户端
  • 网页制作怎么做多个网站如何申请cn域名做网站