實驗大綱-數據結構

使用說明:每次實驗都有相應的實驗文件,請先下載,如數據結構-實驗文件-01html

一. 入門

1. 數據結構入門

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

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

CodeBlocks使用小技巧github

1.2 C++語言基礎

學習目標:算法

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

難點:
多文件操做:頭文件、include不懂。小程序

任務:數據結構

  1. C++版的HelloWorld
  2. 使用引用參數改寫void swap1(int a, int b)->void swap(int &a, int &b)->再測試void swap(int a, int &b)
  3. 三種建立複數的方法(單文件)。見complex(複數三種傳遞方法參考代碼).cpp
  4. 考覈:三元組(多文件操做)。見TripletTest(三元組參考源代碼)
  5. 其餘:林麗老師的抽象數據類型做業,DS博客做業01--日期抽象數據類型設計與實現

參考資料:併發

數據結構-實驗文件-01
多文件的C語言系統示例
Visual Studio 2017 安裝使用教程(快速上手版)
使用Visual Studio Code開發(編譯、調試)C++程序
C++指針速記函數

2. Git入門(有時間再講)

目標:visual-studio

  • 學會使用碼雲網頁版存儲代碼。
  • 進階:學會使用命令行下的Git。

任務:
到碼雲註冊帳號,創建本身的代碼倉庫並規劃好目錄結構(chpt01-introduction, chpt02-linearlist...)
進階任務:學習

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

參考資料:

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


二.線性表

1. 順序表

目標:
熟悉順序表的定義及其上的經常使用操做。
任務:

  • PTA-區間刪除
    • 使用typedef定義List與SqList類型
    • 基本考覈: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. 使用順序存儲結構來實現棧的基本操做。
  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上的題目(可選):使用隊列對撲克牌排序、走迷宮、括號匹配
  8. 特別加分:使用遞歸或者隊列實現對指定目錄名及文件名進行文件查找(可以使用C、C++、Python、Java實現)。併發一個簡單博客描述該問題解決過程。

參考資料:

Stack與Queue代碼
Python3不徹底入門指南
Python文件系統功能

4.字符串

完成試驗任務書中第一題-拼接字符串(身份證),最後一題(判斷是不是數字)。而後完成其餘OJ上的字符串題目。


三.樹

目標:
學會建立樹,熟練掌握樹的遞歸結構及在其上的遞歸算法,二叉樹的基本操做,哈夫曼樹,樹的應用。

任務:

  1. 建立樹,前中後序遍歷。PTA:二叉樹操做集。
  2. 樹的遞歸結構。PTA:求二叉樹高度、先序輸出葉結點。
  3. 樹的應用。PTA:表達式樹。
  4. 先序、中序、後序肯定樹。PTA:還原二叉樹、根據後序和中序遍歷輸出先序遍歷。
  5. 隊列應用。PTA:二叉樹層次遍歷。
  6. 哈夫曼樹。PTA:二叉樹葉子結點帶權路徑長度和、修理牧場。
  7. 並查集:朋友圈、家譜處理。

四.查找與排序

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

  1. 查找算法:基本查找、二分查找、二叉排序樹、哈希(map的使用)
  2. 排序算法:基本排序、快排、堆排。
  3. 查找排序的綜合應用:STL中set、map的綜合應用、前k大,倒排索引等。

拓展資料1:倒排索引
倒排索引原理和實現

拓展資料2:STL中set容器的用法
STL Map演示小程序
STL中的set使用方法詳細!
STL之Set:Set的基本用法
C++使用: C++中map的基本操做和用法


五.圖

基本目標:

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

任務:

  1. 鄰接矩陣的建立。PTA:鄰接矩陣實現圖的操做集(函數)。
  2. 鄰接表的建立。PTA:圖鄰接表操做(函數)。
  3. DFS、BFS算法。PTA:圖着色問題(DFS、BFS)、六度空間(BFS應用),公路村村通、修建道路。
  4. 使用棧完成拓撲排序。PTA:拓撲排序(函數)。
  5. 最短路徑。PTA:修建道路。

注意: 本章上手難,能夠適當引導如何建立鄰接矩陣與鄰接表。能夠用試驗任務書的例子按部就班,逐步建立一個圖。

相關文章
相關標籤/搜索