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

【单链表,循环链表和双向链表的时间效率比较,顺序表和链表的比较,有序表的合并------用顺序表实现,用链表实现】

文章目录

  • 一、单链表,循环链表和双向链表的时间效率比较
  • 二、顺序表和链表的比较
  • 三、线性表的应用
    • 1.线性表的合并
    • 1.1有序表的合并------用顺序表实现
    • 1.2有序表的合并--------用链表实现

一、单链表,循环链表和双向链表的时间效率比较

查找表头结点(首元结点)查找表尾结点查找结点*p的前驱结点
带头结点的单链表LL->next时间复杂度O(1)从L->next依次向后遍历时间复杂度为O(n)通过*p无法找到其前驱
带头结点仅设头指针为L的循环单链表L->next时间复杂度为0(1)从L->next依次向后遍历时间复杂度为O(n)通过p->next可以找到其前驱时间复杂度为O(n)
带头结点仅设尾指针R的循环链表R->next时间复杂度为O(1)R时间复杂度O(1)通过p->next可以找到其前驱的时间复杂度O(n)
带头结点的双向循环链表LL->next时间复杂度为O(1)L->prior时间复杂度为O(1)p->prior时间复杂度为O(1)

二、顺序表和链表的比较

  • 链式存储结构的优点:
    结点空间可以动态申请和释放;
    数据元素的逻辑次序靠结点的指针来指示,插入和删除不需要移动数据元素。
  • 链式存储结构的缺点:
    存储密度小,每个结点的指针域额外需要占用存储空间。(存储密度是指结点数据本身所占的存储量和整个结点结构中所占的存储量之比),即:(结点本身占用的空间)/(节点占用的空间总量))
    在这里插入图片描述
    一般的,存储密度越大,存储空间的使用率就越高。显然,顺序表的存储密度为1(100%),而链表的存储密度小于1.
  • 链式存储结构非随机存储。
    在这里插入图片描述

三、线性表的应用

1.线性表的合并

假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合A = A∪B。
在这里插入图片描述
【算法步骤】
依次取出Lb中的每一个元素,执行以下操作:
1.在La中查找该元素。
2.如果找不到,则将其插到La的最后。

1.1有序表的合并------用顺序表实现

已知线性表La和Lb中的数据元素按值递增有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc也按递增排列。
在这里插入图片描述

//线性表的合并
void Union(Sqlist La, Sqlist Lb) {
	int La_len = La.length;
	int Lb_len = Lb.length;
	for (int i = 1; i <= La.length; i++) {
		Elemtype e;
		GetElem(Lb, i, e);//查找Lb中的第i个元素,若果存在就赋值给e
		if (!LocateElem(La, e, i)) {//La中不存在与e相同的元素
			//将e插在La的最后
			int m = 0;
			ListInsert(La, ++m, e);
		}
	}
}

1.2有序表的合并--------用链表实现

在这里插入图片描述
①将La的头结点作为Lc的头结点(Lc表示最后合并好的链表)。
②指定三个三个结点
在这里插入图片描述
③比较La和Lb的结点的指针指向的数据域的大小:pa->data < pb->data;那个小的pa连接到Lc上:pc->next = pa就将小的那个链表放进Lc中。
④将pa复制给pc:pc=pa;pa指向下一个结点。
⑤再比较pa和pb的大小,这里的pb比较小,所以在pc后面接上pb:pc->next= pb;
在这里插入图片描述
⑥再将pb赋值给pc;pb往后面移pc=pb->next;
⑦继续比较pa->data和pb->data的值
⑧直到将某一个链表的结点都加入了,就完成链表的合并。
在这里插入图片描述
⑨如果哪个链表非空,就指向哪个链表:pc->next = pa ? pa:pb;

void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc) {
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = La;
	while (pa && pb) {
		if (pa->data <= pb->data) {
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else {
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;//如果pa非空那么pc->next = pa,否则pb
	delete Lb;//释放Lb的头结点
}

http://www.kler.cn/a/103783.html

相关文章:

  • 【ArcGIS模型构建器】05:批量为多个矢量数据添加相同的字段
  • 【Java】泛型通配符
  • 回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测
  • 路由器和交换机之间的区别
  • Docker部署
  • 面试常问的C++算法(有题目和答案)
  • 大数据技术学习笔记(三)—— Hadoop 的运行模式
  • springboot188基于spring boot的校园商铺管理系统
  • uview组件使用笔记
  • 力扣每日一题64:最小路径和
  • 国内智能客服机器人都有哪些?
  • 集合总结-
  • vue部署,chunk文件有部分404,解决方案
  • 【Java面试题汇总】ElasticSearch篇(2023版)
  • STM32F103单片机内部RTC实时时钟驱动程序
  • 神经网络中epoch、batch、batchsize区别
  • alibaba.fastjson的使用(五)-- Json数组字符串 ==》 JSONArray
  • 有效的括号(C++解法)
  • 45.Redis核心数据结构实战与高性能原理剖析
  • C语言可执行程序到底怎样生成?