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

网站怎么被搜到首页好用的在线代理网页

网站怎么被搜到首页,好用的在线代理网页,福田做商城网站建设哪家便宜,香奈儿vi设计手册前言 前面两期数据结构的文章我们介绍了顺序表和单向链表#xff0c;那么本篇博文我们将来了解双向链表#xff0c;作为最好用的一种链表#xff0c;双向链表有什么特殊之处呢#xff0c;接下来就让我们一起了解一下吧。 下面是前两篇数据结构的文章#xff1a; 数据结…前言 前面两期数据结构的文章我们介绍了顺序表和单向链表那么本篇博文我们将来了解双向链表作为最好用的一种链表双向链表有什么特殊之处呢接下来就让我们一起了解一下吧。 下面是前两篇数据结构的文章 数据结构(一)——顺序表的介绍 数据结构(二)——链表的介绍以及单链表的实现 双向链表的概念 什么是双向链表呢实际上双向链表全称是带头双向循环链表是一种最复杂但最好用的一种链表形式它不同于单项链表它拥有一个头节点正是由于头节点的存在弥补了单项链表尾插的不便同时它拥有两个指针分别指向前驱和后继从而方便链表进行数据的挪动等操作。 双向链表的实现 1.定义 目录 前言 双向链表的概念 双向链表的实现 1.定义 2.双向链表接口定义 1.初始化 2.销毁 4.打印 5.尾插/尾删 6.头插/头删 7.任意位置插入/删除 8.查找 小结 typedef int LTDataType; typedef struct LTNode {struct LTNode* next;struct LTNode* prev;LTDataType x; }LTNode; 双向链表的定义如上所示我们发现在这个结构体内我们定义了两个结构体指针分别指向结构体变量双向链表的前驱和后继节点后续我们将通过这个结构体指针完成链表的头插尾插等一系列操作。 2.双向链表接口定义 接下来我们将定义一系列链表的接口通过这些函数我们将完成链表的初始化、销毁、头插、尾插、头删、尾删、打印等一系列操作。 //链表的初始化 void LTInit(LTNode** pphead); LTNode* LTInit(); //链表的销毁 void LTDestroy(LTNode* phead); //链表的打印 void LTPrint(LTNode* phead);//链表的尾插 void LTPushBack(LTNode* phead,LTDataType x); //链表的头插 void LTPushFront(LTNode* phead, LTDataType x);//链表的尾删 void LTPopBack(LTNode* phead); //链表的头删 void LTPopFront(LTNode* phead);//在指定位置之后插入 void LTInsert(LTNode* pos, LTNode* phead); //删除指定位置的节点 void LTErase(LTNode* pos);//查找一个值返回相应节点 LTNode* LTFind(LTNode* phead, LTDataType x); 从上述节点的定义我们发现不同于单向链表我们传的大多是一级指针这是为什么呢原因在于双向链表多了一个哨兵位当链表中只有哨兵位时我们称之为空链表即哨兵位是不能删除的而我们大多数操作是不会改变哨兵位的所以只需要传一级指针。 1.初始化 我们看到我们给出了两种链表的初始化方式一种是传二级指针一种则是通过返回值接收下面我们将实现代码如下 void LTInit(LTNode** pphead) {*pphead (LTDataType*)malloc(sizeof(LTNode));if (*pphead NULL){perror(malloc fail!);exit(1);}(*pphead)-a -1;(*pphead)-next (*pphead)-prev *pphead; } 首先是二级指针初始化我们看到对二级指针解引用我们可以拿到这个地址然后malloc一块空间最后让前驱节点和后继节点都指向自己这样我们就完成了链表的初始化。但是细心观察我们发现这一段代码的逻辑是先开一块新的节点然后再完成初始化后续我们对链表的插入修改还要用到这一段逻辑因此我们可以把这个逻辑写成申请节点的函数这样既减少了代码量还提高了可读性所以就有了第二种初始化方式代码如下 LTNode* LTBuyNode(LTDataType x) {//申请一个新的节点LTNode* newnode (LTDataType*)malloc(sizeof(LTNode));if (newnode NULL){perror(malloc fail!);exit(1);}newnode-a x;//让新节点的next prev指针指向自己newnode-next newnode-prev newnode;return newnode; } LTNode* LTInit() {LTNode* phead LTBuyNode(-1);return phead; } 2.销毁 由于链表的每个节点不是连续的所以我们需要循环销毁每一个节点有了这个逻辑我们就可以写下如下代码 void LTDestroy(LTNode* phead) {assert(phead);//pcur指向第一个节点LTNode* pcur phead-next;while (pcur ! phead){//记录下一个节点LTNode* next pcur-next;//销毁该节点free(pcur);//让pcur指向下一个节点pcur next;}//销毁哨兵位头节点free(phead);phead NULL; } 4.打印 与链表销毁类似打印每个节点的值都是先找到该节点然后再将该节点的值打印出来因此我们可以写下如下代码 void LTPrint(LTNode* phead) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead){printf(%d-, pcur-a);pcur pcur-next;}printf(\n); }5.尾插/尾删 链表插入删除的关键是改变节点的指针对于尾插而言我们实际上是将该节点插入哨兵位的前面对于尾删而言我们实际上是删除的是哨兵位的前驱节点。因此改变指针指向实际上就是改变哨兵位前驱和后继节点的指向。代码如下 //尾插 void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);newnode-next phead;newnode-prev phead-prev;phead-prev-next newnode;phead-prev newnode; } //尾删 void LTPopBack(LTNode* phead) {assert(phead);assert(phead-next ! phead);LTNode* del phead-next;LTNode* prve phead-next-prev;phead-prev prve;prve-nextphead;free(del);del NULL; } 6.头插/头删 //头插 void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);newnode-next phead-next;newnode-prev phead;phead-next newnode;phead-next-prev newnode; } //头删 void LTPopFront(LTNode* phead) {assert(phead);assert(phead-next ! phead);LTNode* prve phead-next;LTNode* del phead-next-next;phead-next del;del-prev phead;free(prve);prve NULL; } 这里有个小技巧在我们插入时我们可以先让新节点的前驱和后继节点指向相应位置改变其他指针的指向 7.任意位置插入/删除 我们在有了前面插入删除的逻辑之后我们可以用相同的逻辑如法炮制就可以很快写出任意位置插入删除的代码 void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newnode LTBuyNode(x);newnode-next pos-next;newnode-prev pos;pos-next-prev newnode;pos-next newnode; } void LTErase(LTNode* pos) {assert(pos);pos-next-prev pos-prev;pos-prev-next pos-next;free(pos);pos NULL; } 8.查找 查找的逻辑十分简单通过遍历链表找到相应元素然后返回当前节点如果没有找到就返回空代码如下 LTNode* LTFind(LTNode* phead, LTDataType x) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead){if (pcur-a x){return pcur;}}return NULL; } 小结 冰冻三尺非一日之寒在之后的日子里我会持续更新与数据结构相关的内容如果喜欢的话希望能够点赞关注加转发您的支持就是对我最大的鼓励同时也希望在学习路上的你能够坚持下去半山腰很挤我想去山顶看看。
http://www.hkea.cn/news/14389907/

相关文章:

  • 邯郸信息港二手物品出售短视频seo询盘系统
  • 小学校园网站建设方案logo网站推介
  • 蒙牛企业网站建设规划书网站优化成本
  • 自创网站的软件下载软件制作过程
  • 诏安建设局网站怎么样免费建网站
  • 大型网站开发语言排名网站内容规划流程
  • 建设wap手机网站科技有限公司图片
  • 聊城冠县网站建设无锡网站推广哪家公司好
  • 学校网站怎么做优化万户网站协作管理系统
  • 要解析做邮箱以及网站福田专业网站建设公司
  • 重庆网站制作一般需要多少钱wordpress多价格插件
  • 网站建设算什么费用设计网站账号
  • wordpress网站多语言包甘肃省安装建设集团公司网站
  • 一流的聊城做网站公司网站服务器租赁
  • 商丘网站制作软件娱乐网站排行榜
  • 什么是网站程序台州本地做网站的
  • 网站面包屑导航怎么做的俄语网站服务器
  • 百度推广进入后是别的网站 说是服务器问题布吉做棋牌网站建设哪家技术好
  • seo网站推广是什么wordpress首页背景
  • 360网站页面的工具栏怎么做青云 wordpress加速
  • 网站开发需要多少钱怎样网站建设百度
  • 千万pv网站开发成本等保二级网站建设方案
  • 开一家网站建设公司好辽宁省大学生创新创业平台
  • wordpress国内主机推荐网络优化工程师是干什么的
  • 怎么做网站外链接wordpress 去掉描述的超链接
  • 给个网站你知道创建全国文明城市倡议书
  • wordpress 建站 教程昆明网站seo诊断
  • 企业网站搭建步骤个人养老金保险
  • 自己的网站怎么做模板常州做网站哪家好
  • 八冶建设集团有限公司网站深圳推广平台深圳网络推广