實驗大綱:數據結構


使用說明:

  1. 每次實驗都有相應的實驗文件,請先下載,如數據結構-實驗文件-01
  2. 標明“可選、選做、特別加分”都是選做。有做“特別加分”的同學請練習老師加分。

一. 入門

1. 數據結構入門

1.1 CodeBlocks的使用(或直接使用DEV C++、Visual Studio)

目標:
學會使用CodeBlocks創建項目、編寫程序、掌握常用快捷鍵。
參考資料:

CodeBlocks使用小技巧

1.2 C++語言基礎

學習目標:

  • C++中的cin、cout
  • typedef, #define
  • 引用參數(&)基本概念,使用引用參數的時機(函數內對引用參數修改影響到函數外, 結構體作為函數參數)
  • new與delete

難點:
多文件操作:頭文件、include不懂。

任務:
0. C++版的HelloWorld

  1. 使用引用參數改寫void swap1(int a, int b)->void swap(int &a, int &b)->再測試void swap(int a, int &b)
  2. 三種創建復數的方法(單文件)。見complex(復數三種傳遞方法參考代碼).cpp
  3. 考核:三元組(多文件操作)。見TripletTest(三元組參考源代碼)
  4. 其他:林麗老師的抽象數據類型作業,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...)
進階任務:

  1. 創建遠程倉庫並clone到本地。
  2. 規划好自己的目錄結構,push到遠程倉庫。
  3. 在宿舍學會使用clone與pull。

參考資料:

Git與碼雲(Git@OSC)入門-如何在實驗室和宿舍同步你的代碼(1)


二.線性表

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. 棧和隊列

目標:

  • 掌握棧和隊列的基本存儲結構
  • 熟練掌握棧和隊列的基本使用
  • 熟悉棧和隊列的一些典型應用

任務:

  1. 使用順序存儲結構來實現棧的基本操作。

    • PTA函數題:另類堆棧、在一個數組中實現兩個堆棧(可選:考研)
  2. 學會使用STL中的stack、queue與string見參考資料Stack與Queue代碼。完成實驗任務書中的題目1—C++中的stack和queue(考核)。

  3. PTA編程題:字符串是否對稱(考核)、符號配對(考核)、表達式轉換-中綴轉后綴(考核)

  4. 可選:使用stack實現數制轉換

  5. 遞歸
    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; 
    }
    
  6. 隊列相關應用:完成銀行業務隊列簡單模擬(PTA-編程)、舞伴問題(PTA-函數)、使用隊列打印楊輝三角(可選)

  7. 可選:OJ上的題目(使用隊列對撲克牌排序、走迷宮、括號匹配);PTA題目(另類循環隊列-函數)。

  8. 特別加分:使用遞歸或者隊列實現對指定目錄名及文件名進行文件查找(可使用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. *手動創建一顆二叉樹,並對其進行先序、中序與后序遍歷。樹圖如下。

  1. *使用前序串創建樹,然后對其進行前、中、后序遍歷。PTA(編程):前序序列創建二叉樹。
  2. *樹的遞歸結構。PTA(函數):先序輸出葉結點、求二叉樹高度。
  3. 樹的應用。PTA(函數):表達式樹。
  4. *隊列應用(編程)。PTA:二叉樹層次遍歷(廣度優先)。
  5. 先序、中序、后序確定樹。PTA(編程):還原二叉樹、根據后序和中序遍歷輸出先序遍歷。
  6. *二叉樹的應用:二叉排序樹。給定一串50 30 80 20 40 90 10 25 35 85 23 88創建二叉排序樹並進行搜索。
  7. *樹的應用(可選,簡單講解):PTA(編程):目錄樹(使用兄弟鏈,綜合使用了樹結構與鏈表結構)。
  8. 二叉樹的應用(可選):哈夫曼樹。PTA(編程):二叉樹葉子結點帶權路徑長度和、修理牧場。
  9. 樹的應用(可選):並查集。PTA(編程):朋友圈、家譜處理。
  10. 繪制二叉樹(可選):使用EasyX繪制二叉樹。
  11. 其他(可選):如下所示

二叉樹既可以用鏈式結構存儲也可以用順序結構存儲,嘗試編寫兩個算法,實現以下兩個功能:
1.將鏈式結構存儲的二叉樹轉化成順序結構存儲。
2.將順序結構存儲的二叉樹轉化成鏈式結構存儲。

第2次實驗課任務:

  • 課前准備:
    1. 使用代碼對先序字符串ABC**DE*G**F**HI**J**建立的鏈式二叉樹。寫出層序遍歷的偽代碼
    2. 學會使用queue進行編碼。看:給學生-queue.txt
  • 實驗課完成:
    1. 層序遍歷二叉樹。層次遍歷“課前准備1”建立的鏈式二叉樹。層序遍歷輸出為ABHCDIJEFG,請自行驗證。
    2. 目錄樹(簡單講解思路)。使用怎樣的數據結構來存儲這棵樹?字典排序怎么實現(可使用string的compare函數,或直接使用>、=、<等比較運算符)?
    3. 二叉排序樹。嘗試完成創建、查找。思考:如何刪除、

參考資料:

實驗任務書:二叉樹


四.查找與排序

目標:
學會基本的查找與排序算法,學會將哈希表應用於快速查找、統計等。

任務:

查找

包括:基本查找、二分查找、二叉排序樹、哈希(map的使用)

1.熱身:
實現二叉排序樹(實驗課前在發布互評作業,實驗課上學生展示)

可選:

2.PTA函數題:

  • "是否二叉搜索樹"(利用BST的遞歸定義)
  • "二叉搜索樹中的最近公共祖先"(利用BST的遞歸定義、利用BST左小右大或左大右小的特性)

3.PTA編程題:

  • QQ帳戶的申請與登(哈希,map)
  • 航空公司VIP客戶查詢(哈希鏈)
  • 基於詞頻的文件相似度(map)

排序題集中的“統計工齡”很適合演示map的使用。

4.可選(OJ):

5.其他(OJ):

排序

包括:基本排序、快排、堆排。

自行完成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用法詳解


五.圖

基本目標:

  1. 學會創建並使用圖的兩種存儲方式:鄰接矩陣、鄰接表。學會在這兩種存儲結構上圖的基本操作(求點的入度、出度、找到某個點的鄰接點等)。
  2. 掌握圖的DFS與BFS代碼實現。
  3. 掌握拓撲排序的代碼實現。
  4. 掌握最短路徑的代碼實現。

實驗文件:
圖-實驗任務書

參考代碼:

#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. 針對下面無向圖通過控制台創建其鄰接矩陣。
  2. 從控制台創建圖。詳見任務書題目1.
    • 圖定義
    • 創建圖偽代碼(初始化點數、邊數,初始化點矩陣,初始化邊矩陣)
    • 創建圖(需考慮點名稱到點坐標的轉換),輸出圖(觀察圖是否對稱)。如何創建有向圖(網)?
    • 圖的遍歷:在上面創建的無向圖中進行DFS、BFS。DFS輸出結果為ABEFCD
  3. 無向圖測試數據
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:最小生成樹、最短路徑

  1. PTA:圖着色問題。
    • 如何判斷兩個相鄰頂點具有同一種顏色?
    • 該問題主要的涉及圖的常見操作是什么?
    • 給出圖的存儲結構定義。創建大數組問題(建議使用動態創建方法,如new、malloc,否則可能會造成堆棧溢出)。
    • 寫出偽代碼或思路
  2. PTA:公路村村通、旅游規划。(較容易,建議實驗課前完成)
  3. PTA:通信網設計。(涉及非連通圖,建議實驗課前嘗試完成)

其他課后完成:

  1. 鄰接矩陣的創建。PTA:鄰接矩陣實現圖的操作集(函數)。
  2. 鄰接表的創建。PTA:圖鄰接表操作(函數)。
  3. DFS、BFS算法。六度空間(BFS應用)。
  4. 使用棧完成拓撲排序。PTA:拓撲排序(函數)、剿滅魔教 。
  5. 最短路徑。PTA:旅游規划。

注意:
本章上手難,可以適當引導如何創建鄰接矩陣與鄰接表。可以用試驗任務書的例子循序漸進,逐步創建一個圖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM