APP下载

C#实现单链表结点插入动画

2020-01-03蒋高飞

现代信息科技 2020年16期
关键词:动画语言

摘  要:在Visual Studio 2012平台中使用C#语言编写动画,通过4个结点生动演示单链表的创建以及插入、删除结点的操作过程,动画播放时可以随时暂停以及断点续播。把算法代码和演示区放在同一界面,动画演示的每一步都对应一条语句,并对语句做了详细注释。结点的数值由学生随机输入,可以实现多种形式单链表的操作,提高动画的通用性和交互性,利于学生自主学习,增强学习兴趣,促进其对单链表的掌握。

关键词:C#语言;单链表;插入结点;动画

中图分类号:TP311    文献标识码:A    文章编号:2096-4706(2020)16-0075-04

C# Implementation of the Animation of Singly Linked List Node Inserting

JIANG Gaofei

(Jilin Communications Polytechnic,Changchun  130012,China)

Abstract:In the visual studio 2012 platform,C# language is used to write the animation,through four nodes to vividly demonstrate the creation of single chain table,the operation process of inserting and deleting nodes,and the animation can be paused and continued at breakpoint. Put the algorithm code and demonstration area in the same interface,each step of animation demonstration corresponds to a statement,and make a detailed comment on the statement. The number of nodes is input randomly by students,which can realize the operation of various forms of single chain table,improve the universality and interactivity of animation,facilitate studentsindependent learning,enhance their interest in learning,and promote their mastery of single chain table.

Keywords:C# language;singly linked list;insert nodes;animation

0  引  言

单链表是我校物联网专业“C语言程序设计”课程中比较重要的知识点,为了让学生更好地理解单链表的创建以及插入、删除和查找结点等基本算法,笔者在Visual Studio 2012平台使用C#语言实现以动画方式演示单链表算法,演示过程形象直观,提高学生对单链表功能的理解。

单链表是一种链式存取、从前向后单向操作的数据结构。它用一组地址任意的存储单元存放线性表中的数据元素,链表中的数据元素以结点来表示。每个结点由数据域和指针域组成,数据域存储结点表示数值,指针域存储后续结点存储位置的起始地址。

单链表存储数据的优势一是存储数据的个数不受限制,二是插入和删除结点的操作比较简单灵活,只需要修改几个相关结点的指向关系。本文就以单链表插入结点操作为例,介绍、演示算法文章。

1  设计思想

本动画演示如何按照从小到大的顺序依次插入四个结点,最终生成包含有四个结点的单链表。对于学生来说插入结点的规则非常容易理解,難点在于掌握算法代码和理解代码中各个指针功能。因此作者把算法代码和演示动画置于同一个界面,播放动画时各种指针的移动和结点的移动等每一步动画演示都对应一条代码,动画演示过程就是程序代码执行的过程。

另外为了增加动画演示的互动性,设置插入结点的数值可以由学生随机输入不同整数,实现不同插入效果,提升了演示动画的通用性。

2  演示界面设计

2.1  整体界面设计

演示界面用三个分组控件(GroupBox)分成四个区域,界面功能分区清晰明了,如图1所示。

(1)界面上方:按钮操作区。

(2)界面左侧:代码区。

(3)界面右侧:动画演示区。

(4)界面右下方:代码注释区。

2.2  操作按钮区

在操作按钮区设置三个命令按钮控件(Button)控制动画的播放、暂停、断点续播、结束播放。为了界面简洁减少了按钮个数,将前两个按钮设置成开关按钮。

启动程序时,第一个按钮标题为“播放动画”,点击该按钮播放动画后,标题设置为“重新播放”;第二个按钮初始标题为“暂停动画”,当点击该按钮暂停动画后,标题设置为“继续动画”;按钮根据动画播放状态分别在各自的两个标题间切换显示。

2.3  算法代码区

算法代码区显示单链表从小到大插入结点的算法代码。每条代码以一个标签控件(Label)为载体,右侧动画演示到某条对应代码时,该条代码就以明显的红色重点标识提示学生。

2.4  动画演示区

动画演示区以动画形式演示四个结点插入链表的过程。四个用户自定义控件模拟结点,四个标签控件(Label)模拟代码中的指针h、s、p和q。

2.5  代码注释区

对当前动画对应代码做进一步说明,让学生能更好地理解代码功能。

3  算法设计

3.1  主体算法设计

使用C#中進程Thread与逻辑型变量flagcb和flagzt结合控制动画播放状态。具体实现如表1所示。

利用if和while语句实现结点从小到大插入单链表。if语句判断结点间的各种数值比较情况,在不同分支中调用结点移动函数来移动相应结点,实现插入排序。判断和插入结点流程如图2所示。

3.2  演示结点的设计

在整个单链表插入结点的动画演示中,起到关键作用的是结点的设计。

3.2.1  结点控件的设计

每个结点控件由五个Label控件组成,如果重复绘制工作量比较大。因为单链表中每个结点结构都是相同的,本程序就利用了C#的自定义用户控件功能,把五个Label控件组合成一个结点控件UserControl添加到Visual Studio 2012平台工具箱中,这个控件和Visual Studio系统提供的内部控件一样可以重复使用,提高代码开发效率。

3.2.2  结点移动的设计

单链表中结点的链接过程是动态演示的,这就需要实现多次结点移动。为了代码简洁、避免重复,笔者编写了结点控件的移动方法。每次移动结点时,把移动结点函数的参数分别设置为要移动的结点控件名、起始位置、目标位置即可。

例如,左右移动一个结点的子函数,代码如下所示。设置了Control类型控件变量jd,水平移动的起始位置xstart和目标位置xend,垂直位置y,调用该函数时设置不同的参数值就可以实现不同结点任意位置的左右水平移动。

private void movejd1right(Control jd, int xstart, int xend, int y)

{

for (int x = xstart; x < xend; x = x+ 5)

{

jd.Location = new Point(x,y);

delay(300);

}

}

3.2.3  延迟函数的设计

为了动画演示速度合理,看起来更流畅,添加了延迟函数,如下所示。每个结点移动到一个新位置后暂停1 s。

private void delay(int mss)

{

DateTime t = DateTime.Now.AddMilliseconds(mss);

while (DateTime.Now < t)

Application.DoEvents( );

}

4  举例说明动画演示过程

下文以结点数值分别为3、8、5,按照小到大插入排序为例,说明动画执行过程及效果。

(1)点击“播放动画”按钮启动动画。程序播放前动画演示区预设置的4个结点和h、s、p、q四个指针不显示。

(2)执行第一条语句,创建空的头结点h(图中其名称为结点1)。“播放动画”按钮变为“重新播放”,“暂停动画”按钮变为“继续动画”,为动画的暂停和续播做准备,如图3所示。

(3)继续执行后续代码,因为当前只有头结点,头结点h指向表尾NULL。遇到循环语句,执行第一次循环,给第2个结点(第一个数据结点)输入数值“3”,如图4所示。

(4)输入数据“3”后,点击输入对话框的“确定”按钮,此时数字“3”显示在结点2的数据域中,如图5所示。指针q总是指向新结点;指针p从单链表头结点h开始,依次指向单链表中后续其他结点,逐个和q指向的新结点比较,根据比较结果,新结点插入到相应位置。

(5)存储数值“3”的结点2是除了头结点外的第2个结点,则插入到头结点和表尾标志NULL中间,如图6所示。

(6)第一个数值“3”(第2个结点)插入到链表后,重复执行for循环,进入循环后再次执行输入语句,给结点3输入第2个数值“8”,此时结点3出现在动画演示区。

(7)指针s、p分别后移一个结点,结点2的数值“3”小于结点3的数值“8”,表尾后移给结点3的插入留出空位,结点3插入到结点2和表尾标志NULL中间,如图7所示。

(8)输入第4个结点的数值“5”。指针s和p重新指向头结点,再次从表头开始后移,依次把链表中的结点2和结点3的数值和新结点比较,直到p指向的结点数值大于指针q指向的新结点的数值,指针s和p的后移才停止。

p指向的结点3数值“8”大于新结点4的数值“5”,结点3和表尾标志NULL后移,给结点4空出插入的位置,结点4上移插入到结点2和结点3中间,如图8所示。至此单链表结点插入操作结束。

5  结  论

在课堂上应用单链表插入结点演示动画,减轻了教师上课负担。另外演示动画过程中添加自行输入结点数据的互动功能,提高了学生的自主学习能力,让学生加深了对单链表的功能理解。但该程序也有不足之处,一是链表结点个数固定,二是不能调整播放速度,今后可以在以上方面进行改进。

参考文献:

[1] 张苏新,谈佳豪,周仕伟,等.气动控制最小系统实训装置的设计 [J].现代信息科技,2020,4(6):31-33.

[2] 李春葆.数据结构教程:第5版 [M].北京:清华大学出版社,2017.

[3] 明日科技.C#项目开发实战入门 [M].长春:吉林大学出版社,2017.

[4] 软件开发技术联盟.C#开发实例大全(提高卷) [M].北京:清华大学出版社,2016.

[5] 童晶.C语言课程设计与游戏开发实践教程 [M].北京:清华大学出版社,2017.

作者简介:蒋高飞(1973—),女,汉族,吉林长春人,副教授,硕士,研究方向:软件工程。

猜你喜欢

动画语言
用鲸鱼“语言”通信
White Lover
揭秘油画动画 逐帧堆砌的精致艺术
我有我语言
语言的将来
动画总动员
Action Speaks Louder Than Words 你对肢体语言了解多少
有趣的语言