


摘? 要:在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—),女,漢族,吉林長春人,副教授,碩士,研究方向:軟件工程。