使用說明:
- 每次實驗都有相應的實驗文件,請先下載,如數據結構-實驗文件-01。
- 標明“可選、選做、特別加分”都是選做。有做“特別加分”的同學請練習老師加分。
一. 入門
1. 數據結構入門
1.1 CodeBlocks的使用(或直接使用DEV C++、Visual Studio)
目標:
學會使用CodeBlocks創建項目、編寫程序、掌握常用快捷鍵。
參考資料:
1.2 C++語言基礎
學習目標:
- C++中的cin、cout
- typedef, #define
- 引用參數(&)基本概念,使用引用參數的時機(函數內對引用參數修改影響到函數外, 結構體作為函數參數)
- new與delete
難點:
多文件操作:頭文件、include不懂。
任務:
0. C++版的HelloWorld
- 使用引用參數改寫
void swap1(int a, int b)
->void swap(int &a, int &b)
->再測試void swap(int a, int &b)
。 - 三種創建復數的方法(單文件)。見complex(復數三種傳遞方法參考代碼).cpp。
- 考核:三元組(多文件操作)。見TripletTest(三元組參考源代碼)。
- 其他:林麗老師的抽象數據類型作業,DS博客作業01--日期抽象數據類型設計與實現
參考資料:
1.實驗任務書:數據結構-實驗文件-01
2.Visual Studio 2019/2017 安裝使用教程(快速上手版),包含“運行閃退”的處理方法
3.C++面向過程編程,主要講解C++相較於C新增的一些特性。
4.多文件的C語言系統示例
5.使用Visual Studio Code開發(編譯、調試)C++程序
6.原創:C++指針速記
2. Git入門(有時間再講)
目標:
- 學會使用碼雲網頁版存儲代碼。
- 進階:學會使用命令行下的Git。
任務:
到碼雲注冊賬號,建立自己的代碼倉庫並規划好目錄結構(chpt01-introduction, chpt02-linearlist...)
進階任務:
- 創建遠程倉庫並clone到本地。
- 規划好自己的目錄結構,push到遠程倉庫。
- 在宿舍學會使用clone與pull。
參考資料:
二.線性表
1. 順序表
目標:
熟悉順序表的定義及其上的常用操作。
任務:
- PTA-區間刪除
- 使用typedef定義List與SqList類型
- 基本考核:CreateList、DispList。
- 指導:指導學生逐步完成CreateList再完成DispList。確認無誤的基礎上,再完成刪除區間元素。
- 刪除區間元素
- PTA-順序表插入
參考代碼:
順序表定義
#define MaxSize 100000
using namespace std;
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize]; //存放順序表元素
int length ; //存放順序表的長度
} List;
typedef List *SqList;
2. 鏈表
目標:
- 熟悉鏈表的定義及其上的常用操作
任務: - 手動創建鏈表(基礎中的基礎,重點掌握)
- 創建頭結點(LinkList head),然后創建3個節點(LNode* n1,n2,n3),然后將這些節點連成一個鏈表(head->n1->n2->n3)
- 編寫
void DispLinkList(LinkList linklist)
,使用while
遍歷輸出剛才手動創建的鏈表。
- PTA-頭插法、尾插法創建鏈表
- 定義輸出鏈表函數、定義創建鏈表函數。PTA考核。
- 尾插法:定義q指針變量,指向上一次插入的節點。PTA考核。
- 銷毀鏈表(看懂)
- PTA-單鏈表逆置
- PTA-有序鏈表的插入刪除
難點:
部分學生對於指針變量指向某個節點沒有直觀認識。不能將移動指針操作轉化為代碼,也不能從代碼看出其對應的指針移動、指向操作。
參考資料:
單鏈表定義
typedef int ElemType;
typedef struct LNode //定義單鏈表結點類型
{
ElemType data;
struct LNode *next; //指向后繼結點
} LNode, *LinkList;
3. 棧和隊列
目標:
- 掌握棧和隊列的基本存儲結構
- 熟練掌握棧和隊列的基本使用
- 熟悉棧和隊列的一些典型應用
任務:
-
使用順序存儲結構來實現棧的基本操作。
- PTA函數題:另類堆棧、在一個數組中實現兩個堆棧(可選:考研)
-
學會使用STL中的stack、queue與string見參考資料Stack與Queue代碼。完成實驗任務書中的題目1—C++中的stack和queue(考核)。
-
PTA編程題:字符串是否對稱(考核)、符號配對(考核)、表達式轉換-中綴轉后綴(考核)
-
可選:使用stack實現數制轉換。
-
遞歸
5.1 遞歸程序編寫(自行完成,實驗課考核加分)
題目:已知f為單鏈表的表頭指針, 鏈表中存儲的都是整型數據,試寫出實現下列運算的遞歸算法:
① 求鏈表中的最大整數;
② 求鏈表的結點個數;
③ 求鏈表中所有節點數據的平均值。
5.2 使用stack將以下遞歸程序轉化為非遞歸程序void test(int &sum) { int x; cin>>x; if (x==0) sum = 0; else { test(sum); sum+=x; } cout<<sum; }
-
隊列相關應用:完成銀行業務隊列簡單模擬(PTA-編程)、舞伴問題(PTA-函數)、
使用隊列打印楊輝三角(可選)。 -
可選:OJ上的題目(使用隊列對撲克牌排序、走迷宮、括號匹配);PTA題目(另類循環隊列-函數)。
-
特別加分:使用遞歸或者隊列實現對指定目錄名及文件名進行文件查找(可使用C、C++、Python、Java實現)。並發一個簡單博客描述該問題解決過程。
參考資料:
棧與隊列實驗任務書、Stack與Queue代碼、string參考代碼、遞歸實驗模板
Python3不完全入門指南
Python文件系統功能
4.字符串
試驗任務書:
- 第一題-拼接字符串(身份證)。實驗課檢查。
- 選做:最后一題特別加分(判斷是否是數字)。實驗任務書其他題目
PTA:
- jmu-ds-簡單密碼
- 選做:jmu-ds-最長數字序列、jmu-ds-最長公共子串、jmu-ds-實現KMP
參考資料:
三.樹
目標:
學會創建樹,熟練掌握樹的遞歸結構及在其上的遞歸算法,二叉樹的基本操作,哈夫曼樹,樹的應用。
參考代碼:
typedef struct BiTNode {
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
標*的為課上講解。其他為課后完成。
任務:
0. *手動創建一顆二叉樹,並對其進行先序、中序與后序遍歷。樹圖如下。
- *使用前序串創建樹,然后對其進行前、中、后序遍歷。PTA(編程):前序序列創建二叉樹。
- *樹的遞歸結構。PTA(函數):先序輸出葉結點、求二叉樹高度。
- 樹的應用。PTA(函數):表達式樹。
- *隊列應用(編程)。PTA:二叉樹層次遍歷(廣度優先)。
- 先序、中序、后序確定樹。PTA(編程):還原二叉樹、根據后序和中序遍歷輸出先序遍歷。
- *二叉樹的應用:二叉排序樹。給定一串50 30 80 20 40 90 10 25 35 85 23 88創建二叉排序樹並進行搜索。
- *樹的應用(可選,簡單講解):PTA(編程):目錄樹(使用兄弟鏈,綜合使用了樹結構與鏈表結構)。
- 二叉樹的應用(可選):哈夫曼樹。PTA(編程):二叉樹葉子結點帶權路徑長度和、修理牧場。
- 樹的應用(可選):並查集。PTA(編程):朋友圈、家譜處理。
- 繪制二叉樹(可選):使用EasyX繪制二叉樹。
- 其他(可選):如下所示
二叉樹既可以用鏈式結構存儲也可以用順序結構存儲,嘗試編寫兩個算法,實現以下兩個功能:
1.將鏈式結構存儲的二叉樹轉化成順序結構存儲。
2.將順序結構存儲的二叉樹轉化成鏈式結構存儲。
第2次實驗課任務:
- 課前准備:
- 使用代碼對先序字符串
ABC**DE*G**F**HI**J**
建立的鏈式二叉樹。寫出層序遍歷的偽代碼。 - 學會使用queue進行編碼。看:給學生-queue.txt
- 使用代碼對先序字符串
- 實驗課完成:
- 層序遍歷二叉樹。層次遍歷“課前准備1”建立的鏈式二叉樹。層序遍歷輸出為
ABHCDIJEFG
,請自行驗證。 - 目錄樹(簡單講解思路)。使用怎樣的數據結構來存儲這棵樹?字典排序怎么實現(可使用string的compare函數,或直接使用>、=、<等比較運算符)?
- 二叉排序樹。嘗試完成創建、查找。思考:如何刪除、
- 層序遍歷二叉樹。層次遍歷“課前准備1”建立的鏈式二叉樹。層序遍歷輸出為
參考資料:
四.查找與排序
目標:
學會基本的查找與排序算法,學會將哈希表應用於快速查找、統計等。
任務:
查找
包括:基本查找、二分查找、二叉排序樹、哈希(map的使用)
1.熱身:
實現二叉排序樹(實驗課前在發布互評作業,實驗課上學生展示)
可選:
- 二叉搜索樹(OJ):http://jmunetds.openjudge.cn/ex5/901/
- 二叉搜索樹的節點刪除(OJ):http://jmunetds.openjudge.cn/ex5/902/
2.PTA函數題:
- "是否二叉搜索樹"(利用BST的遞歸定義)
- "二叉搜索樹中的最近公共祖先"(利用BST的遞歸定義、利用BST左小右大或左大右小的特性)
3.PTA編程題:
- QQ帳戶的申請與登(哈希,map)
- 航空公司VIP客戶查詢(哈希鏈)
- 基於詞頻的文件相似度(map)
排序題集中的“統計工齡”很適合演示map的使用。
4.可選(OJ):
- 905詞典(map):http://jmunetds.openjudge.cn/ex5/905/
- 倒排索引: http://jmunetds.openjudge.cn/ex07/T001/
- 倒排索引查詢: http://jmunetds.openjudge.cn/ex07/T002/
5.其他(OJ):
- 集合運算:http://jmunetds.openjudge.cn/ex5/907/
- 正方形:http://jmunetds.openjudge.cn/ex5/909/
- 發現它,抓住它: http://jmunetds.openjudge.cn/ex5/911/
排序
包括:基本排序、快排、堆排。
自行完成PTA:
- 5-1(鏈表冒泡排序)、5-2(另類排序-每趟找出最大與最小)
- 6-1(冒泡排序)
課堂任務PTA:
- 統計工齡(提前完成,)
- 本質上是一個查找問題。大部分同學直接使用數組。問:與統計一篇英文文章中的詞匯問題有何異同之處?
- 使用STL中的map進行改造?map存儲的是鍵值對(key-value pair),key唯一。
- STL的map內部使用紅黑樹,key是排序好的。
- 7-1排序(提前完成)
- 使用什么排序算法?
- 數組空間問題
- “模擬Excel排序”:多關鍵字排序。
- 排序算法都相同,只有比較不相同,需要重復編寫嗎?
- PTA排名匯總
- 首先理解問題、讀懂樣例
- 結構體怎么設計?問題怎么分解?
- “尋找大富翁”:前k大問題。
- 插入排序還是堆排序
綜合
STL中set、map的綜合應用、前k大,倒排索引等。
拓展資料1:倒排索引
倒排索引原理和實現
拓展資料2:STL中set、map容器的用法
STL map演示小程序
STL中的set使用方法詳細!
STL之set:Set的基本用法
C++使用: C++中map的基本操作和用法
C++中的STL中map用法詳解
五.圖
基本目標:
- 學會創建並使用圖的兩種存儲方式:鄰接矩陣、鄰接表。學會在這兩種存儲結構上圖的基本操作(求點的入度、出度、找到某個點的鄰接點等)。
- 掌握圖的DFS與BFS代碼實現。
- 掌握拓撲排序的代碼實現。
- 掌握最短路徑的代碼實現。
實驗文件:
圖-實驗任務書
參考代碼:
#define MAXVEXNUM 100
//點,邊
typedef int ArcCell;
typedef char VexType;
typedef struct {
VexType vexs[MAXVEXNUM];//點的集合
ArcCell arcs[MAXVEXNUM][MAXVEXNUM];//邊的集合
int vexNum, arcNum;
}MyGraph;
任務1:創建圖,DFS、BFS
- 針對下面無向圖通過控制台創建其鄰接矩陣。
- 從控制台創建圖。詳見任務書題目1.
- 圖定義
- 創建圖偽代碼(初始化點數、邊數,初始化點矩陣,初始化邊矩陣)
- 創建圖(需考慮點名稱到點坐標的轉換),輸出圖(觀察圖是否對稱)。如何創建有向圖(網)?
- 圖的遍歷:在上面創建的無向圖中進行DFS、BFS。DFS輸出結果為ABEFCD。
- 無向圖測試數據
6 7
a
b
c
d
e
f
a b 1
a e 1
b e 1
b f 1
c d 1
d a 1
d b 1
e c 1
4.圖的遍歷
任務2:最小生成樹、最短路徑
- PTA:圖着色問題。
- 如何判斷兩個相鄰頂點具有同一種顏色?
- 該問題主要的涉及圖的常見操作是什么?
- 給出圖的存儲結構定義。創建大數組問題(建議使用動態創建方法,如new、malloc,否則可能會造成堆棧溢出)。
- 寫出偽代碼或思路
- PTA:公路村村通、旅游規划。(較容易,建議實驗課前完成)
- PTA:通信網設計。(涉及非連通圖,建議實驗課前嘗試完成)
其他課后完成:
- 鄰接矩陣的創建。PTA:鄰接矩陣實現圖的操作集(函數)。
- 鄰接表的創建。PTA:圖鄰接表操作(函數)。
- DFS、BFS算法。六度空間(BFS應用)。
- 使用棧完成拓撲排序。PTA:拓撲排序(函數)、剿滅魔教 。
- 最短路徑。PTA:旅游規划。
注意:
本章上手難,可以適當引導如何創建鄰接矩陣與鄰接表。可以用試驗任務書的例子循序漸進,逐步創建一個圖。