第一篇:數據結構實驗教案
第一次實驗 線性表
(一)實驗目的和要求:
1.熟悉VC集成環境
2.會定義線性表的順序結構和鏈式結構
3.熟悉對線性表的基本操作,如插入、刪除等
(二)實驗內容和原理或涉及的知識點(綜合性實驗):
自己編寫程序實現線性表的建立、插入、刪除等功能。
寫出線性表、順序表、鏈表的定義,簡單寫出主要算法的思路。
(三)實驗條件:安裝有VC的計算機
(四)實驗設計方案
設計的順序表算法有: 1.初始化順序表 2.順序表的插入操作 3.順序表的刪除操作 設計的鏈表算法有: 1.建立鏈表
2.鏈表的插入操作 3.鏈表的刪除操作 4.鏈表數據元素的訪問
(五)實驗過程、數據和實驗結果記錄
程序代碼(略)
實驗過程中輸入/輸出數據、程序運行結果的記錄。(一定要有!)
第二次實驗 棧和隊列
(一)實驗目的和要求:
1.熟練掌握棧和隊列的結構,以及這種數據結構的特點 2.會定義順序棧、循環隊列,能實現棧、隊列的基本操作 3.會利用棧解決典型問題,如數制轉換等
(二)實驗內容和原理或涉及的知識點(綜合性實驗):
自己編寫程序實現棧(或者隊列)的各種基本操作,如初始化、入棧、出棧、判斷棧是否為空等
寫出棧的定義,簡單寫出主要算法的思路。
(三)實驗條件:安裝有VC的計算機
(四)實驗設計方案
設計的算法有: 1.初始化棧 2.入棧 3.出棧
4.判斷棧是否為空 5.十進制轉換為八進制
(五)實驗過程、數據和實驗結果記錄
程序代碼(略)
實驗過程中輸入/輸出數據、程序運行結果的記錄。(一定要有!)
第三次實驗 二叉樹
(一)實驗目的和要求:
1.熟練掌握二叉樹的結構,以及這種數據結構的特點 2.會定義二叉樹的鏈式存儲結構
3.能實現二叉樹的建立、遍歷等功能,需要完成先序遍歷、中序遍歷和后序遍歷遞歸算法
(二)實驗內容和原理或涉及的知識點(綜合性實驗):
自己編寫程序實現二叉樹的各種基本操作,如二叉樹的建立(頭插法或者尾插法),遍歷等 寫出二叉樹的定義,簡單寫出主要算法的思路。
(三)實驗條件:安裝有VC的計算機
(四)實驗設計方案
設計的算法有: 1.遞歸建立二叉樹 2.先序遍歷二叉樹 3.中序遍歷二叉樹 4.后序遍歷二叉樹
(五)實驗過程、數據和實驗結果記錄
程序代碼(略)
實驗過程中輸入/輸出數據、程序運行結果的記錄。(一定要有!)
第四次實驗
查找
(一)實驗目的和要求:
1.熟練掌握查找算法的基本思想,以及算法的適用條件
2.會定義靜態查找表的順序結構,能實現順序查找、二分查找
(二)實驗內容和原理或涉及的知識點(綜合性實驗):
自己編寫程序實現順序查找、二分查找。
寫出靜態查找表的定義,簡單寫出主要算法的思路。
(三)實驗條件:安裝有VC的計算機
(四)實驗設計方案
設計的算法有: 1.建立靜態查找表 2.順序查找
3.建立有序的靜態查找表 4.二分查找
(五)實驗過程、數據和實驗結果記錄
程序代碼(略)
實驗過程中輸入/輸出數據、程序運行結果的記錄。(一定要有!)
第二篇:數據結構實驗教案
實驗一 預備實驗
一、實驗項目的目的和要求:
1. 復習C語言指針的用法
2. 復習C語言結構體的用法 3. 理解時間復雜度分析的基本方法
二、實驗內容:
1.用指針方式編寫程序:從鍵盤輸入N個整型數據,并存入數組,要求將N個數中最大的數與第一個數交換;將其中最小的數最后一個數交換。
基本思想:設兩個指針分別指向最大數組元素和最小數組元素。再設一個移動指針從數組的第一個元素開始,依次與最大數組元素指針、最小數組元素指針的內容進行比較,作出相應的變化,一直到移動指針移到最后一個元素。
2.有N 個學生,每個學生的數據包括學號、姓名、三門課的成績、平均分。要求從鍵盤依次輸入N 個學生的學號、姓名、三門課的成績,自動計算三門課的平均分數,并將N 個學生的數據輸出。
基本思想:對每一名學生循環,再對三門課程循環求平均成績
三、實驗中存在的問題:
實驗二 線性表的基本操作
一、實驗項目的和要求:
1. 掌握線性表的特點
2. 掌握線性表的順序存儲結構和鏈式存儲結構的基本運算。3. 盡可能考慮算法的健壯性
4. 實驗報告中要寫出測試數據、錯誤分析以及收獲。
二、實驗內容一:線性表兩種存儲結構的基本運算
1.用結構體類型描述線性表的兩種存儲結構 2.完成課堂上所講的兩種存儲結構的基本運算 3.要求用二級菜單實現
***************************** * 1-------順序表 * * 2-------鏈 表 * * 0-------退 出 * *****************************
請輸入的選擇:(0-2):
線性表的鏈式存儲
## # 1----前插建立鏈表
# # 2----后插建立鏈表 # # 3----訪問第i個元素 # # 4----插入 # # 5----刪除 # # 6----求線性表的表長 # # 0----退出 #
## 請輸入選擇(0-6):
分析:1.使用循環建立菜單
2.使用switch語句進行選擇,執行相應的子函數(每一個運算編寫一個子函數)
實驗內容二:超市密碼存儲箱系統的設計與實現
1.顧客使用箱子的流程為“投一元硬幣”--------“找到一個空箱子,同時產生密碼”(系統完成)--------“打印密碼,打開箱子”(系統完成)--------“取密碼紙存包,并關閉箱子,入超市購物”--------“購物結束”--------“輸入密碼”--------“找到對應箱子并打開”(系統完成)--------“取包”。2.現要求設計程序模擬以上系統完成的功能
①界面:在我們的模擬系統中,箱子在屏幕上被畫出來,并編號,空箱為藍色,被使用時變成紅色,再變為空后則恢復藍色; ②通過按“1”鍵模擬顧客投幣;
③當空箱子被顧客申請得到的同時,系統自動生成6位數密碼,此密碼不能與正在被使用的任何一個箱子的密碼相同。3.設計分析
在設計時,可利用鏈表來組織所有的箱子,所有的箱子以結點的形式表示,結點中存放箱號、密碼(滿箱有,空箱無)以及指向下一個結點的指針。空箱結點放在一個鏈表1中,滿箱結點放在另一個鏈表2中。
若有顧客投幣(這里按下“1”鍵模擬),查看鏈表1是否為空,若為空,則顯示“箱滿,請稍侯!”,若非空,則取出一個結點,隨機產生一個六位數密碼,并將些密碼和鏈表2中所有結點的密碼相比較,若有重復,則再隨機產生一個新密碼,直到無重復;將密碼信息寫入此結點,并將其插入鏈表2;將此箱的顏色改為紅色。4.密碼箱的存儲結構類型定義 typedef struct node { int num;/*箱子的號碼*/ int password;/*箱子的密碼(滿箱有,空箱無)*/ struct node *next;/*指向下個結點的指針*/ }Node,*LinkList;
分析:1.初始化,建立一個代表空箱子鏈表,建立一個只有頭結點的實箱子鏈表.
2.如果想要存包時,就在空箱子鏈表中進行查找,如果為空,代表箱子已滿,否則從空箱子鏈表中刪除一個結點,并給它賦值,將該結點插入到實箱子鏈表中.
3.如果想要取包時,就輸入密碼,在實箱子鏈表中進行匹配,如果成功,就從實箱子鏈表中刪除相應的結點,插入到空箱子鏈表中.
4.另外還需要的函數有:隨意產生密碼函數,匹配密碼函數 實驗內容三:員工通訊錄管理系統
1.為某個單位建立一個員工通訊錄管理系統,可以方便地查詢每一個員工的辦公室電話號碼、手機號碼及電子郵箱。
2.現要求設計程序模擬以上系統完成的功能
其功能包括通訊錄鏈表的建立、員工通訊信息的查詢、修改、插入與刪除以及整個通訊錄表的輸出。3.設計分析
在本設計中,整個通訊錄可以采用順序表或鏈表方式存儲。采用前者,可以提高查詢速度;采用后者,可以提高插入與刪除記錄的效率。
4.員工通訊信息的結構類型定義和通訊錄鏈表的結點類型
typedef struct { char num[5];/*員工編號*/ char name[8];/*員工姓名*/ char phone[9];/*辦公室電話號碼*/ char call[12];/*手機號碼*/ }DataType;/*員工通訊信息的結構類型*/ typedef struct node { DataType data;/*結點的數據域*/ struct node *next;/*結點的指針域*/ }ListNode,*LinkList;/*通訊錄鏈表的結構類型*/ 分析:1.建立一個可循環的菜單
2.使用switch語句,調用子函數實現以下功能
針對每一位員工作為一個結點建立鏈表.
在該鏈表上進行查找、插入、刪除、修改及輸入/出。實驗內容四:運動會記分子系統或學生成績管理子系統
1.參加運動會的N個學校編號為1~N。比賽分成M個男子項目和W個女子項目,每個項目取前3名,得分分別為5,3,2。寫一個程序產生各種成績單和得分報表。2.完成功能包括如下:
①產生一總成績表,包括:學校編號名、男子團體總分、女子團體總分、團體總分 存儲結構要求用線性表的順序存儲。
②實驗報告中要寫出測試數據、錯誤分析以及收獲。
③若選擇學生成績管理子系統,可仿照運動會記分子系統完成相關的插入、刪除、查找及各種統計工作。
分析:1.分析順序表中每個元素的結構(數組元素是一個結構體)
2.建立順序表
3.在順序表進行插入、刪除、查找
4.進行統計 實驗中存在的問題:
實驗三 棧和隊列的應用
一、實驗目的和要求:
1. 掌握棧和隊列的概念和特點
2. 掌握棧和隊列在順序和鏈式存儲結構下的插入、刪除算法 3. 認真分析項目實例中的內容,將相關程序在計算機上運行實現
二、實驗內容一:表達式求值問題
1.求一個數學表達式的值:用戶輸入一個包含正整數、括號和四則運算符(“+”、“—”、“*”、“/”)的算術表達式,計算其結果。2.設計分析
首先置操作數棧為空棧,表達式起始符“#”為運算符棧底元素;依次讀入表達式中每個字符,若是操數則進操作數棧,若是操作符則和操作符棧頂的運算符進行比較優先權后作相應的操作,直到整個表達式求值完畢(即操作符棧頂元素和當前讀入的字符均為“#”)3.結點結構類型描述如下
typedef struct { char *base,*top;int stacksize;}sqstack;分析:1.判斷輸入的字符是否為數值
2.比較判斷運算符的優先級 3.何時結束循環,不再運算
實驗內容二:迷宮求解問題
1.迷宮是一個m行n列的矩陣,其中0表示無障礙,1表示有障礙。設入口為(1,1),出口為(m,n),即從入口出發,順某一方向向前探索,若能走通,則繼續往前走;否則 沿原路退回,換一個方向再繼續探索,直到出口為止。2.迷宮的功能
要求隨機生成一個m行n列的矩陣,為了操作方便可以在矩陣外圍生成一圏障礙,設置東南西北四個方向,采用鏈棧進行操作。最后迷宮如不是通路給出“此迷宮元解”,如是通路要求輸出所走過的路徑。3.結點結構類型描述如下
typedef struct node { int row;int col;
struct node *next;};分析:1.建立迷宮,使用二維數組,第一行/列,最后一行/列均初始化為0代表墻不通,這樣使其內部的元素均有四個方向進行統一判斷,其余元素進行隨機產生0代表不通,1代表通.
2.確定入口,出口的坐標.
3.判斷該元素是否可通(元素值等于1,一方面代表通,另一方面未走過). 4.標記每一個走過的元素,將其元素值加1.
5.元素的四個方向用0-3表示,下一個方向的坐標可以從當前坐標及方向就可以確定.
三、實驗中存在的問題:
實驗四
二叉樹兩種存儲結構的應用
一、實驗目的和要求:
1. 掌握二叉樹的遍歷思想及二叉樹的存儲實現。2. 掌握二叉樹的基本操作:建立二叉樹、二叉樹的遍歷 3. 選擇一種形式完成二叉樹的顯示 4. 掌握二叉樹的常見算法的程序實現
5. 實驗報告中要寫出測試數據、錯誤分析以及收獲
二、實驗內容一:二叉樹的建立及相關算法的實現
1.完成的功能包括如下幾點:
①編程實現建立一棵二叉樹,然后對其進行先序、中序和后序遍歷。
分析:將要輸入的二叉樹按照其對應的完全二叉樹的順序輸入,若當前位置不存在結點則輸入@
②顯示二叉樹
③求二叉樹的高度及二叉樹的葉子個數等等
④在主函數中設計一個簡單的菜單,分別調試上述算法
實驗內容二:哈夫曼編碼/譯碼系統
1.要求編寫一程序模擬傳輸過程,實現在發送前將要發送的字符信息進行編碼,然后進行發送,接收后將傳來的數據進行譯碼,即將信息還原成發送前的字符信息。2.設計分析
在本例中的算法主要有:哈夫曼樹的建立;哈夫曼編碼的生成;對編碼信息的翻譯。要求設置發送者和接收者兩個功能。
發送者的功能包括:
①輸入待傳送的字符信息;②統計字符信息中出現的字符類數和各字符出現的次數(頻率);③根據字符的種類數和各字符出現的次數建立哈夫曼樹;④利用以上哈夫曼樹求出各字符的哈夫曼編碼;⑤將字符信息轉換成對應的編碼信息進行傳送。接收者的功能包括:
①接收發送者傳送來的編碼信息;②利用上述哈夫曼樹對編碼進行翻譯,即將編碼信息還原成發送前的字符信息。3.結點的類型定義
①哈夫曼樹的存儲結構類型定義為:
typedef struct { char data;/*編碼對應的字符*/ int weight;/*結點的權值*/ int lchild,rchild,parent;/*左右孩子及雙親的下標*/ }HTNode;②哈夫曼編碼的存儲結構類型定義為: typedef struct { char bits[N];/*存放哈夫曼編碼的字符數組*/ int start;/*記錄編碼的起始位置,因為每種字符的編碼長度不同*/ }HCode;
三、實驗中存在的問題:
實驗五
圖子系統一、實驗目的和要求:
1.掌握圖的存儲思想及其存儲實現
2.掌握圖的深度、廣度優先遍歷算法思想及其程序實現 3.掌握圖的常見應用算法的思想及其程序實現
二、實驗內容一:圖的遍歷問題
1.鍵盤輸入以下結點數據:太原、成都、北京、上海、天津、大連、河北。建立一個有向圖或無向圖(自定)的鄰接表并輸出該鄰接表 2.在圖的鄰接表的基礎上計算各頂點的度,并輸出 3.以有向圖的鄰接表為基礎實現輸出它的拓撲排序序列 4.采用鄰接表存儲實現無向圖的深度優先遍歷 5.采用鄰接表存儲實現無向圖的廣度優先遍歷
6.采用鄰接矩陣存儲實現無向圖的最小生成樹的 PRIM 算法
7.在主函數中設計一個簡單的菜單,分別調試上述算法 實驗內容二:所有頂點對的最短路徑
1.設置4個村莊之間的交通,村莊之間的距離用各邊上的權值來表示。現在要求從這
4個村莊中選擇一個村莊建一所醫院,問這所醫院應建在哪個村莊,才能使離醫院最遠的村莊到醫院最近。2.設計分析
用有向加權圖表示的交通圖中,有向邊
typedef char vextype;/*頂點數據類型*/ typedef int edgetype;/*邊數據類型*/ typedef struct { vextype vex[maxsize];edgetype arc[maxsize][maxsize];int vexnum,arcnum;}Mgraph;
三、實驗中存在的問題:
實驗六 數據結構綜合性實驗
一、實驗目的和要求:
掌握小型系統開發方法,提高學生綜合開發能力。根據實際問題,設計方案,綜合運用課程知識,完成《學生成績管理系統》或《數據結構算法演示系統》的設計、編程與調試工作。
二、實驗內容一:
分析、調研數據結構課程所學的算法(功能模塊)或學生成績管理的相關功能模塊,采用結構化設計思想、模塊分解的規則構成一個易使用的小型管理系統。具體要求見《數據結構實驗》課程設計
實驗內容二:手機短信中電話號碼和手機號碼的識別與提取
1.在使用手機收發短信時,收到的短信內容中常會包含對方發來的電話號碼或手機號碼,為了方便用戶能直接提取其中的號碼并存入到其手機的通訊錄中,現要求開發手機系統軟件中的一個子功能,實現從手機短信內容中識別和提取電話號碼(7位或8位)和手機號碼(11位),并將其存入通訊錄中。2.設計分析
要從手機短信的內容中識別電話號碼或手機號碼,必須從短信的第一個字符開始查找,找到第一個數值型字符(‘0’~‘9’),然后依次判斷其后的字符,若其后有連續的6個或7個數值型字符,則將其識別成電話號碼并提取,若其后有連續的10個數值型字符,則將其識別成手機號碼并提取。繼續向后搜索直到整個短信查找完畢。3.存儲結構類型定義 ①短信的存儲結構類型定義
typedef struct { char word[200];/*短信內容*/ int length;/*短信長度*/ }Message;②通訊錄中記錄的存儲結構類型的定義
typedef struct { char name[8];/*姓名*/ char phone[11];/*電話號碼或手機號碼*/
}Note;實驗內容三:藥店的藥品銷售統計系統
1.設計一系統,實現醫藥公司定期對各藥品的銷售記錄進行統計,并按藥品編號、單價、銷售量或銷售額做出排序。2.設計分析
在設計中,首先從數據文件讀出各藥品的信息記錄,存儲在順序表中。各藥品的信息包括:藥品編號、藥品名稱、單價、銷售量、銷售額。其中藥品編號共4位,采用字母和數字混合編號,如:B125,前一位為大寫字母,后三位為數字。3.存儲結構類型定義
①藥品信息的存儲結構類型定義
typedef struct node { char num[4];/*藥品編號*/ char name[10];/*藥品名稱*/ float price;/*單價*/ int count;/*銷售量*/ float sale;/*銷售額*/ }DataType;②存儲藥品信息的順序表的定義
typedef struct { DataType r[maxsize];int length;}sequenList;實驗內容四:電視大賽觀眾投票及排名系統
1.在很多電視大賽中,通常當選手表演結束后,現場觀眾通過手中的按鍵對參賽選手進行投票,然后對選手獲得的票數進行統計,從高到低進行降序排列,從而自動產生冠軍、亞軍和季軍。現要求編寫一程序模擬實現上述系統的功能。2.設計分析
在本系統中,首先輸入參賽選手的人數(范圍為1-9個),然后根據人數通過malloc函數來開辟存放選手信息的順序表。將選手的編號和姓名依次存入順序表單元中,觀眾通過按鍵進行投票,按“1”表示為1號選手投票,按“2”表示為2號選手投票,依次類推。以按“0”作為投票結束標志。投票結束后進行排序。3.存儲結構類型定義
①選手信息的存儲結構類型定義
typedef struct node { char name[8];/*選手姓名*/ int num;/*選手編號*/ int score;/*選手得分*/ int tax;/*選手名次*/ }Node;②開辟空間用于構造存放選手信息的順序表R:R=(Node *)malloc(n*sizeof(Node));其中n 為參賽選手的人數,在此采用動態空間分配,而不是在開始時直接開辟靜態數組,這樣是為了避免空間的不足造成浪費。
在投票時,按“1”為1號選手投票的實現:
Scanf(“%c”,&k);/*觀眾按鍵*/ R[K-48].score= R[K-48].score+1;若觀眾輸入的是“1”,則“1”-48即為ASCII-48=1,因此可以實現對1號選手的票數加1,即R[1]=R[1]+1。其他選手類似。
第三篇:數據結構實驗課教案
授課教案
(2016—2017學第一學期)
課程名稱: 課程編碼: 總學時: 課程類別:
任課教師: 開課單位: 職稱: 授課專業: 授課班級:
數據結構 B13040009A 總學分: 專業課 李素若 計算機工程學院
教授 計算機科學與技術
2015級計算機科學與技術專業1、2班 授課進度第3周,第6次課(2學時)授課題目
(教學章、節實驗一線性表的順序存儲結構 或主題)
授課日期
016年9月14日(9 2
月13日)
.掌握線性表順序存儲結構的特點:邏輯上相鄰的數據元素其物理位置上也相鄰。1 2.掌握線性表順序存儲結構的插入、刪除操作特點移動操作。
教學
目標
1.線性表的順序存儲特點
教學 2.線性表的順序存儲的基本算法 重點
1.線性表的順序存儲的基本算法
教學 難點
請選擇你授課時所采用的教學方法(在括號中畫“√”):
講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發現法﹝﹞,探究法﹝﹞,教學
談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導法﹝﹞,練習
方法
法(習題或操作課)﹝√﹞,讀書指導法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業法﹝﹞,其他﹝﹞ 教學
實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本
手段
﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業
[ 1]李素若,陳萬華,游明坤主編.數據結構.北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數據結構習題集及上機指導.北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”):
參考
電出版社,2014.文獻
教學過程及內容
一、實驗內容
.輸入一組整型元素序列,建立順序表。1 2 .遍歷該順序表。3 .在該順序表中進行順序查找某一元素,查找成功返回1,否則返回0。.實現把該表中所有奇數排在偶數之前,即表的前面為奇數,后面為偶數。4 .判斷該順序表中元素是否對稱,對稱返回1,否則返回0。5 .輸入整型元素序列利用有序表插入算法建立一個有序表。6 .利用實驗6建立兩個遞增有序表并把它們合并成一個遞增有序表。7
二、實驗指導
1.參考程序為:
voidCreateSqList(SqList*L){ intn,i? do{ printf(“請輸入數據元素的個數:”)?
scanf(“%d”,&n)?
if(n<=0)printf(“輸入錯誤n”)? } while(n<=0)? for(i=0?i
} 2 .參考程序為:
voidPrintList(SqListL){ inti?
for(i=0?i intFindelems(SqListL,ElemTypee){ inti? for(i=0?i return0? } 4.分析:從順序表表頭開始掃描,當數據元素為偶數時就從該數開始往后查找,一旦 — 1— 教學過程及內容 找到奇數,則將該偶數與此奇數交換。順序表中所有數據全部掃描結束后,所有奇數就排列 在表的前端。參考程序為: voidChangeVal(SqList*L){ inti,j,temp? for(i=0?i if(L->elem[j]%2!=0){ temp=L->elem[i]? L->elem[i]=L->elem[j]? L->elem[j]=temp? break? } } if(j==L->length)break? } } } 5.參考程序為: intYesNo_Symmetry(SqListL){ inti,j? j=L.length-1? for(i=0?i return0? } return1? } 6 .參考程序為: voidInsert_OrderList(SqList*L,intx){ inti,j? for(i=0?i — 2— 教學過程及內容 L->elem[j+1]=L->elem[j]? L->elem[i]=x? L->length++? } voidCreate_OrderList(SqList*L){ intn,i,input? do{ printf(“請輸入數據元素的個數:”)? scanf(“%d”,&n)? if(n<=0)printf(“輸入錯誤n”)? while(n<=0)? } for(i=0?i Insert_OrderList(L,input)? } } 7 .參考程序為: SqList*Merge_OrderList(SqListA,SqListB)//將有序順序表A和B合并到有序順序表C中返回 { inti=0,j=0,k=0? SqList*C=(SqList*)malloc(sizeof(SqList))? C->length=0? while(j C->elem[i++]=A.elem[j++]? else C->elem[i++]=B.elem[k++]? } if(j==A.length) while(k } — 3— 授課進度第4周,第8次課(2學時)授課題目 (教學章、節實驗二單向鏈表 或主題) 授課日期 016年9月21日(9 2 月20日) .掌握線性鏈表的操作特點,即指針是邏輯關系的映像。1 .掌握動態產生單鏈表的方法。2 3 .熟練掌握單鏈表的插入、刪除操作特點,即指針賦值的先后次序。 教學 目標 1.掌握動態產生單鏈表的方法。 教學 2.熟練掌握單鏈表的插入、刪除操作特點,即指針賦值的先后次序。重點 1.熟練掌握單鏈表的插入、刪除操作特點,即指針賦值的先后次序。 教學 難點 請選擇你授課時所采用的教學方法(在括號中畫“√”): 講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發現法﹝﹞,探究法﹝﹞,教學 談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導法﹝﹞,練習 方法 法(習題或操作課)﹝√﹞,讀書指導法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業法﹝﹞,其他﹝﹞ 教學 實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本 手段 ﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業 [ 1]李素若,陳萬華,游明坤主編.數據結構.北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數據結構習題集及上機指導.北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”): 參考 電出版社,2014.文獻 教學過程及內容 一、實驗內容 .隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。1 .遍歷單向鏈表。2 3 .把單向鏈表中元素逆置(不允許申請新的結點空間)。.在單向鏈表中刪除所有的偶數元素結點。4 5 .編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數,并利用該函數建 立一個非遞減有序單向鏈表。 .利用實驗5建立兩個遞增有序單向鏈表,然后合并成一個遞增鏈表。6 7 .利用實驗1建立的鏈表,實現將其分解成兩個鏈表,其中一個全部為奇數,另一個 全部為偶數(盡量利用已知的存儲空間)。 二、實驗指導 1.參考程序為: LinkListCreateListH(void)//頭插法產生帶頭結點單鏈表 { intch? LinkListhead=(LinkList)malloc(sizeof(LNode))? LinkLists? head->next=NULL? while(scanf(“%d”,&ch)==1)//輸入數據類型錯誤時結束單鏈表的生成 { s=(LinkList)malloc(sizeof(LNode))? s->data=ch? s->next=head->next? head->next=s? } returnhead? } LinkListCreateListRand(void)//利用隨機函數產生帶頭結點單鏈表(頭插法){ intch,i? LinkListhead=(LinkList)malloc(sizeof(LNode))? LinkLists? head->next=NULL? srand((unsigned)time(NULL))? printf(“PleaseinputCreateNnmbers:”)? scanf(“%d”,&ch)? for(i=0?i s->data=rand()%50?//隨機產生0~49之間的數 — 1— 教學過程及內容 s->next=head->next? head->next=s? } returnhead? } 2 .參考程序為: voidPrintLinkList(LNodeL){ LinkListp? p=L.next? while(p){ printf(“%d”,p->data)? p=p->next? } printf(“n”)? } 3.參考程序為: voidInverse_set(LinkListhead){ LNode*r,*m=NULL,*p? p=head->next? while(p!=NULL){ r=m?m=p? p=p->next? m->next=r? } head->next=m? } 4.參考程序為: voidDelEvenLinkList(LinkListhead){ LinkListq,p? p=head->next? q=head? while(p){ if(p->data%2==0){ q->next=p->next? free(p)? — 2— 教學過程及內容 p=q->next? } else { q=p? p=p->next? } } } 5 .參考程序為: voidInsertIncr(LinkListhead,ElemTypex)//將結點插入遞增的單鏈表 { LinkListq,p,s? s=(LinkList)malloc(sizeof(LNode))? s->data=x? q=head? p=head->next? while(p&&p->data p=p->next? } s->next=q->next? q->next=s? } LinkListCreateListIncr(void)//通過調用插入有序鏈表函數生成遞增單鏈表 { intch? LinkListhead=(LinkList)malloc(sizeof(LNode))? LinkLists? head->next=NULL? while(scanf(“%d”,&ch)==1)//輸入數據類型錯誤時結束單鏈表的生成 InsertIncr(head,ch)? returnhead? } 6 .參考程序為: LinkListLinkListCat(LinkListhead1,LinkListhead2){ LinkListh1,h2,h? LinkListhead=(LinkList)malloc(sizeof(LNode))? head->next=NULL? — 3— 教學過程及內容 h1=head1->next? h2=head2->next? h=head? while(h1&&h2){ if(h1->data h1=h1->next? } else { h->next=h2? h=h->next? h2=h2->next? } } if(h1)h->next=h1? if(h2)h->next=h2? returnhead? } 7 .參考程序為: # include voidPrintLinkList(LNodeL){ LinkListp? p=L.next? while(p){ printf(“%d”,p->data)? p=p->next? — 4— 教學過程及內容 } printf(“n”)? } voidDecoLinkList(LNodehead,LinkListhead1,LinkListhead2)//將單鏈表head拆分奇數鏈head1和偶數鏈head2 { LinkListh,h1,h2? h=head.next? h1=head1? h2=head2? while(h){ if(h->data%2==0){ h2->next=h? h=h->next? h2=h2->next? } else { h1->next=h? h=h->next? h1=h1->next? } } h1->next=NULL? h2->next=NULL? } main(){ LinkListhead? LinkListhead1=(LinkList)malloc(sizeof(LNode))? LinkListhead2=(LinkList)malloc(sizeof(LNode))? head=CreateListIncr()? PrintLinkList(*head)? DecoLinkList(*head,head1,head2)? PrintLinkList(*head1)? PrintLinkList(*head2)? } — 5— 授課進度第5周,第10次課(2學時)授課題目 (教學章、節實驗三棧的存儲及基本運算 或主題) 授課日期 016年9月28日(9 2 月27日) .掌握棧這種數據結構特性及其主要存儲結構,并能在現實生活中靈活運用。1 2.了解和掌握遞歸程序設計的基本原理和方法。 教學 目標 .掌握棧的兩種存儲結構 1.棧的基本運算 教學 2.了解棧在遞歸函數中的作用 重點 3.掌握棧的兩種存儲結構 1 教學 2.棧的基本運算 難點 請選擇你授課時所采用的教學方法(在括號中畫“√”): 講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發現法﹝﹞,探究法﹝﹞,教學 談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導法﹝﹞,練習 方法 法(習題或操作課)﹝√﹞,讀書指導法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業法﹝﹞,其他﹝﹞ 教學 實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本 手段 ﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業 [ 1]李素若,陳萬華,游明坤主編.數據結構.北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數據結構習題集及上機指導.北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”): 參考 電出版社,2014.文獻 教學過程及內容 一、實驗內容 .采用順序存儲實現棧的初始化、入棧、出棧操作。1 2 .采用鏈式存儲實現棧的初始化、入棧、出棧操作。3 .寫一個程序,將輸入的十進制數據M轉換為八進制數據M8,將其調試通過。在此 基礎上修改程序,實現十進制數據M向N進制(2或8或16)的轉換。(1)采用順序存儲結構實現棧。(2)采用鏈表結構實現棧。 二、實驗指導 .參考程序為: 1 # include //用來存放棧中元素的一維數組 //用來存放棧頂元素的下標 } SqStack? intInitStack(SqStack**s)//初始化順序棧 {(*s)=(SqStack*)malloc(sizeof(SqStack))? if((*s)==NULL)returnERROR?(*s)->top=-1? returnOK? } intEmptyStack(SqStacks)//判斷棧空 { if(s.top==-1) { printf(“stackisempty!n”)? returnOK? } returnERROR? } intGetTop(SqStacks,int*e)//取棧頂元算 { if(EmptyStack(s))returnERROR? *e=s.elem[s.top]? — 1— 教學過程及內容 returnOK? } intPush(SqStack*s,inte)//入棧 { if(s->top==Stack_Size-1) { printf(“stackisfull!n”)? returnERROR? } s->top++? s->elem[s->top]=e? returnOK? } voidPrintStack(SqStacks)//打印棧中數據 { inti? for(i=0?i<=s.top?i++)printf(“%d”,s.elem[i])? printf(“n”)? } intPop_Stack(SqStack*s,int*e)//出棧 { if(EmptyStack(*s)) returnERROR? *e=s->elem[s->top]? s->top--? returnOK? } voidmain(){ intcord,e,x,y? SqStack*s? do { printf(“nMainMenun”)? printf(“1----CreatStackn”)? printf(“2----GetTopElementn”)? printf(“3----Pushn”)? printf(“4----Popn”)? printf(“5----Printn”)? printf(“6----quitn”)? scanf(“%d”,&cord)? — 2— 教學過程及內容 switch(cord){ case1: InitStack(&s)? break? case2: if(GetTop(*s,&y)) printf(“StackTop=[%d]n”,y)? break? case3: printf(“Pleaseinputpushelement:”)? scanf(“%d”,&e)? Push(s,e)? break? case4: if(Pop_Stack(s,&x)) printf(“Popstack=[%d]n”,x)? break? case5: PrintStack(*s)? break? case6: return? } } while(cord<=6)? } 2 .參考程序為: include structstacknode*next? } StackNode? typedefstruct { StackNode*top?/*棧頂指針*/ LinkStack? } — 3— 教學過程及內容 voidInitStack(LinkStack*s)//初始化棧 { s->top=NULL? } intEmptyStack(LinkStacks)//判斷棧空 { if(s.top==NULL)returnOK? elsereturnERROR? } intGetTop(LinkStacks,int*e)//取棧頂元素 { if(EmptyStack(s))returnERROR? *e=s.top->data? } voidPush(LinkStack*s,inte)//入棧 { StackNode*p=(StackNode*)malloc(sizeof(StackNode))? p->data=e? p->next=s->top? s->top=p? } intPop_Stack(LinkStack*s,int*e)//出棧 { StackNode*p? if(EmptyStack(*s))returnERROR? p=s->top? *e=p->data? s->top=p->next? free(p)? returnOK? } voidPrintStack(LinkStacks)//打印棧中元素 { StackNode*p=s.top? while(p){ printf(“%d”,p->data)? p=p->next? } } voidmain() — 4— 教學過程及內容 { intcord,e,x,y? LinkStacks? do { printf(“nMainMenun”)? printf(“1----CreatStackn”)? printf(“2----GetTopElementn”)? printf(“3----Pushn”)? printf(“4----Popn”)? printf(“5----Printn”)? printf(“6----quitn”)? scanf(“%d”,&cord)? switch(cord){ case1: InitStack(&s)? break? case2: if(GetTop(s,&y)) printf(“StackTop=[%d]n”,y)? break? case3: printf(“Pleaseinputpushelement:”)? scanf(“%d”,&e)? Push(&s,e)? case4: break? if(Pop_Stack(&s,&x)) printf(“Popstack=[%d]n”,x)? break? case5: PrintStack(s)? break? case6: return? } } while(cord<=6)? } 3 .參考程序為: 1)(— 5— 教學過程及內容 voidConversion(SqStack*S){ intN,n1,t? printf(“輸入一個十進制數字:n”)? scanf(“%d”,&N)?//輸入一個十進制數字 printf(“輸入要轉換的n進制數字(2、8、16):n”)? scanf(“%d”,&n1)?//輸入要轉換的進制 while(N){ Push(S,N%n1)? N=N/n1? } printf(“該數轉化為%d進制數為:t”,n1)? if(n1==16){ while(!EmptyStack(*S)){ Pop_Stack(S,&t)? if(t==10){printf(“A”)?continue?} if(t==11){printf(“B”)?continue?} if(t==12){printf(“C”)?continue?} if(t==13){printf(“D”)?continue?} if(t==14){printf(“E”)?continue?} if(t==15){printf(“F”)?continue?} printf(“%d”,t)? } } else PrintStack(*S)? } voidmain(){ SqStack*S? InitStack(&S)? Conversion(S)? }(2) voidConversion(LinkStack*S){ intN,n1,t? printf(“輸入一個十進制數字:n”)? scanf(“%d”,&N)?//輸入一個十進制數字 — 6— 教學過程及內容 printf(“輸入要轉換的n進制數字(2、8、16):n”)? scanf(“%d”,&n1)?//輸入要轉換的進制 while(N){ Push(S,N%n1)? N=N/n1? } printf(“該數轉化為%d進制數為:t”,n1)? if(n1==16){ while(!EmptyStack(*S)){ Pop_Stack(S,&t)? if(t==10){printf(“A”)?continue?} if(t==11){printf(“B”)?continue?} if(t==12){printf(“C”)?continue?} if(t==13){printf(“D”)?continue?} if(t==14){printf(“E”)?continue?} if(t==15){printf(“F”)?continue?} printf(“%d”,t)? } } else PrintStack(*S)? } voidmain(){ LinkStackS? InitStack(&S)? Conversion(&S)? } — 7— 授課進度第8周,第14次課(2學時)授課題目 (教學章、節實驗四隊列 或主題) 授課日期 016年10月19日(10 2 月18日) .掌握隊列這種數據結構的邏輯特性及其主要存儲結構。1 2.在簡單情況下會使用順序結構的實現隊列,熟練掌握循環隊列的使用。.在復雜情況下會使用鏈表結構的隊列,并能在現實生活中靈活運用。3 教學 目標 1.熟練掌握循環隊列的使用。 教學 2.在復雜情況下會使用鏈表結構的隊列。重點 1.鏈隊列的使用。 教學 難點 請選擇你授課時所采用的教學方法(在括號中畫“√”): 講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發現法﹝﹞,探究法﹝﹞,教學 談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導法﹝﹞,練習 方法 法(習題或操作課)﹝√﹞,讀書指導法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業法﹝﹞,其他﹝﹞ 教學 實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本 手段 ﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業 [ 1]李素若,陳萬華,游明坤主編.數據結構.北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數據結構習題集及上機指導.北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”): 參考 電出版社,2014.文獻 教學過程及內容 一、實驗內容 .采用順序存儲實現循環隊列的初始化、入隊、出隊操作。1 2 .采用鏈式存儲實現隊列的初始化、入隊、出隊操作。3 .編寫一個程序,使用兩個鏈隊q1和q2,用來分別存儲由計算機隨機產生的20個 100以內的奇數和偶數,然后每行輸出q1和q2的一個值,即奇數和偶數配對輸出,直到任 一隊列為空為止。 二、實驗說明 .循環隊列類型采用如下結構: 1 defineMAXSIZE100//最大隊列長度 # typedefintElemType? typedefstruct{ ElemTypedata[MAXSIZE]? intfront,rear?//隊頭、隊尾指針 SqQueue? } .鏈隊類型采用如下結構: 2 typedefstructQNode { ElemTypedata? structQNode*next? QNode,*QueuePtr? } typedefstruct { QueuePtrfront? QueuePtrrear? LinkQueue? } 三、實驗指導 1.參考程序為: intInitQueue(SqQueue**Q)//初始化循環隊列 { * Q=(SqQueue*)malloc(sizeof(SqQueue))? if(!(*Q)) return0? *Q)->front=(*Q)->rear=0?(return1? } intQueueEmpty(SqQueueQ)//判斷隊空 { returnQ.front==Q.rear? } — 1— 教學過程及內容 intQueueFull(SqQueueQ)//判斷隊滿 { return(Q.rear+1)%MAXSIZE==Q.front? } intEnQueue(SqQueue*Q,ElemTypee)//入隊操作 { if(QueueFull(*Q)) /隊列滿 return0? /Q->data[Q->rear]=e? Q->rear=(Q->rear+1)%MAXSIZE? return1? } intDeQueue(SqQueue*Q,ElemType*e)//出隊操作 { if(QueueEmpty(*Q))return0? else { *e=Q->data[Q->front]? Q->front=(Q->front+1)%MAXSIZE? return1? } } 2 .參考程序為: intInitQueue(LinkQueue*Q)//將Q初始化為一個空的鏈隊列 { Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode))? if(Q->front==NULL) return0? Q->front->next=NULL? return1? } intQueueEmpty(LinkQueueQ)//判斷隊空 { returnQ.front==Q.rear? } intEnQueue(LinkQueue*Q,ElemTypee)//入隊操作 { QueuePtrp? p=(QueuePtr)malloc(sizeof(QNode))? if(!p) return0? — 2— 教學過程及內容 p->data=e? p->next=NULL? Q->rear->next=p? Q->rear=p? return1? } intDeQueue(LinkQueue*Q,ElemType*e)//出隊操作 { QueuePtrp? if(QueueEmpty(*Q))return0?//若隊列Q為空隊列 p=Q->front->next? *e=p->data? Q->front->next=p->next? if(Q->rear==p) Q->rear=Q->front?//若Q只有一個結點 free(p)? return1? } 3 .參考程序為: intmain(){ LinkQueueq1,q2? inti=0,j=0,num? InitQueue(&q1)? InitQueue(&q2)? srand((unsigned)time(NULL))? while(i<20||j<20){ num=rand()%100? if(num%2==0&&i<20){ EnQueue(&q1,num)? i++? } if(num%2!=0&&j<20){ EnQueue(&q2,num)? j++? } } while(!QueueEmpty(q1)&&!QueueEmpty(q2)) — 3— 教學過程及內容 { DeQueue(&q1,&i)?DeQueue(&q2,&j)? printf(“%3d%3dn”,i,j)? } free(q1.front)? free(q2.front)? return0? } — 4— 授課進度 授課題目 第9周,第16次課(2學時)授課日期 016年10月26日(10 2 月25日) (教學章、節實驗五二叉樹(Ⅰ)或主題).掌握二叉樹的存儲實現。1 .掌握二叉樹的遍歷思想。2 教學 目標 .掌握二叉樹的存儲實現。1 .掌握二叉樹的遍歷思想。教學 2 重點 1.掌握二叉樹的遍歷思想。 教學 難點 請選擇你授課時所采用的教學方法(在括號中畫“√”): 講授法﹝﹞,討論法﹝﹞,演示法﹝﹞,案例法﹝﹞,發現法﹝﹞,探究法﹝﹞,教學 談話法﹝﹞,實驗法﹝√﹞,參觀法﹝﹞,考察法﹝﹞,自學輔導法﹝﹞,練習 方法 法(習題或操作課)﹝√﹞,讀書指導法﹝﹞,聽說法﹝﹞,寫生法﹝﹞,視唱 法﹝﹞,工序法(技能課)﹝﹞,實習作業法﹝﹞,其他﹝﹞ 教學 實物﹝﹞,多媒體﹝﹞,投影﹝﹞,影像﹝﹞,CAI課件﹝﹞,PPT﹝√﹞,標本 手段 ﹝﹞,掛圖﹝﹞,模型﹝﹞,其他﹝﹞ 討 論、思考 題、作業 [ 1]李素若,陳萬華,游明坤主編.數據結構.北京:中國水利水電出版社,2014.[ 2]李素若,陳萬華,游明坤主編.數據結構習題集及上機指導.北京:中國水利水 請選擇你授課時所采用的教學手段(在括號中畫“√”): 參考 電出版社,2014.文獻 教學過程及內容 一、實驗內容 1.數據域為字符的一棵二叉樹用廣義表形式輸入,創建一個采用二叉鏈表存儲的二叉 樹,并按廣義表的形式輸出這棵二叉樹。 .在實驗1的基礎上完成這棵二叉樹的中序遍歷的遞歸算法。2 .在實驗1的基礎上完成這棵二叉樹的中序遍歷的非遞歸算法。3 二、實驗指導 .參考代碼為: 1 # defineMaxSize100 voidCreateBTNode(BTree*b,char*str)//廣義表形式輸入二叉樹,按二叉鏈表存儲二叉樹 { BTNode*St[MaxSize],*p=NULL? inttop=-1,k,j=0? charch? *b=NULL? ch=str[j]? while(ch!='
主站蜘蛛池模板:
国产卡一卡二卡三无线乱码新区|
一本加勒比hezyo无码人妻|
国产成久久免费精品av片|
亚洲欧洲无码一区二区三区|
久碰人妻人妻人妻人妻人掠|
国产普通话对白刺激|
av无码国产在线观看岛国|
久久99精品久久久久久蜜芽|
暖暖视频日本在线观看|
精品国内自产拍在线观看视频|
久久人人97超碰a片精品|
日产精品99久久久久久|
无码人妻黑人中文字幕|
大香伊蕉在人线国产免费|
亚洲处破女av日韩精品波波网|
中国亚洲女人69内射少妇|
无码精品a∨在线观看十八禁|
中国女人内谢69xxxx免费视频|
久久亚洲私人国产精品|
国产精品无码素人福利免费|
国内精品伊人久久久久影院对白|
亚洲综合色区另类av|
国产乱子乱人伦电影在线观看|
中文字幕日韩精品亚洲一区|
精品香蕉久久久午夜福利|
乱人伦人妻中文字幕无码|
狠狠躁天天躁中文字幕|
日韩少妇激情一区二区|
亚洲AV无码秘?蜜桃蘑菇|
亚洲va久久久噜噜噜久久4399|
亚洲色欲在线播放一区二区三区|
欧美三级乱人伦电影|
大地资源中文第二页日本|
日本精品人妻无码免费大全|
精品国产_亚洲人成在线|
97夜夜澡人人双人人人喊|
国产成人无码av在线播放dvd|
一本一道中文字幕无码东京热|
亚洲成色www久久网站夜月|
亚洲欧美日韩国产手机在线|
性欧美大战久久久久久久|