摘? 要:在Visual Studio 2012平臺(tái)中使用C#語言編寫動(dòng)畫,通過4個(gè)結(jié)點(diǎn)生動(dòng)演示單鏈表的創(chuàng)建以及插入、刪除結(jié)點(diǎn)的操作過程,動(dòng)畫播放時(shí)可以隨時(shí)暫停以及斷點(diǎn)續(xù)播。把算法代碼和演示區(qū)放在同一界面,動(dòng)畫演示的每一步都對(duì)應(yīng)一條語句,并對(duì)語句做了詳細(xì)注釋。結(jié)點(diǎn)的數(shù)值由學(xué)生隨機(jī)輸入,可以實(shí)現(xiàn)多種形式單鏈表的操作,提高動(dòng)畫的通用性和交互性,利于學(xué)生自主學(xué)習(xí),增強(qiáng)學(xué)習(xí)興趣,促進(jìn)其對(duì)單鏈表的掌握。
關(guān)鍵詞:C#語言;單鏈表;插入結(jié)點(diǎn);動(dòng)畫
中圖分類號(hào):TP311? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? 文章編號(hào):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? 引? 言
單鏈表是我校物聯(lián)網(wǎng)專業(yè)“C語言程序設(shè)計(jì)”課程中比較重要的知識(shí)點(diǎn),為了讓學(xué)生更好地理解單鏈表的創(chuàng)建以及插入、刪除和查找結(jié)點(diǎn)等基本算法,筆者在Visual Studio 2012平臺(tái)使用C#語言實(shí)現(xiàn)以動(dòng)畫方式演示單鏈表算法,演示過程形象直觀,提高學(xué)生對(duì)單鏈表功能的理解。
單鏈表是一種鏈?zhǔn)酱嫒?、從前向后單向操作的?shù)據(jù)結(jié)構(gòu)。它用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素,鏈表中的數(shù)據(jù)元素以結(jié)點(diǎn)來表示。每個(gè)結(jié)點(diǎn)由數(shù)據(jù)域和指針域組成,數(shù)據(jù)域存儲(chǔ)結(jié)點(diǎn)表示數(shù)值,指針域存儲(chǔ)后續(xù)結(jié)點(diǎn)存儲(chǔ)位置的起始地址。
單鏈表存儲(chǔ)數(shù)據(jù)的優(yōu)勢一是存儲(chǔ)數(shù)據(jù)的個(gè)數(shù)不受限制,二是插入和刪除結(jié)點(diǎn)的操作比較簡單靈活,只需要修改幾個(gè)相關(guān)結(jié)點(diǎn)的指向關(guān)系。本文就以單鏈表插入結(jié)點(diǎn)操作為例,介紹、演示算法文章。
1? 設(shè)計(jì)思想
本動(dòng)畫演示如何按照從小到大的順序依次插入四個(gè)結(jié)點(diǎn),最終生成包含有四個(gè)結(jié)點(diǎn)的單鏈表。對(duì)于學(xué)生來說插入結(jié)點(diǎn)的規(guī)則非常容易理解,難點(diǎn)在于掌握算法代碼和理解代碼中各個(gè)指針功能。因此作者把算法代碼和演示動(dòng)畫置于同一個(gè)界面,播放動(dòng)畫時(shí)各種指針的移動(dòng)和結(jié)點(diǎn)的移動(dòng)等每一步動(dòng)畫演示都對(duì)應(yīng)一條代碼,動(dòng)畫演示過程就是程序代碼執(zhí)行的過程。
另外為了增加動(dòng)畫演示的互動(dòng)性,設(shè)置插入結(jié)點(diǎn)的數(shù)值可以由學(xué)生隨機(jī)輸入不同整數(shù),實(shí)現(xiàn)不同插入效果,提升了演示動(dòng)畫的通用性。
2? 演示界面設(shè)計(jì)
2.1? 整體界面設(shè)計(jì)
演示界面用三個(gè)分組控件(GroupBox)分成四個(gè)區(qū)域,界面功能分區(qū)清晰明了,如圖1所示。
(1)界面上方:按鈕操作區(qū)。
(2)界面左側(cè):代碼區(qū)。
(3)界面右側(cè):動(dòng)畫演示區(qū)。
(4)界面右下方:代碼注釋區(qū)。
2.2? 操作按鈕區(qū)
在操作按鈕區(qū)設(shè)置三個(gè)命令按鈕控件(Button)控制動(dòng)畫的播放、暫停、斷點(diǎn)續(xù)播、結(jié)束播放。為了界面簡潔減少了按鈕個(gè)數(shù),將前兩個(gè)按鈕設(shè)置成開關(guān)按鈕。
啟動(dòng)程序時(shí),第一個(gè)按鈕標(biāo)題為“播放動(dòng)畫”,點(diǎn)擊該按鈕播放動(dòng)畫后,標(biāo)題設(shè)置為“重新播放”;第二個(gè)按鈕初始標(biāo)題為“暫停動(dòng)畫”,當(dāng)點(diǎn)擊該按鈕暫停動(dòng)畫后,標(biāo)題設(shè)置為“繼續(xù)動(dòng)畫”;按鈕根據(jù)動(dòng)畫播放狀態(tài)分別在各自的兩個(gè)標(biāo)題間切換顯示。
2.3? 算法代碼區(qū)
算法代碼區(qū)顯示單鏈表從小到大插入結(jié)點(diǎn)的算法代碼。每條代碼以一個(gè)標(biāo)簽控件(Label)為載體,右側(cè)動(dòng)畫演示到某條對(duì)應(yīng)代碼時(shí),該條代碼就以明顯的紅色重點(diǎn)標(biāo)識(shí)提示學(xué)生。
2.4? 動(dòng)畫演示區(qū)
動(dòng)畫演示區(qū)以動(dòng)畫形式演示四個(gè)結(jié)點(diǎn)插入鏈表的過程。四個(gè)用戶自定義控件模擬結(jié)點(diǎn),四個(gè)標(biāo)簽控件(Label)模擬代碼中的指針h、s、p和q。
2.5? 代碼注釋區(qū)
對(duì)當(dāng)前動(dòng)畫對(duì)應(yīng)代碼做進(jìn)一步說明,讓學(xué)生能更好地理解代碼功能。
3? 算法設(shè)計(jì)
3.1? 主體算法設(shè)計(jì)
使用C#中進(jìn)程Thread與邏輯型變量flagcb和flagzt結(jié)合控制動(dòng)畫播放狀態(tài)。具體實(shí)現(xiàn)如表1所示。
利用if和while語句實(shí)現(xiàn)結(jié)點(diǎn)從小到大插入單鏈表。if語句判斷結(jié)點(diǎn)間的各種數(shù)值比較情況,在不同分支中調(diào)用結(jié)點(diǎn)移動(dòng)函數(shù)來移動(dòng)相應(yīng)結(jié)點(diǎn),實(shí)現(xiàn)插入排序。判斷和插入結(jié)點(diǎn)流程如圖2所示。
3.2? 演示結(jié)點(diǎn)的設(shè)計(jì)
在整個(gè)單鏈表插入結(jié)點(diǎn)的動(dòng)畫演示中,起到關(guān)鍵作用的是結(jié)點(diǎn)的設(shè)計(jì)。
3.2.1? 結(jié)點(diǎn)控件的設(shè)計(jì)
每個(gè)結(jié)點(diǎn)控件由五個(gè)Label控件組成,如果重復(fù)繪制工作量比較大。因?yàn)閱捂湵碇忻總€(gè)結(jié)點(diǎn)結(jié)構(gòu)都是相同的,本程序就利用了C#的自定義用戶控件功能,把五個(gè)Label控件組合成一個(gè)結(jié)點(diǎn)控件UserControl添加到Visual Studio 2012平臺(tái)工具箱中,這個(gè)控件和Visual Studio系統(tǒng)提供的內(nèi)部控件一樣可以重復(fù)使用,提高代碼開發(fā)效率。
3.2.2? 結(jié)點(diǎn)移動(dòng)的設(shè)計(jì)
單鏈表中結(jié)點(diǎn)的鏈接過程是動(dòng)態(tài)演示的,這就需要實(shí)現(xiàn)多次結(jié)點(diǎn)移動(dòng)。為了代碼簡潔、避免重復(fù),筆者編寫了結(jié)點(diǎn)控件的移動(dòng)方法。每次移動(dòng)結(jié)點(diǎn)時(shí),把移動(dòng)結(jié)點(diǎn)函數(shù)的參數(shù)分別設(shè)置為要移動(dòng)的結(jié)點(diǎn)控件名、起始位置、目標(biāo)位置即可。
例如,左右移動(dòng)一個(gè)結(jié)點(diǎn)的子函數(shù),代碼如下所示。設(shè)置了Control類型控件變量jd,水平移動(dòng)的起始位置xstart和目標(biāo)位置xend,垂直位置y,調(diào)用該函數(shù)時(shí)設(shè)置不同的參數(shù)值就可以實(shí)現(xiàn)不同結(jié)點(diǎn)任意位置的左右水平移動(dòng)。
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? 延遲函數(shù)的設(shè)計(jì)
為了動(dòng)畫演示速度合理,看起來更流暢,添加了延遲函數(shù),如下所示。每個(gè)結(jié)點(diǎn)移動(dòng)到一個(gè)新位置后暫停1 s。
private void delay(int mss)
{
DateTime t = DateTime.Now.AddMilliseconds(mss);
while (DateTime.Now < t)
Application.DoEvents( );
}
4? 舉例說明動(dòng)畫演示過程
下文以結(jié)點(diǎn)數(shù)值分別為3、8、5,按照小到大插入排序?yàn)槔?,說明動(dòng)畫執(zhí)行過程及效果。
(1)點(diǎn)擊“播放動(dòng)畫”按鈕啟動(dòng)動(dòng)畫。程序播放前動(dòng)畫演示區(qū)預(yù)設(shè)置的4個(gè)結(jié)點(diǎn)和h、s、p、q四個(gè)指針不顯示。
(2)執(zhí)行第一條語句,創(chuàng)建空的頭結(jié)點(diǎn)h(圖中其名稱為結(jié)點(diǎn)1)?!安シ艅?dòng)畫”按鈕變?yōu)椤爸匦虏シ拧?,“暫停?dòng)畫”按鈕變?yōu)椤袄^續(xù)動(dòng)畫”,為動(dòng)畫的暫停和續(xù)播做準(zhǔn)備,如圖3所示。
(3)繼續(xù)執(zhí)行后續(xù)代碼,因?yàn)楫?dāng)前只有頭結(jié)點(diǎn),頭結(jié)點(diǎn)h指向表尾NULL。遇到循環(huán)語句,執(zhí)行第一次循環(huán),給第2個(gè)結(jié)點(diǎn)(第一個(gè)數(shù)據(jù)結(jié)點(diǎn))輸入數(shù)值“3”,如圖4所示。
(4)輸入數(shù)據(jù)“3”后,點(diǎn)擊輸入對(duì)話框的“確定”按鈕,此時(shí)數(shù)字“3”顯示在結(jié)點(diǎn)2的數(shù)據(jù)域中,如圖5所示。指針q總是指向新結(jié)點(diǎn);指針p從單鏈表頭結(jié)點(diǎn)h開始,依次指向單鏈表中后續(xù)其他結(jié)點(diǎn),逐個(gè)和q指向的新結(jié)點(diǎn)比較,根據(jù)比較結(jié)果,新結(jié)點(diǎn)插入到相應(yīng)位置。
(5)存儲(chǔ)數(shù)值“3”的結(jié)點(diǎn)2是除了頭結(jié)點(diǎn)外的第2個(gè)結(jié)點(diǎn),則插入到頭結(jié)點(diǎn)和表尾標(biāo)志NULL中間,如圖6所示。
(6)第一個(gè)數(shù)值“3”(第2個(gè)結(jié)點(diǎn))插入到鏈表后,重復(fù)執(zhí)行for循環(huán),進(jìn)入循環(huán)后再次執(zhí)行輸入語句,給結(jié)點(diǎn)3輸入第2個(gè)數(shù)值“8”,此時(shí)結(jié)點(diǎn)3出現(xiàn)在動(dòng)畫演示區(qū)。
(7)指針s、p分別后移一個(gè)結(jié)點(diǎn),結(jié)點(diǎn)2的數(shù)值“3”小于結(jié)點(diǎn)3的數(shù)值“8”,表尾后移給結(jié)點(diǎn)3的插入留出空位,結(jié)點(diǎn)3插入到結(jié)點(diǎn)2和表尾標(biāo)志NULL中間,如圖7所示。
(8)輸入第4個(gè)結(jié)點(diǎn)的數(shù)值“5”。指針s和p重新指向頭結(jié)點(diǎn),再次從表頭開始后移,依次把鏈表中的結(jié)點(diǎn)2和結(jié)點(diǎn)3的數(shù)值和新結(jié)點(diǎn)比較,直到p指向的結(jié)點(diǎn)數(shù)值大于指針q指向的新結(jié)點(diǎn)的數(shù)值,指針s和p的后移才停止。
p指向的結(jié)點(diǎn)3數(shù)值“8”大于新結(jié)點(diǎn)4的數(shù)值“5”,結(jié)點(diǎn)3和表尾標(biāo)志NULL后移,給結(jié)點(diǎn)4空出插入的位置,結(jié)點(diǎn)4上移插入到結(jié)點(diǎn)2和結(jié)點(diǎn)3中間,如圖8所示。至此單鏈表結(jié)點(diǎn)插入操作結(jié)束。
5? 結(jié)? 論
在課堂上應(yīng)用單鏈表插入結(jié)點(diǎn)演示動(dòng)畫,減輕了教師上課負(fù)擔(dān)。另外演示動(dòng)畫過程中添加自行輸入結(jié)點(diǎn)數(shù)據(jù)的互動(dòng)功能,提高了學(xué)生的自主學(xué)習(xí)能力,讓學(xué)生加深了對(duì)單鏈表的功能理解。但該程序也有不足之處,一是鏈表結(jié)點(diǎn)個(gè)數(shù)固定,二是不能調(diào)整播放速度,今后可以在以上方面進(jìn)行改進(jìn)。
參考文獻(xiàn):
[1] 張?zhí)K新,談佳豪,周仕偉,等.氣動(dòng)控制最小系統(tǒng)實(shí)訓(xùn)裝置的設(shè)計(jì) [J].現(xiàn)代信息科技,2020,4(6):31-33.
[2] 李春葆.數(shù)據(jù)結(jié)構(gòu)教程:第5版 [M].北京:清華大學(xué)出版社,2017.
[3] 明日科技.C#項(xiàng)目開發(fā)實(shí)戰(zhàn)入門 [M].長春:吉林大學(xué)出版社,2017.
[4] 軟件開發(fā)技術(shù)聯(lián)盟.C#開發(fā)實(shí)例大全(提高卷) [M].北京:清華大學(xué)出版社,2016.
[5] 童晶.C語言課程設(shè)計(jì)與游戲開發(fā)實(shí)踐教程 [M].北京:清華大學(xué)出版社,2017.
作者簡介:蔣高飛(1973—),女,漢族,吉林長春人,副教授,碩士,研究方向:軟件工程。