数据结构与算法基础(青岛大学-王卓)(3)

news2024/11/17 12:33:53

第三弹来啦,第一章的顺序表和链表落下帷幕了,可以开开心心吃雪糕了:)

beautiful分割线


文章目录

    • 第三弹来啦,第一章的顺序表和链表落下帷幕了,可以开开心心吃雪糕了:)
          • 循环链表
            • 定义
            • 带尾指针循环链表的合并
          • 双向链表
            • 定义
            • 双向循环链表
            • 双向链表的插入
            • 双向链表的删除
          • 链表的时间效率比较
          • 顺序表和链表的比较
          • 线性表的应用
            • 线性表的合并
            • 有序表的合并
          • 案例分析
            • 连续性多项式求和运算
            • 稀疏多项式运算

循环链表
定义
  • 头尾相连的链表,最后一个节点的指针域指向头结点,形成一个环。

  • 优点是从任一节点出发均可找到其他节点。

在这里插入图片描述

  • 注意:循环链表没有NULL指针,判断遍历终止操作时,终止条件是判断他们是否等于头指针

​

  • 通常用尾指针表示单循环链表,方便对尾结点和头节点操作

​

带尾指针循环链表的合并

将Tb合并在Ta之前

LinkList Connect(LinkList Ta, LinkList Tb){ 
//假设Ta,Tb都是非空的单循环链表
    p=Ta->next;              //p存表头节点
    Ta->next=Tb->next->next; //Tb表头连接Ta表尾
    delete(p);               //释放Tb头结点(free(Tb->next))
    Tb->next=p;              //修改Tb->指针到新头结点
    return Tb;
}
双向链表
定义

在单链表的每个节点中再增加一个指向其前趋的指针域prior, 这样就有了两个方向的链接,称为双向链表,(也解决单链表中寻找前驱结点难的情形)。

priordatanext
  • 结构定义:
typedef struct DuLnode{
	Elemtype data;
	struct DuLnode *prior, *next;
}DuLnode, *DuLinkList;

  • 双向链表的对称性(假设p指向某一节点)

    p->prior->next = p = p->next->prior

  • 双向链表中的某些操作,如果只涉及到一根指针(ListLength, GetElem…),则他们的算法和单链表相同,但是插入,删除操作需要同时修改两个方向上的指针,操作时间复杂度O(n).

双向循环链表
  • 头结点的前趋指向尾结点
  • 尾结点的后继指向头结点

双向链表的插入

void LinkInsert_DuL(DuLinkList &L,int i, ElemType e){
//在带头结点的双向链表L中第i个位置插入元素e
    if(!(p=GetElemP_DuL(L,i))) return ERROR;
    s=new DuLnode; s->data=e; //创建新节点s并赋值
    s->prior=p->prior;  //s节点的前趋指向
    p->prior->next=s;   //a节点的后继指向
    s->next=p;   //s节点的后继指向
    p->prior=s;  //b节点的前趋指向
    return OK;            
}//ListInsert_DuL

双向链表的删除

Void ListDelete_DuL(DuLinkList &L, int i, ElemType &e){
    //在双向链表中删除i位置元素
    if(!(p=GetElemP_DuL(L,i))) return ERROR;
    e = p->data; // 保存被删数据
    p->prior->next = p->next;  // 修改前一个节点后继
    p->next->prior = p->prior; // 修改后一个节点的前趋
    delete(p);
    return OK;
}//ListDelete_DuL
链表的时间效率比较

顺序表和链表的比较

线性表的应用
线性表的合并

两个线性表La, Lb 分别表示两个集合A,B,现在要求一个新的集合A=AUB

La=(7,5,3,11) Lb=(2,6,3) ==> La=(7,5,3,11,2,6)

算法步骤:

依次取出Lb中的每个元素,执行以下操作:

  1. 在La中查找该元素
  2. 如果找不到,则将其插入La的最后
  3. 算法的时间复杂度: O(ListLength(La)*ListLength(Lb))
void union(List &La, List Lb){
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    for (i=1;i<=Lb_len;i++){
        GetElem(Lb,i,e);
        if (!LocateElem(La,e)) ListInsert(&La,++La_len,e)            
    }
}
有序表的合并

一致线性表La, Lb中的数据元素按值非递减有序排列,现将两表合并成一个新表Lc, 且要求Lc中的元素仍按值非递减有序排列。(非递减:有值相等的,非完全的递增)

La=(1,7,8) Lb=(2,4,6,8,10,11) ==> Lc=(1,2,4,6,7,8,8,10,11)

用顺序表算法步骤:

(1)创建一个空表Lc

(2)依次从La或Lb中"摘取“元素值较小的结点插入到Lc表的最后,直至其中一个表变空为止

(3)继续将La或Lb其中一个表的剩余结点插入在Lc表的最后

(4)算法的时间复杂度和空间复杂度均为 O(ListLength(La)+(ListLength(Lb))

// 顺序表实现有序表的合并(非递减排序)
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc){
    pa=La.elem;  //La基地址
    pb=Lb.elem;  //Lb基地址
    Lc.length=La.length+Lb.length;  //Lc的长度
    Lc.elem=new ElemType[Lc.length];  //创建新表Lc并分配数组空间
    pc=Lc.elem;
    pa_last=La.elem+La.length-1;  //last指针是指向表中最后一个元素,用于循环摘取时确认表中数据是否读完
    pb_last=Lb.elem+Lb.length-1;
    
    while (pa<=pa_last && pb<=pb_last) {  //两表非空
        if (*pa<=*pb) *pc++ = *pa++;  //依次摘取两表中较小元素放入Lc
            else *pc++ = *pb++;
    }
    while (pa<=pa_last) *pc++ = *pa++; //Lb为空时,将La中剩余元素加到Lc
    while (pb<=pb_last) *pc++ = *pb++; //La为空时,将Lb中剩余元素加到Lc
}//MergeList_Sq

用链表算法步骤

// 链表实现有序表的合并(非递减排序)
void MergeList_L(LinkList &La, LinkList &Lb, ListList, &Lc) {
    pa=La->next; pb=Lb->next;
    pc=Lc=La; // Lc在La的基础上变身(使用La的头节点),当然也可以用Lb头结点
    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;}  //比较La和Lb中的元素大小,将小的元素接到Lc上,并移动相应指针到下一个位置
    }
    if pc->next=pa?pa:pb;  //三目运算符用于将La/Lb中剩余的元素加到Lc上,pa存在取pa,pa不存在取pb
    delete Lb;  //删除Lb头结点
}

// 时间复杂度为O(ListLength(La)+(ListLength(Lb))
案例分析
连续性多项式求和运算

数组形式解决 - 保存系数,指数和下标相同

稀疏多项式运算

- 顺序表思想

  • 链表思想

//多项式的创建 - 链式存储
void CreatePolyn(Polynomial &P, int n) { //输入元素想输n,创建多项式有序列表P
    P=new PNode;
    P->next=NULL;  // 建立一个带头结点的空的单链表
    for (i=1;i<=n;i++){ //依次输入n个非零项
        s=new PNode; // 生成新节点
        sin>>s->coef>>s->expn;  // 输入新节点的系数和指数
        pre=P;  //pre用于保存q的前驱,初值为头结点
        q=P->next; //q初始化,指向首元结点
        while (q && q->expn<s->expn) { // 循环找到第一个大于s节点指数的项
            pre=q; q=q->next  
        }
        s->next=q;  // 将输入项s节点插入到q和前驱结点pre之间
        pre->next=s;
    }
}

采用链表合并的思想

//链表思想 - 多项式求和运算
void Add_Polyn(Polynomial &Pa, Polynomial &Pb, Polynomial &Pc){
    p1=Pa->next; p2=Pb->next;  //p1,p2指向两个链表的首元结点
    p3=Pc=Pa;   // 基于Pa的头结点创建和初始化链表Pc
    PNode *s;   // 创建一个临时指针s用于后面删除节点
    while(p1 && p2){  // 在p1,p2不为空的前提下,循环比较两个节点的指数大小
        if (p1->expn < p2->expn){  // p1指数小于p2指数情况 
            p3->next=p1; p3=p1; p1=p1->next;  // 把p1加入到p3中,p1移向下一个节点
        } else if (p1->expn > p2->expn) {  // p1指数大于p2指数情况 
            p3->next=p2; p3=p2; p2=p2->next; // 把p2加入到p3中,p2移向下一个节点
        } else {  // p1指数等于p2指数情况 
            p1->coef += p2->coef;  // p1和p2两者系数相加并放到p1节点中
            if (!p1->coef) {  // 系数相加为0时,删除这两个节点
                s=p1;p1=p1->next; delete(s); //此处不能直接free(p),不然链表会断开的
                s=p2;p2=p2->next; delete(s);
            }
            else {
                p3->next=p1;p3=p1; p1=p1->next; // 系数相加不为0时,将新系数的节点p1加入P3中,删除p2节点
                s=p2;p2=p2->next; delete(s);
            }
        }
    }
    if p3->next=p1?p1:p2; delete p2;  // 将p1或者p2中剩下的不用比较系数的节点直接加到p3中
}


TO BE CONTINUED…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排版设计工具Affinity Publisher 2.04版本在win10系统上的下载与安装配置教程

目录 前言一、Affinity Publisher安装二、使用配置总结 前言 Affinity Publisher是一款由 Serif 公司开发的排版设计工具&#xff0c;旨在为用户提供完整的出版解决方案。 Affinity Publisher 工具的详细介绍&#xff1a; 1. 排版功能 Affinity Publisher 提供了各种排版功…

每日一练 | 软考网络工程师真题练习Day5

1、下面有关BGP4协议的描述中&#xff0c;不正确的选项是 。 A&#xff0e;BGP4是自治系统之间的路由协议 B&#xff0e;BGP4支持CIDR技术 C&#xff0e;BGP4把最正确通路参加路由表并通告邻居路由器 D&#xff0e;BGP4封装在TCP段中传送 2、CMP协议在网络中起到了过…

环信 uni-app-demo 升级改造计划——整体代码重构优化(二)

概述 本次关于 uni-app 代码整体重构工作&#xff0c;基于上一期针对 uni-app 官网 demo 从 vue2 迁移 vue3 框架衍生而来&#xff0c;在迁移过程中有明显感知&#xff0c;目前的项目存在的问题为&#xff0c;项目部分代码风格较为不统一&#xff0c;命名不够规范&#xff0c;注…

macOS Ventura 13.4 (22F66)发布

系统介绍 5 月 19 日黑果魏叔官网消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.4 更新&#xff08;内部版本号&#xff1a;22F66&#xff09;&#xff0c;本次更新距离上次发布隔了 41 天。 macOS Ventura 带来了台前调度、连续互通相机、FaceTime 通话接力等功能…

Fourier分析入门——第3章——离散函数的Fourier分析

目录 第 3 章 离散函数的Fourier分析 3.1 引言 3.2 在1点采样的函数 3.3 在2点采样的函数 3.4 Fourier分析是一种线性变换 3.5 Fourier分析是一种基向量的变更 3.6 在3点采样的函数 3.7 在D点采样的函数 3.8 整理(tidying up) 3.9 Parseval[p:zeifa:l]定理 3.10 关联…

性价比提升15%,阿里云发布第八代企业级计算实例g8a和性能增强型实例g8ae

5 月 17 日&#xff0c;2023 阿里云峰会常州站上&#xff0c;阿里云正式发布第八代企业级计算实例 g8a 以及性能增强性实例 g8ae。两款实例搭载第四代 AMD EPYC 处理器&#xff0c;标配阿里云 eRDMA 大规模加速能力&#xff0c;网络延时低至 8 微秒。其中&#xff0c;g8a 综合性…

微博服务器为什么会宕机?这几年为什么极少再宕机了?

大家有没有发现一个事情&#xff0c;相比六七年前微博动辄因为各路明星的新闻忽告宕机&#xff0c;比如最出名的微博“三大战役”&#xff1a;李晨发范冰冰分手、王宝强离婚&#xff0c;鹿晗公布恋情&#xff0c;近几年微博宕机的次数已经越来越少了。 自从各路明星大料不断让新…

TCAN114x-Q1部分组网增强型CAN FD收发器(SBC_CAN的收发器)

目录 TCAN114x-Q1部分组网增强型CAN FD收发器1、功能2、应用程序3、描述4、设备比较表5、引脚配置与功能8、规格8.1绝对最大评级 9、参数测量信息10、详细描述10.1概述10.2功能框图 10.3特性描述10.3.1 VSUP引脚10.3.2 VIO引脚10.3.3 VCC引脚10.3.4接地10.3.5 INH/LIMP引脚10.3…

2023年海外网红营销:品牌影响力大揭秘

随着社交媒体的快速发展&#xff0c;海外网红营销已经成为品牌推广和营销策略中不可或缺的一环。海外网红凭借其个人魅力和广泛的受众群体&#xff0c;为品牌带来了巨大的影响力和商机。本文Nox聚星将和大家详细探讨2023年海外网红营销对品牌的影响力究竟有多大。 1、巨大的市场…

CIE颜色空间LCh、Lab、XYZ-sRGB介绍与转换关系(包含源码)

项目场景&#xff1a; 提示&#xff1a;在颜色科学中&#xff0c;LCh和Lab是比较常用的 LCh是由MATLAB计算出的数据&#xff0c;但是我所需要在Qt的q3dsurface绘制出这个切面&#xff0c;看了Qt官方Examples&#xff0c;墨西哥草帽算法的3D模型就是由XYZ组成的。所以我需要LC…

如何让“ChatGPT自己写出好的Prompt的“脚本在这里

写个好的Prompt太费力了 在网上&#xff0c;你可能会看到很多人告诉你如何写Prompt&#xff0c;需要遵循各种规则&#xff0c;扮演不同的角色&#xff0c;任务明确、要求详细&#xff0c;还需要不断迭代优化。写一个出色的Prompt需要投入大量的时间和精力。甚至有一些公开的Pr…

风靡 B 站的《看漫画学 Python》到底是什么来头?

学习 Python 的小伙伴大部分应该都知道《看漫画学 Python&#xff1a;有趣、有料、好玩、好用&#xff08;全彩版&#xff09;》这本书&#xff01; 毕竟&#xff0c;如果在 B 站搜索“漫画 Python”等相关关键词&#xff0c;会看到整个页面都是和这本书相关的视频…… 郑重声…

2023世界旅游经济趋势报告发布,中国旅游日期间博冠8K发起慢直播一日游活动

一、2023世界旅游经济趋势报告重点解读 &#xff08;1&#xff09;全球旅游恢复至疫情前六至八成 近日&#xff0c;世界旅游城市联合会和中国社会科学院旅游研究中心联合发布了《世界旅游经济趋势报告&#xff08;2023》&#xff0c;指出2022年全球旅游总人次达到95.7亿人次&…

谷歌扩展开发v3版本,自动请求接口

背景&#xff1a;pc端项目要是1个小时不动不请求&#xff0c;token会过期&#xff0c;写个插件每隔一段时间自动取请求一个接口&#xff0c;让token不过期过程&#xff1a;在刚开始写的时候 网上大部分是 谷歌扩展开发v2版本的做法&#xff0c;先是把官方文档看了一下&#xff…

计算机论文写作规范

什么是顶会 顶级会议一般是,在业界(本领域本方向)受到广泛的承认,影响力较大的会议。一方面一般顶级专家、学者都倾向于将paper投到这些 会议;另一方面这些会议的论文代表了该领域的目前很优秀、有重大意义的进展。"顶级会议"的投稿竞争压力一般都很大,属于在经典 p…

【k8s】Jenkins实现Java应用CI、CD实践 【二】【待写】

一、运行Jenkins流水线流程思路&#xff1a; 场景1&#xff1a;常规java应用&#xff0c;使用jenkins pipeline 交付到Kubernetes集群中1、准备好java代码、Dockerfile、 deploy. yaml资源清单文件CI阶段: 1、获取代码 2、漏洞扫描 3、检测漏洞扫描结果&#xff0c;如果正常则…

MySQL8.0卸载、安装和使用(一)

1、MySQL数据库的卸载 有小伙伴在学MySQL的时候总是出现各种问题&#xff0c;MySQL的安装都会出现许多问题&#xff0c;今天以MySQL8.0作为示范&#xff0c;需要注意的问题和正确的使用方式。因为MySQL是系统软件&#xff0c;相对复杂&#xff0c;因此先讲卸载。 步骤一&#x…

病毒丨文件夹病毒

作者丨黑蛋 一、基本信息 文件名称 880753802c3e6f4b5269062d4e76200c66e3a71e2118702e24d2b32c19dddfd2 文件类型(Magic) PE32 executable (GUI) Intel 80386, for MS Windows 文件大小 479.50KB SHA256 880753802c3e6f4b5269062d4e76200c66e3a71e2118702e24d2b32c19dddfd2 …

青龙面板使用教程,以及安装

1. 青龙面板使用教程&#xff0c;以及安装 首先青龙面板是在docker里面的&#xff0c;我们要安装一个docker 我这里只有debian 11 安装的教程 如何在debian11上安装docker - 知乎 这个文章不错了&#xff0c;按命令执行就好了&#xff0c;其他操作系统的。去网上搜索安…

Unity - BRP - PP后效导致 Camera.targetTexture 被换掉,graphicsFormat 不对问题

文章目录 环境目的原因问题解决方法 环境 Unity : 国际版2020.3.37f1 Pipeline : BRP Packages: Post Processing 3.0.3 目的 BRP 虽然是 官方放弃更新的 渲染管线&#xff0c;但是有些项目仍然会使用到&#xff0c;有一些踩过的坑&#xff0c;该记录的还是记录一下&#xff…