第一篇:數據結構 實驗指導書
數 據 結 構 實 驗 指 導 書
數據結構實驗指導書
目錄
數據結構實驗指導書.......................................................................................................................1
目錄...........................................................................................................................................1 實驗指導書概述...............................................................................................................................2 上機實驗題目...................................................................................................................................3
實驗一 C語言相關知識復習................................................................................................3
一、實驗目的...................................................................................................................3
二、實驗內容...................................................................................................................3 實驗二 單鏈表的插入、刪除...............................................................................................3
一、實驗目的...................................................................................................................3
二、實驗內容...................................................................................................................3
三、實現提示...................................................................................................................4 實驗三 棧及其應用.................................................................................................................5
一、實驗目的...................................................................................................................5
二、實驗內容...................................................................................................................5 實驗四 二叉樹的遞歸算法.....................................................................................................6
一、實驗目的...................................................................................................................6
二、實驗內容...................................................................................................................6 實驗五 圖的遍歷.....................................................................................................................7
一、實驗目的...................................................................................................................7
二、實驗內容...................................................................................................................7 實驗六 有序表的查找.............................................................................................................7
一、實驗目的...................................................................................................................7
二、實驗內容...................................................................................................................7 實驗七 哈希表.........................................................................................................................7
一、實驗目的...................................................................................................................7
二、實驗內容...................................................................................................................7 實驗八 內部排序算法的應用.................................................................................................8
一、實驗目的...................................................................................................................8
二、實驗內容...................................................................................................................8
實驗指導書概述
“數據結構”是計算機專業一門重要的專業技術基礎課程,是一門關鍵性核心課程。本課程系統地介紹了軟件設計中常用的數據結構以及相應的存儲結構和實現算法,介紹了多種常用的查找和排序技術,并對其進行了性能分析和比較,內容非常豐富。本課程的學習將為后續課程的學習以及軟件設計水平的提高打下良好的基礎。
由于以下原因,使得掌握這門課程具有較大難度: ? 內容多,時間短,給學習帶來困難;
? 貫穿全書的動態鏈表存儲結構和遞歸技術是學習中的重點和難點; ? 隱含在各部分的技術和方法豐富,也是學習的重點和難點; ? 先修課程中所介紹的專業性知識不多,加大了學習難度。
由于數據結構課程的技術性與實踐性,《數據結構課程實驗》的設置十分必要。為了幫助學生更好地學習本課程,理解和掌握算法設計所需的技術,為整個專業學習打好基礎,要求運用所學知識,上機解決一些典型問題,通過分析、設計、編碼、調試等各環節的訓練,使學生深刻理解、牢固掌握所用到的一些技術。
上機實踐是對學生的一種全面綜合訓練,是與課堂聽講、自學和練習相輔相成的必不可少的一個教學環節。通過上機實踐,使學生在可能短的時間內對數據結構知識的實踐和應用有一個比較全面和系統的認識,達到理論與實踐相結合的目的。
為了達到上述目的,本指導書安排了8個實驗題目,它們與教科書的各章有緊密的關系,使學生在實驗后能加深對課程內容的理解,增強動手能力。
每個實驗題目采取了統一的格式,由問題描述、基本要求、測試數據、實現提示等部分組成。
問題描述旨在為讀者建立問題提出的背景環境,指明問題“是什么”;
要求則對問題進一步求精,劃出問題的邊界,指出具體的參量或前提條件,并規定該題的最低限度要求;
測試部分旨在為檢查學生上機作業提供方便,在完成實習題時應自己設計完整和 嚴格的測試方案,當數據輸入量較大時,提倡以文件形式向程序提供輸入數據;
實現提示對實現中的難點及其解法思路等問題作了簡要提示,個別問題給出了參考實現。
下面帶*的題目為選做題目。
上機實驗題目
實驗一 C語言相關知識復習
一、實驗目的
復習C語言中函數、數組、結構體、文件等概念,掌握它們的描述與操作方法;熟悉掌握C++中typedef、引用參數調用(&)的概念及使用方法,為理解數據結構課程的后續內容以及算法書寫奠定基礎。
二、實驗內容 問題描述:編寫一個函數,求一個整數數組中的最大、最小值。
要求:在函數聲明中采用引用參數傳遞方式實現最大、最小值的返回。測試:在主函數中輸入10個數,調用此函數,打印輸出最大和最小值。2 關于指針的使用:
用malloc方式分別申請兩個指針,并實現兩個指針內容的比較大小操作。要求:此功能在一個函數內實現,該函數接受兩個整數值,存儲到兩個指針內容中,輸出兩者中的最大值。
測試:從主函數中輸入兩個數,調用該函數,打印輸出交換后的值。
實驗二 單鏈表的插入、刪除
一、實驗目的
1、熟悉某種數據結構在計算機上實現的方法。
2、掌握單鏈表的定義、創建、插入、刪除、遍歷等基本操作的實現。
3、體會單鏈表操作、有序表插入、刪除的一般方法。
二、實驗內容
問題描述:已知遞增有序的單鏈表A,編寫算法實現向A中插入或刪除一個元素,并保持A的有序性。
實驗要求:
1、結點的數據均為整型。
2、若表中已經存在此元素,則不插入
三、實現提示
1.在已知的線性表中插入或刪除,需要下面的輔助函數:線性表的創建、線性表的遍歷
2.在單鏈表表中插入或刪除,需依次實現:
a)單鏈表結構的定義
b)單鏈表的創建(頭插法或尾插法建表)c)單鏈表的遍歷
d)單鏈表的插入、刪除(采用順序查找方法,順頭指針往后,查找插入或刪除位置,再修改指針)
//頭文件
#include “stdlib.h” //預定義常量 #define NULL 0
//單鏈表的定義
typedef struct LNode{ int data;struct LNode *next;}LNode,*LinkList;//單鏈表的創建
void Create_List(LinkList &L){ int data;LinkList p,q;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;
q=L;
scanf(“%d”,&data);while(data!=0){
p=(LinkList)malloc(sizeof(LNode));
p->data=data;
p->next=q->next;
q->next=p;
q=p;
scanf(“%d”,&data);} }
//單鏈表的遍歷
void TranverseList(LinkList L){
LinkList p;
p=L->next;
if(p==NULL)
{
printf(“niln”);
return;
}
while(p!=NULL)
{
printf(“%d ”,p->data);
p=p->next;
}
printf(“n”);}
實驗三 棧及其應用
一、實驗目的
1、熟悉棧的順序表示與實現。
2、熟悉棧的應用。
3、理解并掌握遞歸函數的設計與實現。
二、實驗內容 問題描述:利用棧實現十進制數n轉化為d進制數 要求:
1)輸入一個n和d,打印輸出d進制數序列。
2)利用順序棧來實現十進制數n轉化為其他d進制數。此時,需要同時實現初始化空棧、入棧、出棧、判棧空等輔助功能。測試數據:
(1)輸入n:1348
d:8 輸出:2504(2)輸入n:9
d:8 輸出:11(3)輸入n:0
d:8 輸出:0 2 問題描述:利用棧實現算術表達式求值。要求:
1)參與運算的操作數為10以內的數值。測試數據:
自擬。
實驗四 二叉樹的遞歸算法
一、實驗目的
1、掌握二叉樹的表示與實現。
2、掌握二叉樹的定義、創建、遍歷等基本操作的實現。
3、熟悉求二叉樹深度等遞歸算法的設計與實現。
二、實驗內容
問題描述:已知二叉樹t,分別采用順序存儲結構、二叉鏈表存儲結構實現求二叉樹的深度,并對二叉樹分別進行中序遍歷。要求:
1、二叉樹分別采用順序或二叉鏈表存儲。
2、樹中的數據類型約定為整型。測試數據:
1、輸入序列:-+a??*b??-c??d??/e??f??創建二叉樹; 輸出:深度:5
前序序列:-+a*b-cd/ef
中序序列:a+b*c-d-e/f
后序序列:abcd-*+ef/-T:d / e f
2、t=nil
輸入:?
輸出:深度:0 實驗五 圖的遍歷
一、實驗目的
熟悉圖的基本操作,掌握圖遍歷的設計與實現。
二、實驗內容
問題描述:已知的描述校園景點的圖,實現對該圖的深度優先和廣度優先遍歷。要求:
圖采用鄰接矩陣存儲,頂點信息包括景點的名稱和簡單描述。
實驗六 有序表的查找
一、實驗目的
1、理解各種查找方法的基本思想
2、熟悉有序表查找方法的算法實現
二、實驗內容 已知一有序的序列{1,3,5,7,9},采用折半法分別查找3和6。
2已知輸入一無序的序列{5,1,3,9,7},創建一棵二叉排序樹,然后對其遍歷,輸出遞增有序的序列。
實驗七 哈希表
一、實驗目的
理解哈希表的概念和基本操作;熟悉哈希表的創建、查找、插入的算法實現。
二、實驗內容
問題描述:已知11位好友的名字各不相同,設計并實現一個哈希表,根據好友的名字,可以取得其生日。要求:
1、好友的信息包含名字和生日兩個數據項,其中好友的名字為主鍵,用漢語拼音形式存放;
2、哈希函數采取:好友名字中所有拼音字母ASCII碼值的和 MOD 11(除以1取余);
3、采取線性探測再散列的方式處理沖突。
實驗八 內部排序算法的應用
一、實驗目的
理解各種內部排序方法的基本思想;熟悉各種內部排序方法的算法實現
二、實驗內容
問題描述:已知一序列{503,087,512,061,908,170,897,275,653,426},分別采取下列排序方法對其進行排序:
(1)直接插入排序;
(2)簡單選擇排序;
(3)起泡排序;(4)快速排序;(5)堆排序。
第二篇:《數據結構》實驗指導書
《數據結構》實驗(訓)指導書
電氣與信息工程學院實驗中心
前 言
《數據結構》是計算機相關專業的一門核心基礎課程,也是很多高校研究生入學考試專業課必考課程之一。它主要介紹線性結構、樹型結構、圖形結構三種邏輯結構元素的存儲實現,在此基礎上介紹一些典型算法及時、空效率分析。這門課程的主要任務是培養學生的算法分析、設計能力及良好的程序設計習慣。通過學習,要求學生能夠掌握典型算法的設計思想及程序實現,能夠根據實際問題選取合適的存儲方案,設計出簡潔、高效、實用的算法,為后續課程的學習及軟件開發打下良好的基礎。學習這門課程,習題和實驗是兩個關鍵環節。學生理解算法的最佳途徑是上機實驗。因此,實驗環節的好壞是學生能否學好《數據結構》的關鍵。為了更好地配合學生實驗,特編寫該實驗指導書。
一、實驗目的、要求和任務
計算機編程中加工處理的對象是數據,而數據具有一定的組織結構,所以學習編寫計算機程序僅僅了解計算機語言是不夠的,還必須掌握數據組織、存儲和運算的一般方法,這是數據結構課程中學習和研究的內容。由于數據結構的原理和算法較抽象,而該課程一般在本科低年級開設,對于計算機程序設計知識的初學者,理解和掌握其中的原理就顯得較為困難。
1.熟練掌握C語言的編輯、編譯、調試程序。2.會書寫類C語言的算法,并將算法轉變為程序實現。
3.正確理解各種數據結構的邏輯特性和存儲表示和基本操作的算法實現。4.有較強的邏輯分析能力。
5.針對問題的不同選擇合適的數據結構,提高算法設計的能力和動手實驗的技能。
6.學會分析研究計算機加工的數據結構的特性,以便為應用設計的數據選擇適當的邏輯結構、存儲結構及其相應的算法,并初步掌握算法的時間分析和空間分析的技術。
7.本課程的學習過程也是復雜程序設計的訓練過程,要求學生編寫的程序結構清楚、正確易讀,符合軟件過程的規范,從而培養學生的數據抽象能力。
8.通過若干數據結構應用實例,引導學生學習數據類型的使用,為今后學習面向對象的程序做一些鋪墊。
二、實驗基本內容及學時分配
為了達到實驗目的,本課程安排了4個實驗單元,訓練的重點在于基本的數據結構,而不是強調面面俱到。各實驗單元與教科書的各章只具有粗略的對應關系,一個實驗題常常涉及到幾部分教學內容。總學時:8學時。
1、線性表(2學時)
(1)熟悉線性表的基本運算在兩種存儲結構(順序結構和鏈式結構)上的實現;(2)以線性表的各種操作(建立、插入、刪除等)的實現為重點;
(3)通過本次實驗幫助學生提高C語言的編程能力(特別是函數參數、指針類型、鏈表的使用)。
2、數組和廣義表(2學時)(1)掌握稀疏矩陣的壓縮存儲
(2)掌握稀疏矩陣的轉置算法
3、樹與二叉樹(2學時)
常見的二叉樹遍歷算法有先序遍歷,中序遍歷和后序遍歷算法。實現簡單的先序遍歷,中序遍歷和后序遍歷算法。
4、排序(2學時)
常見的內部排序算法,插入類排序算法,如直接插入排序和希爾排序;交換類排序算法,如冒泡排序和快速排序;選擇類排序算法,如簡單選擇排序、樹形選擇類排序和堆排序。實冒泡排序或者直接插入排序算法。
三、說明
該課程采用理論與實踐相結合的教學方法,集知識性與趣味性于一體,達到良好的教學效果。硬件要求:在多媒體教室講解及演示。為保證教學順利進行,要求實驗室提供電腦等設備。學生每次上機實驗都必須遵守實驗室的有關規定。
四、實驗報告規范 實驗報告的內容包括:
1、實驗目的:說明實驗所驗證的知識點。
2、需求分析:以無歧義的陳述說明程序設計的任務、約束條件、輸入輸出要求、對功能的規定及模型。
3、邏輯設計:說明本程序中用到的所有抽象的數據類型的定義、主程序的流程以及各程序模塊之間的層次調用關系。
4、詳細設計:邏輯設計中定義的所有數據類型的實現,核心算法的設計描述、人機界面設計、函數之間調用關系的描述,主要功能的算法框架,測試數據設計。
5、測試分析:測試結果的分析與討論,測試過程中遇到的主要問題及采取的解決措施。
6、心得:軟件設計與實現過程中的經驗與體會,進一步改進的設想。
7、程序清單:源程序中應有足夠的注釋。如果提交源程序軟盤,列出程序文件名。
五、如何提高上機效率
為了提高上機的效率,真正達到實驗目的,要求同學做好實驗前的準備工作,寫好實驗預習報告,即實驗報告規范中的1)、2)、3)、4)部分,編寫好程序,并用一組測試數據手工執行程序靜態檢查程序是否有錯,通過閱讀、執行程序或給別人講解自己的程序而深入全面地理解程序邏輯,提高程序的正確性。對C語言程序不熟悉的同學,上機時最好帶上C語言程序設計的教材,以備查閱。調試中遇到問題,應認真分析,確定可疑點,設置調試斷點或輸出斷點處變量的值,以便發現問題,迅速排除問題,加快調試速度。
實驗室要求:
不能曠課,不遲到,不穿拖鞋進實驗室
實驗需預習報告(不能單純抄寫,預習程序代碼)實驗報告(總結,注釋,實驗結果)
目 錄
實驗一 線性表實驗(設計性實驗)..........................................4 實驗二 數組和廣義表實驗(設計性實驗)....................................6 實驗三 樹與二叉樹(設計性實驗)..........................................8 實驗四 排序(設計性實驗)................................................9
實驗一
線性表實驗(設計性實驗)
一、實驗目的
1.熟悉C語言的上機環境,進一步掌握C語言的結構特點。2.掌握線性表的順序存儲結構的定義及C語言實現。
3.掌握線性表的鏈式存儲結構——單鏈表的定義及C語言實現。4.掌握線性表在順序存儲結構即順序表中的各種基本操作。5.掌握線性表在鏈式存儲結構——單鏈表中的各種基本操作。
二、實驗內容
1.順序線性表的建立、插入及刪除。2.鏈式線性表的建立、插入及刪除。
三、實驗儀器設備與器材 上機電腦
四、實驗步驟
1.建立含n個數據元素的順序表并輸出該表中各元素的值及順序表的長度。
2.利用前面的實驗先建立一個順序表L={21,23,14,5,56,17,31},然后在第i個位置插入元素68。
3.建立一個帶頭結點的單鏈表,結點的值域為整型數據。要求將用戶輸入的數據按尾插入法來建立相應單鏈表。
五、實驗提示
1.由于C語言的數組類型也有隨機存取的特點,一維數組的機內表示就是順序結構。因此,可用C語言的一維數組實現線性表的順序存儲。
在此,我們利用C語言的結構體類型定義順序表: #define MAXSIZE 1024 typedef int elemtype;/*
線性表中存放整型元素 */ typedef struct { elemtype vec[MAXSIZE];int len;/*
順序表的長度 */ }sequenlist;將此結構定義放在一個頭文件sqlist.h里,可避免在后面的參考程序中代碼重復書寫,另外在該頭文件里給出順序表的建立及常量的定義。
2.注意如何取到第i個元素,在插入過程中注意溢出情況以及數組的下標與位序(順序表中元素的次序)的區別。
3.單鏈表的結點結構除數據域外,還含有一個指針域。用C語言描述結點結構如下:
typedef int elemtype;typedef struct node { elemtype data;//數據域
struct node *next;//指針域
}linklist;
注意結點的建立方法及構造新結點時指針的變化。構造一個結點需用到C語言的標準函數malloc(),如給指針變量p分配一個結點的地址:
p=(linklist *)malloc(sizeof(linklist));該語句的功能是申請分配一個類型為linklist的結點的地址空間,并將首地址存入指針變量p 中。當結點不需要時可以用標準函數free(p)釋放結點存儲空間,這時p為空值(NULL)。
六、實驗總結與思考
1.如果按由表尾至表頭的次序輸入數據元素,應如何建立順序表。2.在main函數里如果去掉L=&a語句,會出現什么結果?
實驗二
數組和廣義表實驗(設計性實驗)
一、實驗目的
1.掌握稀疏矩陣的壓縮存儲 2.掌握稀疏矩陣的轉置算法
二、實驗內容
1.實現上三角陣的壓縮存儲。
2.用三元組順序表存儲稀疏矩陣,并實現矩陣的轉置。
三、實驗儀器設備與器材 上機電腦
四、實驗步驟
1.創建一個數組。2.輸入數據
3.給定矩陣任一元素的下標,4.打印給定下標所對應的數據。5.創建三元組順序表。?a22 7.A輸出對應的矩陣。??
21五、實驗提示 ?aaa6.輸入矩陣中的數據。?11?a11??a?313233a2122?1.對于如下對稱矩陣: ??A?aaa?4243?41?a31a32a33??1個位置,a21存入到第二個位置,?將它們存入到一個線性數組中B,不存非零元素,a11存入到第a41a42aija44????aij的位則aij能存到第幾個位置,我們要以用梯形公式算面積。置是它上面的元素之和再加上左邊的元素之和。
它上面的元素之和為((1+(i-1))×(i-1)/2,左邊的元素為(j-1)所以這個元素存儲的位置為k=i(i-1)/2+j-1。
因為矩陣A為對稱矩陣,(另一部分沒有寫出),所以另一部分的元素為 k=j(j-1)/2+i-1.所以存在關系k=i(i-1)/2+j-1(i>j)和k=j(j-1)/2+i-1(i 2.結點結構 struct triple{ int i,j;//非零元的行下標和列下標 elemtype e;//非零元數據} 三元組順序表存儲類型 struct tsmatrix{ triple data[12500];aa?????a44?? int mu,nu,tu;} 三元順序表的轉置 方法:(1)將矩陣行列互換,(2)重排矩陣 六、實驗總結與思考 1.如何存儲三對角陣? 2.如何用行邏輯鏈接順序表及十字鏈表存儲稀疏矩陣? 實驗三 樹與二叉樹(設計性實驗) 一、實驗目的 1.掌握稀疏矩陣的壓縮存儲 2.掌握稀疏矩陣的轉置算法 二、實驗內容 1.練習二叉樹的建立與存儲 2.練習二叉樹的遍歷 三、實驗儀器設備與器材 上機電腦 四、實驗步驟 1.建立自己的頭文件BT.H,內容包括二叉鏈表的結構描述、二叉樹的建立、二叉樹的先序、中序與后序遍歷算法。 2.建立二叉樹,并通過調用函數,,輸出先序遍歷、中序遍歷與后序遍歷的結果。 五、實驗提示 建立二叉樹的代碼如下: BTCHINALR * createbt(){ BTCHINALR *q;struct node1 *s[30];int j,i,x;printf(“建立二叉樹,輸入結點對應的編號和值,編號和值之間用逗號隔開nn”);printf(“i,x = ”);scanf(“%d,%c”,&i,&x);while(i!= 0 && x!= '$') {q =(BTCHINALR*)malloc(sizeof(BTCHINALR));/*建立一個新結點q*/ q->data = x;q->lchild = NULL;q->rchild = NULL; s[i] = q;/*q新結點地址存入s指針數組中*/ if(i!= 1)/*i = 1,對應的結點是根結點*/ {j = i / 2;/*求雙親結點的編號j*/ if(i % 2 == 0)s[j]->lchild = q;/*q結點編號為偶數則掛在雙親結點j的左邊*/ else s[j]->rchild = q;} /*q結點編號為奇數則掛在雙親結點j的右邊*/ printf(“i,x = ”); scanf(“%d,%c”,&i,&x);} return s[1];/*返回根結點地址*/ } 六、實驗總結與思考 1.如何用孩子兄弟表示法存儲樹? 2.熟悉及難赫夫曼樹。 實驗四 排序(設計性實驗) 一、實驗目的 1.掌握常用的排序方法,并掌握用高級語言實現排序算法的方法; 2.深刻理解排序的定義和各種排序方法的特點,并能加以靈活應用; 3.了解各種方法的排序過程及其時間復雜度的分析方法。 二、實驗內容 統計成績 給出n個學生的考試成績表,每條信息由姓名和分數組成,試設計一個算法: (1)按分數高低次序,打印出每個學生在考試中獲得的名次,分數相同的為同一名次;(2)按名次列出每個學生的姓名與分數。 三、實驗儀器設備與器材 上機電腦 四、實驗步驟 1.定義結構體。2.定義結構體數組。 3.定出主程序,對數據進行排序。 五、實驗提示 #define n 30 typedef struct student { char name[8];int score;} student R[n];main(){ int num, i, j, max, temp;printf(“n請輸入學生成績: n”);for(i=0;i if(max!=i){ temp = R[max];R[max]=R[i];R[i]= temp;} if((i>0)&&(R[i].score 六、實驗總結與思考 1.快速排序算法解決本問題。2.較各種排序算法的優缺點及。 3.使用其它排序算法實現該問題(直接插入排序、希爾排序、簡單選擇排序、堆排序等)。 數 據 結 構 實 驗 指 導 書 南京工程學院 信息管理與信息系統教研室 2014年3月 實驗一 線性表操作 一、實驗目的 1.熟悉C語言的上機環境,進一步掌握C語言的結構特點。2.掌握線性表的順序存儲結構的定義及C語言實現。 3.掌握線性表的鏈式存儲結構——單鏈表的定義及C語言實現。4.掌握線性表在順序存儲結構即順序表中的各種基本操作。5.掌握線性表在鏈式存儲結構——單鏈表中的各種基本操作。 二、實驗內容 1.順序線性表的建立、插入及刪除。 2.鏈式線性表的建立、插入及刪除。 三、實驗步驟 1.建立含n個數據元素的順序表并輸出該表中各元素的值及順序表的長度。2.利用前面的實驗先建立一個順序表L={21,23,14,5,56,17,31},然后在第i個位置插入元素68。 3.建立一個帶頭結點的單鏈表,結點的值域為整型數據。要求將用戶輸入的數據按尾插入法來建立相應單鏈表。 四、實現提示 1.由于C語言的數組類型也有隨機存取的特點,一維數組的機內表示就是順序結構。因此,可用C語言的一維數組實現線性表的順序存儲。 在此,我們利用C語言的結構體類型定義順序表: #define MAXSIZE 1024 typedef int elemtype;/* 線性表中存放整型元素 */ typedef struct { elemtype vec[MAXSIZE];int len;/* 順序表的長度 */ }sequenlist;將此結構定義放在一個頭文件sqlist.h里,可避免在后面的參考程序中代碼重復書寫,另外在該頭文件里給出順序表的建立及常量的定義。 2.注意如何取到第i個元素,在插入過程中注意溢出情況以及數組的下標與位序(順序表中元素的次序)的區別。 3.單鏈表的結點結構除數據域外,還含有一個指針域。用C語言描述結點結構如下: typedef int elemtype;typedef struct node { elemtype data;//數據域 struct node *next;//指針域 }linklist;注意結點的建立方法及構造新結點時指針的變化。構造一個結點需用到C語言的標準函數malloc(),如給指針變量p分配一個結點的地址: p=(linklist *)malloc(sizeof(linklist));該語句的功能是申請分配一個類型為linklist的結點的地址空間,并將首地址存入指針變量p 中。當結點不需要時可以用標準函數free(p)釋放結點存儲空間,這時p為空值(NULL)。 五、思考與提高 1.如果按由表尾至表頭的次序輸入數據元素,應如何建立順序表。2.在main函數里如果去掉L=&a語句,會出現什么結果? 實驗二 棧和隊列的應用 一、實驗目的 1.掌握棧的順序表示和實現 2.掌握隊列的鏈式表示和實現 二、實驗內容 1.編寫一個程序實現順序棧的各種基本運算。2.實現隊列的鏈式表示和實現。 三、實驗步驟 1.順序棧(1)初始化順序棧;(2)插入元素(3)刪除棧頂元素(4)取棧頂元素(5)遍歷順序棧(6)置空順序棧 2.鏈隊列 (1)初始化并建立鏈隊列(2.)入鏈隊列(3)出鏈隊列(4)遍歷鏈隊列 四、實現提示 1./*定義順序棧的存儲結構*/ typedef struct { ElemType stack[MAXNUM];int top;}SqStack; /*初始化順序棧函數*/ void InitStack(SqStack *p) {q=(SqStack*)malloc(sizeof(SqStack));/*申請空間*/} /*入棧函數*/ void Push(SqStack *p,ElemType x){if(p->top SqStack S; ElemType e; int N; /*初始化順序棧*/ /*入棧*/ /*出棧*/ /*遍歷順序棧*/ getch();} 2./*定義鏈隊列*/ typedef struct Qnode { ElemType data;struct Qnode *next;}Qnodetype;typedef struct { Qnodetype *front;Qnodetype *rear;}Lqueue; /*初始化并建立鏈隊列函數*/ void creat(Lqueue *q) { h=(Qnodetype*)malloc(sizeof(Qnodetype));/*初始化申請空間*/ h->next=NULL;q->front=h;q->rear=h;for(i=1;i<=n;i++)*利用循環快速輸入數據*/ { scanf(“%d”,&x);Lappend(q,x);} /*利用入鏈隊列函數快速輸入數據*/ } /*入鏈隊列函數*/ void Lappend(Lqueue *q,int x){ s->data=x;s->next=NULL;q->rear->next=s;q->rear=s;} /*出鏈隊列函數*/ ElemType Ldelete(Lqueue *q){ p=q->front->next;q->front->next=p->next;if(p->next==NULL)q->rear=q->front;x=p->data;free(p);} /*釋放空間*/ /*遍歷鏈隊列函數*/ void display(Lqueue *q){ while(p!=NULL)/*利用條件判斷是否到隊尾*/ { printf(“%d-->”,p->data);p=p->next;} } 可參考如下代碼: #include “stdio.h” #define MaxSize 100 typedef int ElemType;main(){ LinkQueue Q; ElemType e; /*初始化并建立鏈隊列*/ /*入鏈隊列*/ /*出鏈隊列*/ *遍歷鏈隊列*/ } DestoryQueue(&Q); getch();} 五、思考與提高 1.讀棧頂元素的算法與退棧頂元素的算法有何區別? 試寫一個算法,判別讀入的一個以‘@’為結束符的字符序列是否是?回文?。實驗三 樹操作 一、實驗目的 1.通過實驗,掌握二叉樹的建立與存儲 2.通過實驗,掌握二叉樹的遍歷方法 二、實驗內容 1.練習二叉樹的建立與存儲 2.練習二叉樹的遍歷 三、實驗步驟 1.建立二叉鏈表的結構描述、二叉樹的建立、二叉樹的先序、中序與后序遍歷算法。 2.建立二叉樹,并通過調用函數, 輸出先序遍歷、中序遍歷與后序遍歷的結果。 四、實現提示 1.采用遞歸方法建立二叉樹: 首先建立二叉樹的根 結點,然后建立其左右子樹,直到空子樹為止。 2.先序遍歷、中序遍歷與后序遍歷二叉樹。#include BiTree CreateBiTree(BiTree &T){ } /*先序遍歷*/ Status PreOrderTraverse(BiTree T){ } /*中序遍歷*/ Status InOrderTraverse(BiTree T){ } /*后序遍歷*/ Status PostOrderTraverse(BiTree T){ } int main(){ BiTree T;CreateBiTree(T);PreOrderTraverse(T);printf(“n”);/*先序遍歷*/ InOrderTraverse(T);printf(“n”);/*中序遍歷*/ PostOrderTraverse(T);printf(“n”);/*后序遍歷*/ return 0;} 五、思考與提高 編寫遞歸算法,計算二叉樹中葉子結點的數目。 目 錄 實驗規則················································2 實驗環境················································2 實驗報告要求············································3 實驗一 單鏈表 (一)······································4 實驗二 單鏈表 (二)······································5 實驗三 棧···············································6 實驗四 二叉樹···········································7 實驗五 最短路徑·········································8 實驗六 內部排序·········································9 實 驗 規 則 為了順利完成實驗教學任務,確保人身、設備的安全,培養嚴謹、踏實、實事求是的科學作風和愛護國家財產的優良品質,特制定以下實驗規則: 1、實驗前必須充分預習,完成指定的預習任務。預習要求如下: (1)認真閱讀指導書,進行必要的設計與計算。(2)熟悉實驗內容。 (3)預先復習,并按要求編寫程序。(4)未完成預習任務者不得進入實驗室。 2、遵守以下紀律: (1)在實驗室不得做和實驗無關的事情。 (2)進行任課老師指定內容以外的實驗,必須經指導教師同意。(3)遵守紀律,不遲到。 (4)保持實驗室內安靜、整潔,愛護公物,不許亂寫亂畫。 實 驗 環 境 本實驗在386以上的微機上進行,運行環境為VC6.0。 實驗報告要求 1、實驗題目 2.實驗目的 3.實驗環境 4.實驗內容與完成情況(可以附上自主設計的源程序)5.出現的問題及對問題的解決方案 6.實驗思考:(學生對本次實驗的收獲的總結) 實驗一 單鏈表 (一)一、實驗目的 掌握線性表的鏈式存儲結構及其基本操作。 二、預習要求 1、看懂書上的算法,深入理解鏈表的物理存儲模式和邏輯模式。 2、根據要求,編寫程序準備上機調試。 三、實驗內容 實現一個簡單的學生信息管理系統,該系統的功能有: 1、利用單鏈表建立學生基本信息表 2、瀏覽每個學生的信息 3、根據學號查詢某個學生的基本信息 4、添加學生信息到單鏈表中 5、刪除一個學生的信息 四、實現提示 設計結點的結構體類型,包括學生的學號、姓名、年齡、性別;要求設計一個簡單的菜單界面,根據需要選擇所要進行的操作;構造函數,每一個函數實現上述的一個功能。 實驗二 單鏈表 (二)一、實驗目的 掌握線性表的鏈式存儲結構及其基本操作。 二、預習要求 1、看懂書上的算法,深入理解鏈表的物理存儲模式和邏輯模式。 2、根據要求,編寫程序準備上機調試。 三、實驗內容 1、實現單鏈表的就地逆置。 2、建立兩個非遞減有序單鏈表,然后合并成一個非遞減鏈表。 3、建立兩個非遞減有序單鏈表,然后合并成一個非遞增鏈表。 4、編寫一個主函數,調試上述算法。 四、選做題、思考題 1、如何用帶表頭結點的單鏈表作為多項式的存儲表示,實現兩個多項式的相加。 2、約毖夫環的實現。 3、如何利用文件實現學生信息的存取。 實驗三 棧 一、實驗目的 深入了解并掌握棧的特性及其在實際中的應用;熟練掌握棧的算法實現;運用棧操作求解實際問題。 二、預習要求 1、看懂書上的算法,深入理解棧的特性和存儲結構,以便在實際問題背景下靈活運用。 2、根據要求,編寫程序準備上機調試。 三、實驗內容 利用棧實現數據的分類,要求當輸入為偶數時進棧1,當輸入為奇數時進棧2,最后分別從棧1和棧2輸出偶數和奇數序列。 四、實現提示 1、開辟一個連續的存儲空間,實現兩個棧順序存儲空間的共享;分別在兩端設置棧頂指針,并按要求實現棧操作。 2、采用順序存儲實現棧的初始化、入棧、出棧操作。 五、選做題、思考題 1、兩棧空間共享時,棧滿的條件是什么? 2、為停車場編制進行管理的模擬程序(習題集P96,2.1)。 3、編寫程序,利用棧實現表達式求值。 實驗四 二叉樹 一、實驗目的 通過實踐掌握二叉樹的存儲結構和遍歷思想;掌握二叉樹的常見算法的程序實現。 二、預習要求 二叉樹的三種遍歷方法。 三、實驗內容 1、輸入字符序列,建立二叉鏈表。 2、利用棧,編寫非遞歸算法,編程實現二叉樹的中序遍歷。 3、求二叉樹的葉子結點個數。 4、在主函數中設計一個簡單的菜單,分別調試上述算法。 四、選做題、思考題 1、如何實現二叉樹的后序遍歷(非遞歸)。 2、如何求二叉樹的高度。 實驗五 最短路徑(旅游景點導游咨詢模擬) 一、實驗目的 利用圖的最短路徑原理為用戶提供路徑咨詢,掌握求最短路徑的算法并編程實現。 二、預習要求 學習了解圖的存儲結構,掌握求最短路徑的兩種算法。 三、實驗內容 設計一個旅游景點導游模擬程序,為來訪的客人提供景點最短路徑的信息查詢服務,任意選取n城市,構成一個有向帶權圖,圖中頂點表示城市,邊上的權值表示兩點間的距離,根據用戶指定的始點和終點輸出相應的最短路徑。 四、實現提示 咨詢以用戶和計算機的對話方式進行,由用戶輸入起始點和終點,輸出信息:最短路徑是多少?并指出所經過的城市。存儲結構可選用鄰接矩陣。 五、選做題、思考題 1.如何實現對城市信息進行編輯(如:添加或刪除)的功能。 2.用鄰接表作存儲結構,求一指定景點出發,到其余各景點的最短路徑。 實驗六 內部排序 一、實驗目的 直觀感受算法的關鍵字比較次數和關鍵字移動次數。 二、預習要求 1、常見的排序算法(插入排序、交換排序、選擇排序、歸并排序、基數排序等)的思想、特點及其適用條件。 2、根據要求,編寫程序準備上機調試。 三、實驗內容 1、對直接插入排序和簡單選擇排序算法進行關鍵字比較次數和關鍵字移動次數的比較。 2、利用鏈式存儲結構,編寫程序,實現直接插入排序和冒泡排序。 四、實現提示 測試數據可以為幾組典型的數據:正序、逆序、亂序。 五、選做題、思考題 1、快速排序算法的非遞歸實現。 2、結合實驗,理解針對不同待排元素的特點而選擇不同排序方法的重要性。 3、如何對本實驗進行時間、空間的復雜度分析。 石 家 莊 鐵 道 大 學 實 驗 任 務 書 課程名稱: 數據結構 實驗學時: 8 適用專業: 自動化類專業 開設學院: 電氣與電子工程學院 石 家 莊 鐵 道 大 學 14學年—15學年第 2學期 數據結構實驗任務書 專業名稱: 實驗學時: 2 課程名稱:數據結構 任課教師: 王明明 實驗題目:線性表的基本操作 實驗環境: Visual C++ 實驗目的: 1、掌握線性表的定義; 2、掌握線性表的基本操作,如建立、查找、插入和刪除等。 實驗內容: 定義一個包含學生信息(學號,姓名,成績)的的順序表或鏈表,使其具有如下功能:(1)根據指定學生個數,逐個輸入學生信息;(2)逐個顯示學生表中所有學生的相關信息; (3)根據姓名進行查找,返回此學生的學號和成績; (4)根據指定的位置可返回相應的學生信息(學號,姓名,成績);(5)給定一個學生信息,插入到表中指定的位置;(6)刪除指定位置的學生記錄;(7)統計表中學生個數。 實驗提示: 學生信息的定義: typedef struct { char no[8];//8位學號 char name[20];//姓名 int price;//成績 }Student; 順序表的定義 typedef struct { Student *elem;//指向數據元素的基地址 int length;//線性表的當前長度 }SqList; 鏈表的定義: typedef struct LNode{ Student data;//數據域 struct LNode *next;//指針域 }LNode,*LinkList; 實驗要求: (1)程序要添加適當的注釋,程序的書寫要采用縮進格式。 (2)程序要具在一定的健壯性,即當輸入數據非法時,程序也能適當地做出反應,如插入刪除時指定的位置不對等等。 (3)程序要做到界面友好,在程序運行時用戶可以根據相應的提示信息進行操作。(4)根據實驗報告模板詳細書寫實驗報告,在實驗報告中給出鏈表根據姓名進行查找的算法和插入算法的流程圖。 石 家 莊 鐵 道 大 學 14學年—15學年第 2 學期 數據結構實驗任務書 專業名稱: 實驗學時: 2 課程名稱:數據結構 任課教師: 李冬梅 實驗題目:棧的應用-算術表達式求值 實驗環境: Visual C++ 6.0 實驗目的: 1.掌握棧的定義及實現; 2.掌握利用棧求解算術表達式的方法。 實驗內容: 通過修改完善教材中的算法3.4,利用棧來實現算術表達式求值的算法。對算法3.4中調用的幾個函數要給出其實現過程: (1)函數In(c):判斷c是否為運算符; (2)函數Precede(t1,t2):判斷運算符t1和t2的優先級;(3)函數Operate(a,theta,b):對a和b進行二元運算theta。 程序運行時,輸入合法的算術表達式(中間值及最終結果要在0~9之間,可以包括加減乘除和括號),便可輸出相應的計算結果。如下圖: 實驗提示:(僅供參考,每個函數的具體實現可以有多種方法,希望有創新) 1.將棧的定義和實現單獨保存在頭文件“stack.h”中,然后在表達式求值的源程序sy2.cpp中包含此頭文件(即#include“stack.h”)。2.表達式求值源程序sy2.cpp的具體實現(1)主函數如下: void main(){ cout<<“請輸入算術表達式,并以#結束.”< (2)函數EvaluateExpression的實現見算法3.10(3)函數In(c)的實現可以采用以下方式: Status In(SElemType c)// 應在前面有定義typedef char SElemType;{ // 判斷c是否為運算符 switch(c){ case'+':return TRUE;??//補充完整 default:return FALSE;} }(4)函數Precede(t1,t2)的實現可以采用以下形式: SElemType Precede(SElemType t1,SElemType t2){ //根據教材表3.1,判斷兩個運算符的優先關系 SElemType f;switch(t2){ case '+': case '-':if(t1=='('||t1=='#')f='<';else f='>';break;??//補充完整 } return f;}(5)函數Operate(a,theta,b)的實現可以采用以下方式: SElemType Operate(SElemType a,SElemType theta,SElemType b){ SElemType c;a=a-48;b=b-48;switch(theta){ case'+':c=a+b+48;break;??//補充完整 } return c;} 選做內容1:進一步改進,使表達式的中間值及最終結果不局限于0~9之間的個位數。(如 果完成要在實驗報告中注明),如下圖: 選做內容2: 將表達式轉化成后綴表達式輸出,利用后綴表達式求表達式的值并輸出。 將中綴表達式轉化成后綴表達式存儲在隊列中,然后利用后綴表達式求表達式的值并輸出。 ? 將中綴表達式轉化成后綴的思想: (1)創建一空隊列,用來存放后綴表達式,建立并初始化操作符棧OPTR,將表達式起始符“#”壓入OPTR棧。 (2)依次讀入表達式中每個字符ch,循環執行(3)至(5),直至求出整個表達式轉換完畢。 (3)取出OPTR的棧頂元素,當OPTR的棧頂元素和當前讀入的字符ch均為“#”時,整個中綴表達式轉換完畢。 (4)若ch不是運算符,則進隊,讀入下一字符ch。 (5)若ch是運算符,則根據OPTR的棧頂元素和ch的優先權比較結果,做不同的處理。 ① 若是小于,則ch壓入OPTR棧,讀入下一字符ch。② 若是大于,則彈出OPTR棧頂的運算符,進隊。③ 若是等于,則OPTR的棧頂元素是“(”且ch是“)”,這時彈出OPTR棧頂的“(”,相當于去掉括號,然后讀入下一字符ch。? 對后綴表達式進行計算的具體步驟為: 建立一個棧S從左到右讀后綴表達式,讀到數字就將它轉換為數值壓入棧S中,讀到運算符則從棧中依次彈出兩個數分別到Y和X,然后以“X運算符Y”的形式計算出結果,再壓進棧S中。如果后綴表達式未讀完,重復執行上面過程,最后輸出棧頂的數值即可結束。 實驗要求: (1)程序要添加適當的注釋,程序的書寫要采用縮進格式。 (2)程序要具在一定的健壯性,即當輸入數據非法時,程序也能適當地做出反應。(3)程序要做到界面友好,在程序運行時用戶可以根據相應的提示信息進行操作。(4)根據實驗報告模板詳細書寫實驗報告,在實驗報告中給出表達式求值算法的流程圖。第三篇:《數據結構》實驗指導書
第四篇:數據結構實驗指導書
第五篇:數據結構實驗指導書(精選)