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

做微信的微网站东莞网站建设 汇卓

做微信的微网站,东莞网站建设 汇卓,怎么对网站上的游记做数据分析,岳阳seo优化1 线性表 1.3 循环链表(Circular Linked List) 循环链表的结构: 循环链表和单链表的不同在于:当链表遍历时,判别当前指针p是否指向表尾结点的终止条件不同。 单链表中,判别条件为 p ! NULL 或 p->nex…

1 线性表

1.3 循环链表(Circular Linked List)

循环链表的结构:

在这里插入图片描述

循环链表和单链表的不同在于:当链表遍历时,判别当前指针p是否指向表尾结点的终止条件不同。

  • 单链表中,判别条件为 p != NULLp->next != NULL
  • 循环单链表的判别条件为 p != Lp->next != L

合并循环链表

【前置处理】

书上和课程都有提到合并循环链表,并且是通过尾指针的方式进行合并。根据这个思路,又因为在写这个方法的时候,要构建2个循环链表进行测试,所以我把单链表的尾插法拿过来修改了下,主要改动是两个点:

  1. 增加尾结点指针参数,在调用这个方法后,可以获取到尾结点指针。
  2. 尾结点的next指向头结点,形成循环链表。

代码如下:

// 尾插法创建循环链表
Status CreateListTail(LinkList *L, int n, LNode **tailNode)
{*L = (LinkList)malloc(sizeof(LNode)); // 创建头结点if (*L == NULL){return OVERFLOW;}(*L)->next = NULL; // 初始化头结点的next指针为NULL// 一开始尾结点指向头节点。每增加一个结点,尾结点就指向新增加的结点。*tailNode = *L;LNode *newNode; // 新结点指针for (int i = 1; i <= n; i++){newNode = (LNode *)malloc(sizeof(LNode)); // 创建新结点if (newNode == NULL){return OVERFLOW;}newNode->data.x = i;  // 设置新结点的数据newNode->next = NULL; // 将新结点的next指针设置为NULL(*tailNode)->next = newNode; // 将当前尾结点的next指针指向新结点*tailNode = newNode;         // 更新尾结点为新结点}/* 这里是新增加的 */// 上面while循环结束后,tailNode指向最后一个结点,即尾结点// 尾结点的next指针指向头结点,形成循环链表(*tailNode)->next = *L;return OK;
}

[!question]
这里为什么用 LNode **tailNode,即指针的指针?在后面结合调用这个方法的时候进行理解。

再增加一个打印链表内所有结点的方法(这个在上一节就已经增加了,不过没有提到这个方法,这节直接拿来用,但是要修改一下):

// 打印链表
void PrintList(LinkList *L)
{LNode *current = (*L)->next; // 从头结点的下一个结点(首元结点)开始遍历while (current != *L)        // 这行发生改动: current != NULl 调整为 current != *L{printf("%d ", current->data.x); // 打印结点数据current = current->next;        // 移动到下一个结点}
}

调用:

LinkList L1, L2;                      // 声明两个链表
LNode *tailNode1, *tailNode2;         // 声明两个尾结点指针
CreateListTail(&L1, 100, &tailNode1); // 尾插法创建单链表1
CreateListTail(&L2, 30, &tailNode2);  // 尾插法创建单链表2PrintList(&L1); // 打印链表1
printf("\n");
PrintList(&L2); // 打印链表2
printf("\n");

因为这里声明的尾结点是指针类型,所以在声明 CreateListTail 方法时,需要定义为 LNode **tailNode,即指针的指针,这样在方法内部修改 *tailNode 的时候,才会修改到这里定义的 *tailNode1*tailNode2

【算法步骤】

有了尾指针之后,方法就变得非常简单。

  1. 用临时变量 L1 保存第一个链表的头节点。
  2. 将第一个链表的尾结点指向第二个链表的首元结点。
  3. 释放第二个链表的头结点内存。
  4. 将第二个链表的尾结点指向第一个链表的头结点。

步骤参考如下:

在这里插入图片描述

【代码实现】

// 根据两个链表的尾结点合并两个循环链表
Status MergeList(LNode **tailNode1, LNode **tailNode2)
{LinkList L1 = (*tailNode1)->next; // 获取第一个链表的头结点(*tailNode1)->next = (*tailNode2)->next->next; // 将第一个链表的尾结点指向第二个链表的首元结点free((*tailNode2)->next);                      // 释放第二个链表的头结点(*tailNode2)->next = L1;                       // 将第二个链表的尾结点指向第一个链表的头结点return OK;
}

【算法分析】

可以看到在循环链表种,有了尾结点指针后,合并操作变得非常简单,修改几个指针就可以了,时间复杂度是 O(1)

http://www.dtcms.com/a/402415.html

相关文章:

  • 东莞社保官方网站网站设计流程的步骤
  • 怎么做网站导航外链门户网站功能模块
  • 建设一个网站主要受哪些因素的影响网站开发流程详解
  • 如何设计旅游网站中国设计师网效果图
  • 阿里巴巴国际站可以做网站吗制作网页链接
  • 网站建设技术方案游戏开发公司定制游戏
  • 广告网站定制网站建设怎样做好
  • 国内商城网站建设中铁建设集团门户员工登录
  • 儿童网站源码网络培训师
  • 做网站新闻移动动态工业互联网平台建设及推广指南
  • 学习网站建设好找工作吗学校网站开发图片素材
  • 网站开发前端和后端的区别抖音个人主页模板
  • 电子商务网站软件建设的Wordpress自建主题视频百度云下载
  • 法语网站建设湖北网站建设联系电话
  • 制作网页的网站叫什么业务员怎样网上找客户
  • 个人网站案例山东烟台建设厅网站
  • 建站之星做的网站如何导出建立网站链接结构的基本方式有
  • 网站挂直播连接怎么做交互式多媒体网站开发
  • 上海做一个公司网站多少钱企业网站php开源系统
  • 深圳外贸网站公司拓者设计吧注册码
  • 网站线框图刷赞网站推广空间免费
  • 网站突然被降权怎么办青岛企业建站
  • 傻瓜式大型网站开发工具网站构建的一般流程是什么
  • 做网站大概需要多少钱门户网站布局
  • 网站建设服务流程seo案例分享
  • 哪里可以做寄生虫网站淘宝做推广网站
  • 网站建设开票规格明细单位怎么写做环保网站案例分析
  • 一屏一屏的网站怎么做免费查询公司信息
  • 网站慢用台服务器做跳板美食网站开发计划
  • 配送网站开发编程软件排行榜