CN108920367B - 一种数据结构可视化调试方法 - Google Patents
一种数据结构可视化调试方法 Download PDFInfo
- Publication number
- CN108920367B CN108920367B CN201810691685.7A CN201810691685A CN108920367B CN 108920367 B CN108920367 B CN 108920367B CN 201810691685 A CN201810691685 A CN 201810691685A CN 108920367 B CN108920367 B CN 108920367B
- Authority
- CN
- China
- Prior art keywords
- node
- chain structure
- point
- new
- chain
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- User Interface Of Digital Computer (AREA)
Abstract
本申请实施例提供了一种数据结构可视化调试方法,通过生成与原单链结构对应的第一链表可视化界面,实时获取到在所述链表可视化界面进行数据结构调试的调试指令,最后根据所述调试指令进行对应的原单链结构的新建结点或删除结点或修改结点数据域或修改结点指针域处理得到新单链结构,并将第一链表可视化界面更新为与新单链结构对应的第二链表可视化界面,实现了程序调试过程中单链结构的可视化,进一步降低程序设计的调试成本。
Description
技术领域
本申请实施例涉及计算机技术领域,尤其涉及一种数据结构可视化调试方法。
背景技术
随着计算机技术的快速发展,计算机的应用范围也在相应扩大,从而导致社会对计算机软件的要求也越来越高,如何提高软件的生成效率和软件产品的质量成为了是软件工程最为重视的问题。但是就目前实际情况来看,软件开发中的大部分时间都花费在旧系统的维护上,而要想对一个软件系统进行全面细致的了解却非常耗费时间和精力,因为当程序员接手遗留源代码文件时,可能没有完整的文档,或者文档已经过时,甚至根本就没有文档,如果用人工的方式逐条逐句地分析源代码,要想快速准确地分析出软件的整个体系结构、程序的内部构和实现细节等信息,几乎是不可能的。这些摆在程序员面前的难题,不可避免地将给软件开发带来很多的麻烦。因此,应当在程序设计阶段力求开发出高质量的程序,降低后期软件维护的难度。然而,目前主流的商业化集成开发环境,例如MicrosoftVisual Studio、Eclipse和IDEA等都仅是提供了对应用程序的可视化界面的开发支持,并不能实时地对程序中复杂数据之间的抽象关系进行可视化,程序员难以观察程序对抽象关系动态变化的细节,导致程序调试成本高昂、耗时和难以控制。因此,在计算机程序设计及应用开发日益大众化的今天,目前主流的商业化集成开发环境已不能满足实际需要。程序设计可视化是指在计算机程序设计的相应阶段,实现算法、数据结构和程序的各种可视化变换,让程序员可以直观且生动地查看各种同步的数据关系动态视图。其中,动态视图即算法、程序和数据结构的各种可视性的变换图示,可视化变换是指从算法、程序和数据结构的信息到动态视图的映像,从而在程序设计的相应阶段,包括程序的编辑、编译以及调试执行阶段,提供动态视图的可视化信息。数据结构可视化是程序设计可视化的主要内容,通过对算法和数据逻辑结构的自动抽象来完整直观地对数据结构可视化展示,最后实现算法与数据结构的动态关系及演变过程,有助于程序员对程序代码有更加直接与深刻的理解。
单链结构可视化是数据结构可视化的重要内容之一,其对于程序员理解和应用线性表这一最常见和最一般的数据结构具有重要意义。在程序调试过程中,当修改链表时,有时因为程序员代码设计的错误,或者因为只执行部分修改代码,会出现一种所谓的“类线性链表”,其形态上与线性链表或线性循环链表非常相似,每一个结点有唯一的直接后继结点,但与之不同的是,在类线性链表中,结点可能存在两个或两个以上的直接前驱结点,因此,一方面,程序员是否正确理解线性链表或线性循环链表代码中出现的各种链表情况特别是类线性链表情况,对程序功能的正确性以及程序质量的提高具有重要意义;另一方面,类线性链表往往比普通的线性链表或线性循环链表复杂,单纯通过堆栈数据进行数据关系的判定存在较大的困难,因此在程序调试过程中,对类线性链表进行直观和实时的可视化展示可以极大地帮助程序员正确理解当前的单链结构状态,进而提高程序设计的调试效率。
目前实现了数据结构和算法的可视软件的开发,可同时演示算法和数据的视图,在原有的数据结构的基本属性与操作的基础上,增加一组可视属性,提供可视化接口,链表布局是根据显示区域的大小和数据元素个数,计算数据元素直线均匀布局的大小值,依次设置数据元素的大小及其相应的坐标值,但没有给出具体链表布局的方法。后来实现了基于Java 3D的数据结构方式,布局方法采用先获得结点个数,再根据显示区域的大小,固定好首结点坐标,根据首结点坐标及数据结构的线性特性计算其余结点的坐标的方式,并依靠Java 3D技术实现链表立体可视化效果。但是目前单链结构的可视化方法,主要针对的是固定代码的可视化演示,不能实现程序调试过程中单链结构的可视化。
发明内容
本申请实施例提供了一种数据结构可视化调试方法,目前主要针对非固定代码,可实现线性链表、线性循环链表和类线性链表的可视化。
本申请实施例提供了一种数据结构可视化调试方法,包括:
S1:生成与原单链结构对应的第一链表可视化界面,实时获取到在所述链表可视化界面进行数据结构调试的调试指令;
S2:根据所述调试指令进行对应的原单链结构的新建结点或删除结点或修改结点数据域或修改结点指针域处理得到新单链结构,并将第一链表可视化界面更新为与新单链结构对应的第二链表可视化界面。
优选地,调试指令具体包括:
新建结点指令或删除结点指令或修改结点数据域指令或修改结点指针域指令。
优选地,S2具体包括:
根据所述新建结点指令新建独立的第一新单链结构,并为第一新单链结构分配新布局空间;
将第一链表可视化界面更新为与第一新单链结构对应的第二链表可视化界面。
优选地,S2具体包括:
根据所述删除结点指令对原单链结构的待删除结点进行判断,若待删除结点为尾元结点,则直接删除所述待删除结点,成为第二新单链结构,并将第一链表可视化界面更新为与第二新单链结构对应的第二链表可视化界面。
优选地,若待删除结点为非尾元结点,但为首元结点,则确定待删除结点的原直接后继结点为第一变点,对第一变点进行入度减一的操作;
判断入度减一后的第一变点的第一当前入度值,若第一当前入度值为零,则将原单链结构修改成第三新单链结构,并将第一链表可视化界面更新为与第三新单链结构对应的第二链表可视化界面,其中,第三新单链结构的首元结点为第一变点,第三新单链结构的尾元结点为原单链结构的尾元结点;
若第一当前入度值大于零,且待删除结点为第一变点的原主前驱点,则设置第一变点的任一个次前驱点为新主前驱点,生成第四新单链结构,并将第一链表可视化界面更新为与第四新单链结构对应的第二链表可视化界面。
优选地,若待删除结点为非尾元结点,且为非首元结点,则确定待删除结点的原直接后继结点为第二变点,对第二变点进行入度减一的操作;
判断入度减一后的第二变点的第二当前入度值,若第二当前入度值为零,则原单链结构拆分为第五新单链结构和第六新单链结构,并将第一链表可视化界面更新为与第五新单链结构和第六新单链结构对应的第二链表可视化界面,其中,第五新单链结构的首元结点为原单链结构的首元结点,第五新单链结构的结点为原单链结构的首元结点到待删除结点之前的所有结点,第六新单链结构的首元结点为第二变点,第六新单链结构的尾元结点为原单链结构的尾元结点;
若第二当前入度值大于零,且待删除结点为第二变点的原主前驱点,则设置第二变点的任一个次前驱点为新主前驱点,生成第七新单链结构,并将第一链表可视化界面更新为与第七新单链结构对应的第二链表可视化界面。
优选地,S2具体包括:
根据修改结点数据域指令将对应的待修改结点的数据域值直接修改为新数据域值得到第八新单链结构,并将第一链表可视化界面更新为与第八新单链结构对应的第二链表可视化界面。
优选地,S2具体包括:
根据修改结点指针域指令对对应的结点进行判断,若将原单链结构的待修改指针域结点的指针由非空指针修改成空指针,则待修改指针域结点的原直接后继结点为第三变点,对第三变点进行入度减一的操作;
判断入度减一后的第三变点的第三当前入度值,若第三当前入度值为零,则原单链结构拆分为第九新单链结构和第十新单链结构,并将第一链表可视化界面更新为与第九新单链结构和第十新单链结构对应的第二链表可视化界面,其中,第九新单链结构的首元结点为原单链结构的首元结点,第九新单链结构的结点为原单链结构的首元结点到待修改指针域结点之间的所有结点,第十新单链结构的首元结点为第三变点,第十新单链结构的尾元结点为原单链结构的尾元结点;
若第三当前入度值大于零,且待修改指针域结点为第三变点的原主前驱点,则设置第三变点的任一个次前驱点为新主前驱点,生成第十一新单链结构,并将第一链表可视化界面更新为与第十一新单链结构对应的第二链表可视化界面。
优选地,若将原单链结构的待修改指针域结点的指针由空指针修改成非空指针,则待修改指针域结点的新直接后继结点为第四变点,对第四变点进行入度减加一的操作。
判断入度加一后的第四变点的第四当前入度值,若第四当前入度值为一,则设置待修改指针域结点为第四变点的新主前驱点,生成第十二新单链结构,并将第一链表可视化界面更新为与第十二新单链结构对应的第二链表可视化界面;
若第四当前入度值大于一,则设置待修改指针域结点为第四变点的新次前驱点,生成第十三新单链结构,并将第一链表可视化界面更新为与第十三新单链结构对应的第二链表可视化界面。
优选地,若将原单链结构的待修改指针域结点的指针由第一非空指针值修改成第二非空指针值,则待修改指针域结点的原直接后继结点为第五变点和新直接后继结点为第六变点,对第五变点进行入度减一和第六变点进行入度加一的操作;
判断入度减一后的第五变点的第五当前入度值,若第五当前入度值为零,则原单链结构拆分为第十四新单链结构和第十五新单链结构,并将第一链表可视化界面更新为与第十四新单链结构和第十五新单链结构对应的第二链表可视化界面,其中,第十四新单链结构的首元结点为原单链结构的首元结点,待修改指针域结点为第十四新单链结构的尾元结点,第十五新单链结构的首元结点为第五变点,第十五新单链结构的尾元结点为原单链结构的尾元结点;
若第五当前入度值大于零,且待修改指针域结点为第五变点的原主前驱点,则设置第五变点的任一个次前驱点为新主前驱点,生成第十六新单链结构,并将第一链表可视化界面更新为与第十六新单链结构对应的第二链表可视化界面;
判断入度加一后的第六变点的第六当前入度值,若第六当前入度值为一,则设置待修改指针域结点为第六变点的新主前驱点,否则设置待修改指针域结点为第六变点的新次前驱点,生成第十七新单链结构,并将第一链表可视化界面更新为与第十七新单链结构对应的第二链表可视化界面。
从以上技术方案可以看出,本申请实施例具有以下优点:
本申请实施例提供了一种数据结构可视化调试方法,通过生成与原单链结构对应的第一链表可视化界面,实时获取到在所述链表可视化界面进行数据结构调试的调试指令,最后根据所述调试指令进行对应的原单链结构的新建结点或删除结点或修改结点数据域或修改结点指针域处理得到新单链结构,并将第一链表可视化界面更新为与新单链结构对应的第二链表可视化界面,实现了程序调试过程中单链结构的可视化,进一步降低程序设计的调试成本。
附图说明
图1(a)至图1(b)为本申请实施例的新建一个结点的实施例示意图;
图2(a)至图6(b)为本申请实施例的删除一个结点的实施例示意图;
图7(a)至图7(b)为本申请实施例的修改一个结点的数据域的实施例示意图;
图8(a)至图23(b)为本申请实施例的修改一个结点的指针域的实施例示意图;
图24为本申请实施例中一种数据结构可视化调试方法的一个实施例的流程示意图。
具体实施方式
本申请实施例提供了一种数据结构可视化调试方法,目前主要针对非固定代码,可实现线性链表、线性循环链表和类线性链表的可视化。
为使得本申请实施例的发明目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本申请实施例一部分实施例,而非全部的实施例。基于本申请实施例中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请实施例保护的范围。
现有数据结构可视化技术研究虽然均讨论了线性链表和线性循环链表的可视化方法,但主要针对的都是固定代码的可视化演示,不能实现程序调试过程中线性链表和线性循环链表的可视化。同时,对类线性链表的可视化均没有提及。本申请实施例旨在提供一种包括线性链表、线性循环链表和类线性链表的单链结构的通用性好、实现灵活的可视化方法,以降低程序设计的调试成本,应用于商业化程序集成开发环境。
定义1汇点:称有多于一个直接前驱结点的结点为汇点。
定义2类线性链表:在单链结构中若存在汇点,则称此结构为类线性链表。
定义3单链结构:包括线性链表、线性循环链表和类线性链表。
定义4尾元结点:在单链结构中,若某结点无直接后继结点,或其直接后继结点为其前驱结点,则称该结点为尾元结点。
定义5首元结点:在单链结构中,若某结点无直接前驱结点,或其直接前驱结点为本单链结构中的尾元结点,则称该结点为首元结点。
定义6结点入度:将结点的直接前驱结点个数称为结点的入度。
定义7主前驱点和次前驱点:当某结点的入度加一后,如果该结点的入度为一,则其直接前驱结点为主前驱点;否则该结点的入度大于一,其新增的直接前驱结点为次前驱点。当该结点的入度减少一后,如果该结点的入度大于零,且原主前驱点已不是该结点的直接前驱顶点,则根据某种规则指定某个次前驱点为新的主前驱点。
定义8可视化调试过程:已知集成开发环境中的常用调试命令有:开始调试、单步调试(不进入函数)、单步调试(进入函数)、单指令调试,将执行一次上述调试命令的过程称为可视化调试过程。一次可视化调试过程包括若干次可视化调试步骤。
定义9变点:在一次可视化调试步骤中,入度发生变化的结点称为变点。
定义10水平布局:从某一结点开始,依次将该结点到第一个次前驱点或尾元结点的结构放在同一水平线上。
请参阅图24,本申请实施例提供的一种数据结构可视化调试方法的一个实施例包括:
101、生成与原单链结构对应的第一链表可视化界面,实时获取到在链表可视化界面进行数据结构调试的调试指令;
必须说明的是,调试指令具体包括:新建结点指令或删除结点指令或修改结点数据域指令或修改结点指针域指令。
102、根据调试指令进行对应的原单链结构的新建结点或删除结点或修改结点数据域或修改结点指针域处理得到新单链结构,并将第一链表可视化界面更新为与新单链结构对应的第二链表可视化界面。
如果链表中某一个结点发生以下任意一种变化:(1)新建一个结点(2)删除一个结点(3)修改一个结点的数据域(4)修改一个结点的指针域称为一次可视化调试步骤。
以下将分别针对此四种情况的可视化方法分别进行详细介绍:
一、新建一个结点
根据新建结点指令新建独立的第一新单链结构,并为第一新单链结构分配新布局空间;
将第一链表可视化界面更新为与第一新单链结构对应的第二链表可视化界面。
此情况是在保持原单链结构不变的基础上,新建出一个结点,此结点可视为一个独立的单链表。其可视化方法只需为新链表分配新的布局空间,并将其可视化出来。可视化视图如图1(a)新建一个结点b1,变化前;图1(b)新增一个结点b1,变化后所示。
二、删除一个结点
此情况是删除原单链结构中的某一个结点p。根据结点p的位置,又可分成以下三种子情况分别进行处理:
1)结点p是尾元结点
根据所述删除结点指令对原单链结构的待删除结点进行判断,若待删除结点为尾元结点,则直接删除所述待删除结点,成为第二新单链结构,并将第一链表可视化界面更新为与第二新单链结构对应的第二链表可视化界面。
若结点p是尾元结点,其可视化方法只需要标记结点p为被删结点即可。可视化视图如图2(a)删除尾元结点p,变化前;图2(b)删除尾元结点p,变化后所示。
2)结点p是非尾元结点,但是首元结点
若待删除结点为非尾元结点,但为首元结点,则确定待删除结点的原直接后继结点为第一变点,对第一变点进行入度减一的操作;
判断入度减一后的第一变点的第一当前入度值,若第一当前入度值为零,则将原单链结构修改成第三新单链结构,并将第一链表可视化界面更新为与第三新单链结构对应的第二链表可视化界面,其中,第三新单链结构的首元结点为第一变点,第三新单链结构的尾元结点为原单链结构的尾元结点;若第一当前入度值大于零,且待删除结点为第一变点的原主前驱点,则设置第一变点的任一个次前驱点为新主前驱点,生成第四新单链结构,并将第一链表可视化界面更新为与第四新单链结构对应的第二链表可视化界面。
若结点p是非尾元结点,即在原单链结构中结点p存在直接后继结点q,则结点q为变点,变点q的入度减一。
若变点q的入度为零,且由于变点q是首元结点,则原单链结构被修改成新单链结构L,单链结构L的首元结点为变点q,尾元结点为原单链结构中的尾元结点,即L中的结点为原单链结构中变点q和变点q的所有后继结点。
若变点q的入度大于零,且结点p为变点q的原主前驱点,则设置变点q的任一个次前驱点p’为新主前驱点。
对于此情况的可视化方法是:
[1]标记结点p为被删结点;
[2]若变点q的入度为零,则为新单链结构L中从首元结点到第一个次前驱结点或尾元结点的所有结点分配新的布局空间,并将其移动至此空间。如图3(a)删除首元结点且非尾元结点p,变化前;图3(b)删除首元结点且非尾元结点p,变化后所示。
[3]若变点q的入度大于零,且修改了变点的主前驱点为结点p’,且结点q和结点p’不在同一单链结构中,则保持结点p’不动,然后从结点p’直到第一个次前驱点或尾元结点的结构采用水平布局。如图4(a)删除首元结点且非尾元结点p,变化前;图4(b)删除首元结点且非尾元结点p,变化后所示。
可视化视图如下所示:
情况一,变点q的入度为零。如图3(a)删除首元结点且非尾元结点p,变化前;图3(b)删除首元结点且非尾元结点p,变化后所示。
情况二,变点q的入度大于零,且修改变点的主前驱点为结点p’。如图4(a)删除首元结点且非尾元结点p,变化前;图4(b)删除首元结点且非尾元结点p,变化后所示。
与上一种情况类似,若待删除结点为非尾元结点,且为非首元结点,则确定待删除结点的原直接后继结点为第二变点,对第二变点进行入度减一的操作;
判断入度减一后的第二变点的第二当前入度值,若第二当前入度值为零,则原单链结构拆分为第五新单链结构和第六新单链结构,并将第一链表可视化界面更新为与第五新单链结构和第六新单链结构对应的第二链表可视化界面,其中,第五新单链结构的首元结点为原单链结构的首元结点,第五新单链结构的结点为原单链结构的首元结点到待删除结点之前的所有结点,第六新单链结构的首元结点为第二变点,第六新单链结构的尾元结点为原单链结构的尾元结点;
若第二当前入度值大于零,且待删除结点为第二变点的原主前驱点,则设置第二变点的任一个次前驱点为新主前驱点,生成第七新单链结构,并将第一链表可视化界面更新为与第七新单链结构对应的第二链表可视化界面。
可以结合附图进行描述,若结点p是非尾元结点,即在原单链结构中结点p存在直接后继结点q,则结点q为变点,变点q的入度减一。
若变点q的入度为零,且由于结点p是非首元结点,则原单链结构被分解成两部分,其中,第一部分单链结构L的首元结点为原单链结构中的首元结点,L中的结点为原单链结构中首元结点到结点p之前的所有结点;第二部分单链结构L’的首元结点为变点q,尾元结点为原单链结构中的尾元结点,L’中的结点为原单链结构中变点q和变点q的所有后继结点。
若变点q的入度大于零,且结点p为变点q的原主前驱点,则设置变点q的任一个次前驱点p’为新主前驱点。
对于此情况的可视化方法是:
[1]标记结点p为被删结点;
[2]若变点q的入度为零,则为单链结构L’中从首元结点到第一个次前驱结点或尾元结点的所有结点分配新的布局空间,并将其移动至此空间。如图5(a)删除非首元结点且非尾元结点p,变化前;图5(b)删除非首元结点且非尾元结点p,变化后所示。
[3]若变点q的入度大于零,且修改了变点的主前驱点为结点p’,且结点q和结点p’不在同一单链结构中,则保持结点p’不动,然后从结点p’直到第一个次前驱点或尾元结点的结构采用水平布局。如图6(a)删除非首元结点且非尾元结点p,变化前;图6(b)删除非首元结点且非尾元结点p,变化后所示。
可视化视图如下所示:
情况一,变点q的入度为零。如图5(a)删除非首元结点且非尾元结点p,变化前;图5(b)删除非首元结点且非尾元结点p,变化后所示。
情况二,变点q的入度大于零,且修改变点的主前驱点为结点p’。如图6(a)删除非首元结点且非尾元结点p,变化前;图6(b)删除非首元结点且非尾元结点p,变化后所示。
(3)修改一个结点的数据域
根据修改结点数据域指令将对应的待修改结点的数据域值直接修改为新数据域值得到第八新单链结构,并将第一链表可视化界面更新为与第八新单链结构对应的第二链表可视化界面。
此情况是修改了一个结点的数据域值。其可视化方法只需将对应结点的原数据域值修改成新数据域值。可视化视图如图7(a)修改结点p的数据域值,变化前;图7(b)修改结点p的数据域值,变化后所示。
(4)修改一个结点的指针域
修改一个结点的指针域的情况较复杂,又可分成以下三种子情况:
1)一个结点的入度减一
根据修改结点指针域指令对对应的结点进行判断,若将原单链结构的待修改指针域结点的指针由非空指针修改成空指针,则待修改指针域结点的原直接后继结点为第三变点,对第三变点进行入度减一的操作;
判断入度减一后的第三变点的第三当前入度值,若第三当前入度值为零,则原单链结构拆分为第九新单链结构和第十新单链结构,并将第一链表可视化界面更新为与第九新单链结构和第十新单链结构对应的第二链表可视化界面,其中,第九新单链结构的首元结点为原单链结构的首元结点,第九新单链结构的结点为原单链结构的首元结点到待修改指针域结点之间的所有结点,第十新单链结构的首元结点为第三变点,第十新单链结构的尾元结点为原单链结构的尾元结点;
若第三当前入度值大于零,且待修改指针域结点为第三变点的原主前驱点,则设置第三变点的任一个次前驱点为新主前驱点,生成第十一新单链结构,并将第一链表可视化界面更新为与第十一新单链结构对应的第二链表可视化界面。
此情况是将原单链结构中某一结点p的指针由非空指针修改成空指针,则结点p的原直接后继结点q为变点,变点q的入度减一。
若变点q的入度为零,则原单链结构被分解成两部分,其中,第一部分单链结构L的首元结点为原单链结构中的首元结点,结点p为新尾元结点,即L中的结点为原单链结构中首元结点到结点p之间的所有结点;第二部分单链结构L’的首元结点为变点q,尾元结点为原单链结构中的尾元结点,即L’中的结点为原单链结构中变点q和变点q的所有后继结点。
若变点q的入度大于零,且结点p为变点q的原主前驱点,则设置变点q的任一个次前驱点p’为新主前驱点。
对于此情况的可视化方法是:
[1]设置结点p的指针域为空指针;
[2]若变点q的入度为零,则为单链结构L’中从首元结点到第一个次前驱结点或尾元结点的所有结点分配新的布局空间,并将其移动至此空间。如图8(a)变点q的入度减一,变化前;图8(b)变点q的入度减一,变化后所示。
[3]若变点q的入度大于零,且修改了变点的主前驱点为结点p’,且结点q和结点p’不在同一单链结构中,则保持结点p’不动,然后从结点p’直到第一个次前驱点或尾元结点的结构采用水平布局。如图9(a)变点q的入度减一,变化前;图9(b)变点q的入度减一,变化后所示。
可视化视图如下所示:
情况一,变点q的入度为零。如图8(a)变点q的入度减一,变化前;图8(b)变点q的入度减一,变化后所示。
情况二,变点q的入度大于零,且修改变点的主前驱点为结点p’。如图9(a)变点q的入度减一,变化前;图9(b)变点q的入度减一,变化后所示。
(2)一个结点的入度加一
若将原单链结构的待修改指针域结点的指针由空指针修改成非空指针,则待修改指针域结点的新直接后继结点为第四变点,对第四变点进行入度减加一的操作。
判断入度加一后的第四变点的第四当前入度值,若第四当前入度值为一,则设置待修改指针域结点为第四变点的新主前驱点,生成第十二新单链结构,并将第一链表可视化界面更新为与第十二新单链结构对应的第二链表可视化界面;
若第四当前入度值大于一,则设置待修改指针域结点为第四变点的新次前驱点,生成第十三新单链结构,并将第一链表可视化界面更新为与第十三新单链结构对应的第二链表可视化界面。
此情况是将原单链结构中尾元结点p的指针由空指针修改成非空指针,则结点p的新直接后继结点q为变点,变点q的入度加一。若变点q的入度为一,则设置结点p为变点q的新主前驱点,否则设置结点p为变点q的新次前驱点。
对于此情况的可视化方法是:
[1]将尾元结点p的指针域指向变点q;
[2]若修改了变点q的主前驱点为结点p,且结点p和结点q不在同一单链结构中,则保持结点p不动,然后将从结点p直到第一个次前驱点或尾元结点的结构采用水平布局。如图11(a)变点q的入度加一,变化前;图11(b)变点q的入度加一,变化后所示。
可视化视图如下所示:
情况一,空指针域的尾元结点p指向其它链表的非首元结点q,之后q的入度大于一。如图10(a)变点q的入度加一,变化前;图10(b)变点q的入度加一,变化后所示。
情况二,空指针域的尾元结点p指向其它链表的首元结点q,之后q的入度等于一。如图11(a)变点q的入度加一,变化前;图11(b)变点q的入度加一,变化后所示。
情况三,空指针域的尾元结点p指向本单链结构的非首元结点q,之后q的入度大于一。如图12(a)变点q的入度加一,变化前;图12(b)变点q的入度加一,变化前所示。
情况四,空指针域的尾元结点p指向本单链结构的首元结点q,之后q的入度等于一。如图13(a)变化前;图13(b)变化后所示。
(3)一个结点的入度加一且一个结点的入度减一的情况
若将原单链结构的待修改指针域结点的指针由第一非空指针值修改成第二非空指针值,则待修改指针域结点的原直接后继结点为第五变点和新直接后继结点为第六变点,对第五变点进行入度减一和第六变点进行入度加一的操作;
判断入度减一后的第五变点的第五当前入度值,若第五当前入度值为零,则原单链结构拆分为第十四新单链结构和第十五新单链结构,并将第一链表可视化界面更新为与第十四新单链结构和第十五新单链结构对应的第二链表可视化界面,其中,第十四新单链结构的首元结点为原单链结构的首元结点,待修改指针域结点为第十四新单链结构的尾元结点,第十五新单链结构的首元结点为第五变点,第十五新单链结构的尾元结点为原单链结构的尾元结点;
若第五当前入度值大于零,且待修改指针域结点为第五变点的原主前驱点,则设置第五变点的任一个次前驱点为新主前驱点,生成第十六新单链结构,并将第一链表可视化界面更新为与第十六新单链结构对应的第二链表可视化界面;
判断入度加一后的第六变点的第六当前入度值,若第六当前入度值为一,则设置待修改指针域结点为第六变点的新主前驱点,否则设置待修改指针域结点为第六变点的新次前驱点,生成第十七新单链结构,并将第一链表可视化界面更新为与第十七新单链结构对应的第二链表可视化界面。
此情况是将原单链结构中结点p的指针域由某一非空指针值修改成另一个非空指针值,则结点p的原直接后继结点q和新直接后继结点r均为变点,变点q的入度减一,变点r的入度加一。
若变点q的入度为零,则原单链结构被分解成两部分,其中,第一部分单链结构L的首元结点为原单链结构中的首元结点,L中的结点为原单链结构中首元结点及其当前所有后继结点;第二部分单链结构L’的首元结点为变点q,尾元结点为原单链结构中的尾元结点,L’中的结点为原单链结构中变点q和变点q的所有后继结点。
若变点q的入度大于零,且结点p为变点q的原主前驱点,则设置变点q的任一个次前驱点p’为新主前驱点。
此时,若变点r的入度为一,则设置结点p为变点r的新主前驱点,否则设置结点p为变点r的新次前驱点。
对于此情况的可视化方法是:
[1]将结点p的指针域指向变点r;
[2]若变点q的入度为零,则为单链结构L’中从首元结点到第一个次前驱结点或尾元结点的所有结点分配新的布局空间,并将其移动至此空间。如图14、图16、图18、图20所示。
[3]若变点q的入度大于零,且修改了变点q的主前驱点为结点p’,同时结点q和结点p’不在同一单链结构中,则保持结点p’不动,然后从结点p’直到第一个次前驱点或尾元结点的结构采用水平布局。如图15、图17、图19、图21所示。
[4]若修改了变点r的主前驱点为结点p,且结点r和结点p不在同一单链结构中,则保持结点p不动,然后从结点p直到第一个次前驱点或尾元结点的结构采用水平布局。如图20、图21、图23所示。
可视化视图如下所示:
情况一,非尾元结点p指向本单链结构中的前驱结点r,之后结点r的入度加一,且结点p的原直接后继结点q的入度等于零。如图14(a)一个结点的入度加一且另一个结点的入度减一,变化前;图14(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况二,非尾元结点p指向本单链结构中的前驱结点r,之后结点r的入度加一,且修改了结点p的原直接后继结点q的新主前驱点为结点p’。如图15(a)一个结点的入度加一且另一个结点的入度减一,变化前;图15(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况三,非尾元结点p指向本单链结构中的后继结点r,之后结点r的入度大于一,且结点p的原直接后继结点q的入度等于零。如图16(a)一个结点的入度加一且另一个结点的入度减一,变化前;图16(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况四,非尾元结点p指向本单链结构中的后继结点r,之后结点r的入度大于一,且修改了结点p的原直接后继结点q的新主前驱点为结点p’。如图17(a)一个结点的入度加一且另一个结点的入度减一,变化前;图17(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况五,非尾元结点p指向其它单链结构中的非首元结点r,之后结点r的入度大于一,且结点p的原直接后继结点q的入度等于零。如图18(a)一个结点的入度加一且另一个结点的入度减一,变化前;图18(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况六,非尾元结点p指向其它单链结构中的非首元结点r,之后结点r的入度大于一,且修改了结点p的原直接后继结点q的新主前驱点为结点p’。如图19(a)一个结点的入度加一且另一个结点的入度减一,变化前;图19(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况七,非尾元结点p指向其它单链结构中的首元结点r,之后结点r的入度等于一,且结点p的原直接后继结点q的入度为零。如图20(a)一个结点的入度加一且另一个结点的入度减一,变化前;图20(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况八,非尾元结点p指向其它单链结构中的首元结点r,之后结点r的入度等于一,且修改了结点p的原直接后继结点q的新主前驱点为结点p’。如图21(a)一个结点的入度加一且另一个结点的入度减一,变化前;图21(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况九,非尾元结点p指向其它单链结构中的非首元结点r,之后结点r的入度加一。如图22(a)一个结点的入度加一且另一个结点的入度减一,变化前;图22(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
情况十,非尾元结点p指向其它单链结构中的首元结点r,之后结点r的入度等于一。如图23(a)一个结点的入度加一且另一个结点的入度减一,变化前;图23(b)一个结点的入度加一且另一个结点的入度减一,变化后所示。
本申请实施例提供了一种数据结构可视化调试方法,通过生成与原单链结构对应的第一链表可视化界面,实时获取到在所述链表可视化界面进行数据结构调试的调试指令,最后根据所述调试指令进行对应的原单链结构的新建结点或删除结点或修改结点数据域或修改结点指针域处理得到新单链结构,并将第一链表可视化界面更新为与新单链结构对应的第二链表可视化界面,实现了程序调试过程中单链结构的可视化,进一步降低程序设计的调试成本。
与以往的单链结构可视化方法相比,本发明除了给出典型单链结构(线性链表和线性循环链表)的可视化方法之外,还给出了非典型单链结构——“类线性链表”的可视化方法,对于单链结构的可视化不再拘泥于正常理想链表的可视化。与以往的单链结构可视化方法相比,本发明归纳出一种按结点入度变化进行单链结构可视化的方案,即按结点入度的变化,可分析出调试过程中各种单链结构的实时变化情况,从而实施相应的布局,而不再是局限于固定代码的可视化演示。与以往的单链结构可视化方法相比,本发明所提出的可视化方法是一种通用的方法,不受开发平台和实现技术的限制,不存在只能依靠特定平台或者只能采用某种技术才能实现的情况,应用面较广。
以上所述,以上实施例仅用以说明本申请实施例的技术方案,而非对其限制;尽管参照前述实施例对本申请实施例进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请实施例各实施例技术方案的精神和范围。
Claims (4)
1.一种数据结构可视化调试方法,其特征在于,包括:
S1:生成与原单链结构对应的第一链表可视化界面,实时获取到在所述链表可视化界面进行数据结构调试的调试指令;
S2:根据所述调试指令进行对应的原单链结构的新建结点或删除结点或修改结点数据域或修改结点指针域处理得到新单链结构,并将第一链表可视化界面更新为与新单链结构对应的第二链表可视化界面,具体包括:
根据新建结点指令新建独立的第一新单链结构,并为第一新单链结构分配新布局空间;
将第一链表可视化界面更新为与第一新单链结构对应的第二链表可视化界面;
根据删除结点指令对原单链结构的待删除结点进行判断,若待删除结点为非尾元结点,但为首元结点,则确定待删除结点的原直接后继结点为第一变点,对第一变点进行入度减一的操作;
判断入度减一后的第一变点的第一当前入度值,若第一当前入度值为零,则将原单链结构修改成第三新单链结构,并将第一链表可视化界面更新为与第三新单链结构对应的第二链表可视化界面,其中,第三新单链结构的首元结点为第一变点,第三新单链结构的尾元结点为原单链结构的尾元结点;
若第一当前入度值大于零,且待删除结点为第一变点的原主前驱点,则设置第一变点的任一个次前驱点为新主前驱点,生成第四新单链结构,并将第一链表可视化界面更新为与第四新单链结构对应的第二链表可视化界面;
若待删除结点为非尾元结点,且为非首元结点,则确定待删除结点的原直接后继结点为第二变点,对第二变点进行入度减一的操作;
判断入度减一后的第二变点的第二当前入度值,若第二当前入度值为零,则原单链结构拆分为第五新单链结构和第六新单链结构,并将第一链表可视化界面更新为与第五新单链结构和第六新单链结构对应的第二链表可视化界面,其中,第五新单链结构的首元结点为原单链结构的首元结点,第五新单链结构的结点为原单链结构的首元结点到待删除结点之前的所有结点,第六新单链结构的首元结点为第二变点,第六新单链结构的尾元结点为原单链结构的尾元结点;
若第二当前入度值大于零,且待删除结点为第二变点的原主前驱点,则设置第二变点的任一个次前驱点为新主前驱点,生成第七新单链结构,并将第一链表可视化界面更新为与第七新单链结构对应的第二链表可视化界面;
根据修改结点指针域指令对对应的结点进行判断,若将原单链结构的待修改指针域结点的指针由非空指针修改成空指针,则待修改指针域结点的原直接后继结点为第三变点,对第三变点进行入度减一的操作;
判断入度减一后的第三变点的第三当前入度值,若第三当前入度值为零,则原单链结构拆分为第九新单链结构和第十新单链结构,并将第一链表可视化界面更新为与第九新单链结构和第十新单链结构对应的第二链表可视化界面,其中,第九新单链结构的首元结点为原单链结构的首元结点,第九新单链结构的结点为原单链结构的首元结点到待修改指针域结点之间的所有结点,第十新单链结构的首元结点为第三变点,第十新单链结构的尾元结点为原单链结构的尾元结点;
若第三当前入度值大于零,且待修改指针域结点为第三变点的原主前驱点,则设置第三变点的任一个次前驱点为新主前驱点,生成第十一新单链结构,并将第一链表可视化界面更新为与第十一新单链结构对应的第二链表可视化界面;
若将原单链结构的待修改指针域结点的指针由空指针修改成非空指针,则待修改指针域结点的新直接后继结点为第四变点,对第四变点进行入度加一的操作;
判断入度加一后的第四变点的第四当前入度值,若第四当前入度值为一,则设置待修改指针域结点为第四变点的新主前驱点,生成第十二新单链结构,并将第一链表可视化界面更新为与第十二新单链结构对应的第二链表可视化界面;
若第四当前入度值大于一,则设置待修改指针域结点为第四变点的新次前驱点,生成第十三新单链结构,并将第一链表可视化界面更新为与第十三新单链结构对应的第二链表可视化界面;
若将原单链结构的待修改指针域结点的指针由第一非空指针值修改成第二非空指针值,则待修改指针域结点的原直接后继结点为第五变点和新直接后继结点为第六变点,对第五变点进行入度减一和第六变点进行入度加一的操作;
判断入度减一后的第五变点的第五当前入度值,若第五当前入度值为零,则原单链结构拆分为第十四新单链结构和第十五新单链结构,并将第一链表可视化界面更新为与第十四新单链结构和第十五新单链结构对应的第二链表可视化界面,其中,第十四新单链结构的首元结点为原单链结构的首元结点,待修改指针域结点为第十四新单链结构的尾元结点,第十五新单链结构的首元结点为第五变点,第十五新单链结构的尾元结点为原单链结构的尾元结点;
若第五当前入度值大于零,且待修改指针域结点为第五变点的原主前驱点,则设置第五变点的任一个次前驱点为新主前驱点,生成第十六新单链结构,并将第一链表可视化界面更新为与第十六新单链结构对应的第二链表可视化界面;
判断入度加一后的第六变点的第六当前入度值,若第六当前入度值为一,则设置待修改指针域结点为第六变点的新主前驱点,否则设置待修改指针域结点为第六变点的新次前驱点,生成第十七新单链结构,并将第一链表可视化界面更新为与第十七新单链结构对应的第二链表可视化界面。
2.根据权利要求1所述的数据结构可视化调试方法,其特征在于,调试指令具体包括:
新建结点指令或删除结点指令或修改结点数据域指令或修改结点指针域指令。
3.根据权利要求2所述的数据结构可视化调试方法,其特征在于,S2具体包括:
根据所述删除结点指令对原单链结构的待删除结点进行判断,若待删除结点为尾元结点,则直接删除所述待删除结点,成为第二新单链结构,并将第一链表可视化界面更新为与第二新单链结构对应的第二链表可视化界面。
4.根据权利要求2所述的数据结构可视化调试方法,其特征在于,S2具体包括:
根据修改结点数据域指令将对应的待修改结点的数据域值直接修改为新数据域值得到第八新单链结构,并将第一链表可视化界面更新为与第八新单链结构对应的第二链表可视化界面。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810691685.7A CN108920367B (zh) | 2018-06-28 | 2018-06-28 | 一种数据结构可视化调试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810691685.7A CN108920367B (zh) | 2018-06-28 | 2018-06-28 | 一种数据结构可视化调试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108920367A CN108920367A (zh) | 2018-11-30 |
CN108920367B true CN108920367B (zh) | 2022-02-15 |
Family
ID=64422207
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810691685.7A Active CN108920367B (zh) | 2018-06-28 | 2018-06-28 | 一种数据结构可视化调试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108920367B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112199088B (zh) * | 2020-10-19 | 2023-07-25 | 广东工业大学 | 一种二叉树数据结构的可视化演变方法 |
CN115048096B (zh) * | 2022-08-15 | 2022-11-04 | 广东工业大学 | 一种数据结构动态可视化方法和系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101196933A (zh) * | 2008-01-09 | 2008-06-11 | 王珊 | 利用连接表压缩数据图的方法和设备 |
CN105653609A (zh) * | 2015-12-24 | 2016-06-08 | 中国建设银行股份有限公司 | 基于内存的数据处理方法及装置 |
US10083127B2 (en) * | 2016-08-22 | 2018-09-25 | HGST Netherlands B.V. | Self-ordering buffer |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5319778A (en) * | 1991-07-16 | 1994-06-07 | International Business Machines Corporation | System for manipulating elements in linked lists sharing one or more common elements using head nodes containing common offsets for pointers of the linked lists |
CN101989178B (zh) * | 2010-11-05 | 2013-03-06 | 北京航空航天大学 | 多叉树数据结构的立体环状可视化方法 |
US8839133B2 (en) * | 2010-12-02 | 2014-09-16 | Microsoft Corporation | Data visualizations including interactive time line representations |
-
2018
- 2018-06-28 CN CN201810691685.7A patent/CN108920367B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101196933A (zh) * | 2008-01-09 | 2008-06-11 | 王珊 | 利用连接表压缩数据图的方法和设备 |
CN105653609A (zh) * | 2015-12-24 | 2016-06-08 | 中国建设银行股份有限公司 | 基于内存的数据处理方法及装置 |
US10083127B2 (en) * | 2016-08-22 | 2018-09-25 | HGST Netherlands B.V. | Self-ordering buffer |
Non-Patent Citations (1)
Title |
---|
数据结构线性表之单链表;NotFunGuy;《https://www.jianshu.com/p/a34924b229d9》;20170717;第1-9页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108920367A (zh) | 2018-11-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3338179B1 (en) | Graphical representation of data in a program code editor | |
US9495722B2 (en) | Developer controlled layout | |
US8310484B2 (en) | Efficient processing of operator graphs representing three-dimensional character animation | |
US20060206869A1 (en) | Methods and systems for developing data flow programs | |
CN105528418B (zh) | 一种设计文档生成方法及装置 | |
CN111400899B (zh) | 一种用于电缆敷设建模的处理方法、系统和存储介质 | |
JP4991153B2 (ja) | リッチなユーザインターフェースのデザインのためのスタイリングメカニズム | |
JPH07200278A (ja) | 図形を用いたプログラミングシステム | |
CN102693281B (zh) | 一种基于autocad的pdms中辅助线的生成方法 | |
CN108920367B (zh) | 一种数据结构可视化调试方法 | |
CN110673844A (zh) | 一种图像处理软件开发方法及系统 | |
US8615729B2 (en) | Extending existing model-to-model transformations | |
US8935657B2 (en) | Model-to-model transformation by kind | |
WO2018193503A1 (ja) | プログラム作成装置 | |
US20220358258A1 (en) | Computer-aided design methods and systems | |
US11188307B2 (en) | Modelizing resources and external data of a program for procedural language coding | |
US20220111515A1 (en) | Method and Apparatus for Managing Robot Program | |
CN115115787A (zh) | 一种基于DirectVR的二维图纸转3D模型方法 | |
CN109766125A (zh) | 批次间追平冲突的识别方法及装置 | |
CN106547528B (zh) | 一种界面布局方法以及装置 | |
US10055811B2 (en) | System and method for generating interactive 2D projection of 3D model | |
JP2009009473A (ja) | Guiの設計装置、設計方法およびプログラム | |
CN104573526B (zh) | 软件产品多版本管理方法、装置以及计算机设备 | |
JP3447365B2 (ja) | オブジェクト指向プログラミング支援装置及びオブジェクト指向プログラミング支援方法 | |
CN114518875A (zh) | 一种图形化编程系统及其编程方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |