第一篇:數據結構與算法-教學編制
目 錄
1.需求分析.........................................錯誤!未定義書簽。2.概要設計.........................................錯誤!未定義書簽。3.詳細設計.........................................錯誤!未定義書簽。4.測試分析.........................................錯誤!未定義書簽。課程設計總結.......................................錯誤!未定義書簽。參考文獻...........................................錯誤!未定義書簽。
1.需求分析
根據課程之間的依賴關系制定課程安排計劃,輸入課程數及課程之間的關系。需要利用代碼實現排序,以及對各個學期課程安排進行排序并輸出。
1.1問題描述
大學的每個專業都要制定教學計劃。假設任何專業都有固定的學習年限,每學年含兩學期,每學期的時間長度和學分上限值均相等,每個專業開設的課程都是確定的,而且課程在開設時間的安排必須滿足先修關系。每門課程有哪些先修課程是確定的,可以有任意多門,也可以沒有。每門課恰好占一個學期。試在這樣的前提下設計一個教學計劃編制程序。
1.2設計思路
首先利用拓撲排序對課程先后順序進行分析,鄰接表位主要存儲結構,棧為主要輔助結構,給出課程之間的先后關系比如AOV網,然后進行拓撲排序,但當又向圖中存在環時,無法查找該圖的一個拓撲排序,當圖中的所有頂點全部輸出,表示對該圖排序成功,實現拓撲排序算法時,相應的建立鄰接表存儲AOV網,為了避免重復檢測入度為零的頂點,建立一個棧來對入度為零的頂點進行存放。根據課程的先后關系,對個學期的課程進行排序,輸出。
1.3設計環境、原理
設計環境和器材: 硬件:計算機;軟件:Microsoft Visula C++。
設計原理說明:運用圖的拓撲排序對課程先修排列的實現,并調用遞歸完成拓撲排序。
1.4實驗目的
培養學生用學到的書本知識解決實際問題的能力;培養實際工作所需要的動手能力;培養學生以科學理論和工程上能力的技術,規范地開發大型、復雜、高質量的應用軟件和系統軟件具有關鍵性作用。通過課程設計的實踐,學生可以在程序設計方法、上機操作等基本技能和科學作風方面受到比較系統和嚴格的訓練。
1.5實驗內容
針對計算機系本科課程,根據課程之間的依賴關系(如離散數學應在數據結構之前開設)制定課程安排計劃,并滿足各學期課程數目大致相同。
2.概要設計:
2.1流程圖
void FindInDegree(ALGraph G, int indegree[])//求圖中各節點的入度(如下左圖)void CreatGraph(ALGraph *G)//構件圖(如下右圖)。
void TopologicalSort_1(ALGraph G,int numterm,int uplcredit)//有向圖G采用鄰接表存儲結構(如下左圖);
void TopologicalSort_2(ALGraph G,int numterm,int uplcredit)//有向圖G采用鄰接表存儲結構(如下右圖)。
主函數: void main()
2.2抽象數據類型圖的定義 ADT Graph{
數據對象V:V是具有相同特性的數據元素的集合,稱為頂點集.數據關系R: R={VR} VR={(v,w)|v,w∈V,(v,w)表示v和w之間存在直接先修關系} 基本操作P: void CreatGraph(ALGraph *);void FindInDegree(ALGraph , int *);void TopologicalSort_1(ALGraph G,int numterm,int maxcredit);void TopologicalSort_2(ALGraph G,int numterm,int maxcredit);}ADT Graph 棧的定義: ADT Stack{ 數據對象:D={ai|ai∈ElemSet,i=1,2,…n,n>=0} 數據關系:R1={﹤ai-1 ai﹥|ai-1,ai∈D,i=2,…,n} 基本操作: void InitStack(SqStack *S);int StackEmpty(SqStack S);void Push(SqStack *S, int);int Pop(SqStack *S, int *e);}ADT Stack 2.3主程序
int main()//主函數 {
int numterm;//學期總數
int uplcredit;//一個學期的學分上限
int selectway;
ALGraph G;
printf(“請輸入學期總數:n”);
scanf(“%d”,&numterm);
printf(“請輸入一個學期的學分上限:n”);
scanf(“%d”,&uplcredit);
CreatGraph(&G);
printf(“請選擇編排策略:1.課程盡可能集中到前幾個學期;2.課程盡量均勻分布n”);
scanf(“%d”,&selectway);
if(selectway==1)
TopologicalSort_1(G,numterm,uplcredit);
if(selectway==2)
TopologicalSort_2(G,numterm,uplcredit);
system(“pause”);
return 0;} 2.4本程序只有兩個模塊,調用關系簡單
主程序模塊→拓撲排序模塊
3.詳細設計
3.1頭結點、表結點、鄰接表的定義
#define MAX_VERTEX_NUM 100 //最大課程總數 typedef struct ArcNode{ int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{ char name[24];
//課程名 int classid;
//課程號
int credit;
//課程的學分 int indegree;
//該結點的入度 int state;
//該節點的狀態 ArcNode *firstarc;//指向第一條依附該頂點的弧的指針 }VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{ AdjList vertices;int vexnum, arcnum;}ALGraph;鄰接表的基本操作:
void CreatGraph(ALGraph *);創建鄰接表
void FindInDegree(ALGraph , int *);求一個結點的入度
void TopologicalSort_1(ALGraph G,int numterm,int maxcredit);拓撲排序來編排課程
void TopologicalSort_2(ALGraph G,int numterm,int maxcredit);拓撲排序來編排課程
3.2棧的定義
#define STACk_INIT_SIZE 100 //存儲空間的初時分配量 #define STACKINCREMENT 10
//存儲空間的分配增量
typedef int ElemType;typedef struct { AdjList vertices;int vexnum, arcnum;}ALGraph;基本操作:
void InitStack(SqStack *S);棧的初始化
int StackEmpty(SqStack S);判斷棧是否為空
void Push(SqStack *S, int);入棧操作
int Pop(SqStack *S, int *e);出棧操作
3.3主程序和其他算法:
#include // exit()#include typedef int Boolean;// Boolean是布爾類型,其值是TRUE或FALSE #define MAX_NAME 10 /* 頂點字符串的最大長度 */ #define MAXCLASS 100 int Z=0;int X=0;int xqzs,q=1,xfsx;typedef int InfoType;typedef char VertexType[MAX_NAME];/* 字符串類型 */ /* 圖的鄰接表存儲表示 */ #define MAX_VERTEX_NUM 100 typedef enum{DG}GraphKind;/* {有向圖,有向網,無向圖,無向網} */ typedef struct ArcNode { int adjvex;/* 該弧所指向的頂點的位置 */ struct ArcNode *nextarc;/* 指向下一條弧的指針 */ InfoType *info;/* 網的權值指針)*/ } ArcNode;/* 表結點 */ typedef struct { VertexType data;/* 頂點信息 */ ArcNode *firstarc;/* 第一個表結點的地址,指向第一條依附該頂點的弧的指針 */ } VNode,AdjList[MAX_VERTEX_NUM];/* 頭結點 */ typedef struct { AdjList vertices,verticestwo;int vexnum,arcnum;/* 圖的當前頂點數和弧數 */ int kind;/* 圖的種類標志 */ }ALGraph;/* 圖的鄰接表存儲的基本操作 */ int LocateVex(ALGraph G,VertexType u){ /* 初始條件: 圖G存在,u和G中頂點有相同特征 */ /* 操作結果: 若G中存在頂點u,則返回該頂點在圖中位置;否則返回-1 */ int i;for(i=0;i void FindInDegree(ALGraph G,int indegree[]){ /* 求頂點的入度,算法調用 */ int i;ArcNode *p;for(i=0;i (SElemType));if(!(*S).base)exit(OVERFLOW);/* 存儲分配失敗 */(*S).top=(*S).base+(*S).stacksize;(*S).stacksize+=STACKINCREMENT;} *((*S).top)++=e;return OK;} typedef int pathone[MAXCLASS];typedef int pathtwo[MAXCLASS];Status TopologicalSort(ALGraph G){ /* 有向圖G采用鄰接表存儲結構。若G無回路,則輸出G的頂點的一個拓撲序列并返回OK, */ /* 否則返回ERROR。*/ int i,k,j=0,count,indegree[MAX_VERTEX_NUM];SqStack S;pathone a;pathtwo b;ArcNode *p;FindInDegree(G,indegree);/* 對各頂點求入度indegree[0..vernum-1] */ InitStack(&S);/* 初始化棧 */ for(i=0;i while(q<=xqzs){ int C=0;if(X<=G.arcnum){ while(C<=xfsx){C+=*G.verticestwo[Z].data;++Z;} printf(“第%d個學期應學課程:”,q);while(X<=Z){cout<<*G.vertices[X].data<<“ ”;++X;} cout< 4.用戶使用和說明 使用VC++,打開sjjg.cpp文件,接著編譯,無錯誤,然后重建也沒有錯誤,最后執行該文件。顯示如下圖: 要求輸入學期總數、一個學期的學分上限、需要編排課程總數、課程名、課程號、該課程的學分,按照出現的每一步來輸入該課程設計所提供的相關數據。然后還要輸入課程先修課程總數,依據教科書圖7.26,可以算出有16種關系,分別輸出如下圖所示。接著程序會根據這些數據,自動生成建立好的鄰接表,用戶可以根據系統顯示的選擇編排策略進行選擇,有兩種編排策略,最后結果體現在實驗的正確測試結果里(如上圖)。 5.調試分析 5.1實驗過程中出現的問題及解決方法 我們在實驗過程中遇到的最大難題是兩個課程排序算法的編寫。剛開始的時候沒有任何的思路,網上也只有拓撲排序的算法,對于課程設計要求的排序算法沒有任何頭緒。經過請教老師和同學以及翻閱了一些相關書籍,并在網上的搜索有了排序算法的大體思路。經過三天的修改,終于寫出了符合要求的排序算法。 5.2測試數據 學期總數:6;學分上限:10;該專業共開設12門課,課程號從01到12,學分順序為2,3,4,3,2,3,4,4,7,5,2,3。 5.3測試結果(包含正確和錯誤的) 正確測試結果: 錯誤測試結果: 5.4測試數據及程序運行情況 輸入的內容如下: 課程編號 課程名稱 學分 先決條件 01 程序設計基礎 無 02 離散數學 01 03 數據結構 01,02 04 匯編語言 01 05 語言的設計和分析 03,04 06 計算機原理 07 編譯原理 05,03 08 操作系統 03,06 09 高等數學 無 10 線性代數 09 11 普通物理 09 12 數值分析 09,10,01 兩種編排方法都輸出結果為: 第一學期學的課程有:高等數學程序設計基礎; 第二學期學的課程有:普通物理 線性代數 匯編語言; 第三學期學的課程有:數值分析 計算機原理 離散數學; 第四學期學的課程有:數據結構; 第五學期學的課程有:操作系統 語言的設計和分析; 第六學期學的課程有:編譯原理。 6.總結 剛開始學的時候確實有很多地方我很不理解,每次上課時老師都會給我們出不同的設計題目,對于我們一個初學者來說,無疑是一個具大的挑戰,撞了幾次壁之后,我決定靜下心來,仔細去寫程序。老師會給我們需要編程的內容一些講解,順著老師的思路,來完成自己的設計,我們可以開始運行自己的程序,可是好多處的錯誤讓人看的可怕,還看不出到底是哪里出現了錯誤,但是程序還是得繼續下去,我多次請教了老師和同學,逐漸能自己找出錯誤,并加以改正。經過了這次課程設計,現在已經可以了解很多錯誤在英文里的提示,這對我來說是一個突破性的進步,眼看著一個個錯誤通過自己的努力在我眼前消失,覺得很是開心。此次的程序設計能夠成功,是我和我的同學三個人共同努力作用的結果。在這一段努力學習的過程中,我們的編程設計有了明顯的提高。 其實現在想起來,收獲還真是不少,雖然說以前非常不懂這門語言,在它上面花費了好多心血,覺得它很難,是需用花費了大量的時間編寫出來的。現在真正的明白了一些代碼的應用,每個程序都有一些共同點,通用的結構,相似的格式。同時也對教學編制問題有了進一步的認識。只要努力去學習,就會靈活的去應用它。 7.參考文獻 [1]《數據結構》(C語言版),嚴蔚敏,清華大學出版社,2003。[2]《數據結構題集》,嚴蔚敏,清華大學出版社,2005。[3]《數據結構》(C語言版),劉大有,高等教育出版社,2004。[4]《Data Structure with C++》,William Ford.William Topp,清華大學出版社,2003。 算法與數據結構總結 算法與數據結構這一門課程,就是描述了數據的邏輯結構,數據的存儲結構,以及數據的運算集合在計算機中的運用和體現。數據的邏輯結構就是數據與數據之間的邏輯結構;數據的存儲結構就包含了順序存儲、鏈式存儲、索引存儲和散列存儲。在這學期當中,老師給我們主要講了順序存儲和鏈式存儲。最后數據的運算集合就是對于一批數據,數據的運算是定義在數據的邏輯結構之上的,而運算的具體實現依賴于數據的存儲結構。 通過這學期的學習,讓我在去年C語言的基礎上對數據與數據之間的邏輯關系有了更深的理解和認識。以前在學Matlab這一課程的時候,我們如果要實現兩個數的加減乘除,或者一系列復雜的數據運算,就直接的調用函數就行,套用規則符號和運算格式,就能立馬知道結果。在學習C語言這一課程時,我們逐漸開始了解函數的調用的原理,利用子函數中包含的運算規則,從而實現函數的功能。現今學習了算法,讓我更深層次的知道了通過順序表、指針、遞歸,能讓數據算法的實現更加的簡潔,明了,更易于理解。摒棄了數據的冗雜性。 在本書第二章中,主要介紹了順序表的實現以及運用。順序表中我認為最重要的是一個實型數組,和順序表的表長,不論是在一個數據的倒置、插入、刪除以及數據的排序過程中,都能將數據依次存入數組當中,利用數組下標之間的關系,就能實現數據的一系列操作了。在存儲棧中,給我留下最深刻的映像就是“先進后出”,由于它特殊的存儲特性,所以在括號的匹配,算術表達式中被大量應用。在存儲隊列之中,數據的刪除和存儲分別在表的兩端進行操作,所以存儲數據很方便。為節省隊列浪費閑置空間的這一大缺點,所以引入了循環隊列這一概念,很好用。 在第三章中,主要講的是鏈式存儲特性。它最突出的優點就是可以選擇連續或者不連續的存儲空間都行。所以,不管是數據在插入或者刪除一個數據時,會很方便,不會像順序表那樣,要移動數組中的諸多元素。所以鏈表利用指針能很方便的進行刪除或者插入操作。而鏈式在棧和隊列的基礎上,也有了多方面的應用,所以在這些方面有了更多的應用。 第四章字符串中,基本的數組內部元素的排序和字符串的匹配大部分代碼自己還是能夠理解,能夠看懂,如果真的要將所學的大量運用于實踐的話,那就要多花些功夫和時間了。在對稱矩陣的壓縮,三角矩陣的壓縮,稀疏矩陣在存儲中能夠合理的進行,能大大提高空間的開支。 在第五章遞歸當中,就是在函數的定義之中出現了自己本身的調用,稱之為遞歸。而遞歸設計出來的程序,具有結構清晰,可讀性強,便于理解等優點。但是由于遞歸在執行的過程中,伴隨著函數自身的多次調用,因而執行效率較低。如果要在追求執行效率的情況下,往往采用非遞歸方式實現問題的算法程序。 在第六章數型結構當中,這是區別于線性結構的另一大類數據結構,它具有分支性和層次性。它是數據表示,信息組織和程序設計的基礎和工具。在本章中,映像深刻的是樹的存儲結構。有雙親表示法,孩子表示法,以及孩子兄弟表示法。在表示怎樣存儲數據之后,接著要從數型結構中將數據讀取出來,于是,有了樹的遍歷,在遍歷當中,又分為前序、中序和后序遍歷,這三種遍歷各有各的特點。 在第七章中,說到了樹的擴展---二叉樹。二叉樹不同一般的樹型結構的另一種重要的非線性結構,它是處理兩種不同的數據結構,許多涉及樹的算法采用二叉樹表示和處理更加便捷和方便。其他的也是和一般的二叉樹差不多。還多了一個樹、森林和二叉樹之間的轉換。 第八章的圍繞著圖來展開,它是一種復雜的非線性結構,在人工智能、網絡工程、數學、并行計算和工業設計有著廣泛的應用。圖最重要的由一個非空的頂點集合和一個描述頂點之間的多對多關系的邊集合組成的一種數據結構。圖的存儲室通過鄰接矩陣老存儲圖的信息。而圖的讀取是通過深度優先遍歷和廣度優先遍歷實現。生成最小生成樹有Prim算法和Kruskal算法,相對于這兩種算法,后一種算法要更加易于理解。 在考試的時候,我以為老師只會出題作業部分。然后書中有一小部分就沒看,但是題中出現了一個二叉樹轉換為森林的時候,我有印象,但就是沒思路想法了,就沒做。從中我真的理解了老師說的,考試不代表學習的結束。或者你現在看的內容在生活中學習中暫時沒有太大的作用,但是到了某一特定的環境條件下,總會有作用。所以,學習是一個積累的過程,不懈怠,踏實的走下去,你才會有所收獲。 金陵科技學院實驗報告 學 生 實 驗 報 告 冊 課程名稱: 學生學號: 所屬院部: (理工類) 算法與數據結構 專業班級: 13網絡工程 1305106009 學生姓名: 陳韜 網絡與通信工程學院 指導教師: 沈奇 14 ——20 15 學年 第 1 學期 金陵科技學院教務處制 金陵科技學院實驗報告 實驗報告書寫要求 實驗報告原則上要求學生手寫,要求書寫工整。若因課程特點需打印的,要遵照以下字體、字號、間距等的具體要求。紙張一律采用A4的紙張。 實驗報告書寫說明 實驗報告中一至四項內容為必填項,包括實驗目的和要求;實驗儀器和設備;實驗內容與過程;實驗結果與分析。各院部可根據學科特點和實驗具體要求增加項目。 填寫注意事項 (1)細致觀察,及時、準確、如實記錄。(2)準確說明,層次清晰。 (3)盡量采用專用術語來說明事物。 (4)外文、符號、公式要準確,應使用統一規定的名詞和符號。(5)應獨立完成實驗報告的書寫,嚴禁抄襲、復印,一經發現,以零分論處。 實驗報告批改說明 實驗報告的批改要及時、認真、仔細,一律用紅色筆批改。實驗報告的批改成績采用百分制,具體評分標準由各院部自行制定。 實驗報告裝訂要求 實驗批改完畢后,任課老師將每門課程的每個實驗項目的實驗報告以自然班為單位、按學號升序排列,裝訂成冊,并附上一份該門課程的實驗大綱。 金陵科技學院實驗報告 實驗項目名稱: 順序表 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗1 順序表 一、實驗目的和要求 掌握順序表的定位、插入、刪除等操作。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)編寫程序建立一個順序表,并逐個輸出順序表中所有數據元素的值。編寫主函數測試結果。 (2)編寫順序表定位操作子函數,在順序表中查找是否存在數據元素x。如果存在,返回順序表中和x值相等的第1個數據元素的序號(序號從0開始編號);如果不存在,返回-1。編寫主函數測試結果。(3)在遞增有序的順序表中插入一個新結點x,保持順序表的有序性。 解題思路:首先查找插入的位置,再移位,最后進行插入操作;從第一個元素開始找到第一個大于該新結點值x的元素位置i即為插入位置;然后將從表尾開始依次將元素后移一個位置直至元素i;最后將新結點x插入到i位置。 (4)刪除順序表中所有等于X的數據元素。 2、選做題 (5)已知兩個順序表A和B按元素值遞增有序排列,要求寫一算法實現將A和B歸并成一個按元素值遞減有序排列的順序表(允許表中含有值相同的元素)。 程序清單: #include 金陵科技學院實驗報告 } sequenlist;sequenlist L={{1,3,5,5,7,8,10,12,17},8};void print_list(){ int i;for(i=0;i<=L.last;i++)printf(“%4d”,L.data[i]);} void find_all_x(int x){ int found=0,i;for(i=0;i<=L.last;i++)if(L.data[i]==x){ printf(“%3d”,i+1);found=1;} if(found==0)printf(“-1n”);} void insert_x(int x){ int loc,i;for(i=0;i<=L.last;i++)if(x 金陵科技學院實驗報告 loc=i;for(i=L.last;i>=loc;i--)L.data[i+1]=L.data[i];L.data[loc]=x;L.last++;} void delete_x(int x){ int i,j,found=0;for(i=0;i<=L.last;i++)if(x==L.data[i]){ found=1;for(j=i+1;j<=L.last;j++)L.data[j-1]=L.data[j];i--;L.last--;} if(found==0)printf(“x is not foundn”);else { printf(“x is deletedn”);printf(“the list after deletion is:n”);print_list(); 金陵科技學院實驗報告 } } void main(){ int x,choice;while(1){ printf(“**********menu**********n”);printf(“ 1--printn”);printf(“ 2--searchn”);printf(“ 3--insertn”);printf(“ 4--deleten”);printf(“ 5--exitn”);printf(“please input your choice:”);scanf(“%d”,&choice); switch(choice){case 1: printf(“the original list is:n”);print_list();break;case 2: printf(“pls input x you want to search:n”); 金陵科技學院實驗報告 scanf(“%d”,&x);find_all_x(x);break;case 3: printf(“pls input x you want to insert:n”);scanf(“%d”,&x);insert_x(x);printf(“the list after insertion is:n”);print_list();break;case 4: printf(“pls input x you want to delete:n”);scanf(“%d”,&x);delete_x(x);printf(“the list after deletion is:n”);print_list();break;case 5: exit(0);} } } 金陵科技學院實驗報告 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 單鏈表 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗2 單鏈表 一、實驗目的和要求 1、實驗目的 掌握單鏈表的定位、插入、刪除等操作。 2、實驗要求 (1)注意鏈表的空間是動態分配的,某結點不用之后要及時進行物理刪除,以便釋放其內存空間。 (2)鏈表不能實現直接定位,一定注意指針的保存,防止丟失。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)編寫程序建立一個單鏈表,并逐個輸出單鏈表中所有數據元素。(2)在遞增有序的單鏈表中插入一個新結點x,保持單鏈表的有序性。 解題思路:首先查找插入的位置然后進行插入操作;從第一個結點開始找到第一個大于該新結點值的結點即為插入位置;然后在找到的此結點之前插入新結點;注意保留插入位置之前結點的指針才能完成插入操作。 (3)編寫實現帶頭結點單鏈表就地逆置的子函數,并編寫主函數測試結果。 2、選做題 已知指針LA和LB分別指向兩個無頭結點單鏈表的首元結點。要求編一算法實現,從表LA中刪除自第i個元素起共len個元素后,將它們插入到表LB中第j個元素之前。程序清單: 金陵科技學院實驗報告 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 堆棧和隊列 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗3 堆棧和隊列 一、實驗目的和要求 (1)掌握應用棧解決問題的方法。(2)掌握利用棧進行表達式求和的算法。 (3)掌握隊列的存儲結構及基本操作實現,并能在相應的應用問題中正確選用它們。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)判斷一個算術表達式中開括號和閉括號是否配對。(2)測試“漢諾塔”問題。 (3)假設稱正讀和反讀都相同的字符序列為”回文”,試寫一個算法判別讀入的一個以’@’為結束符的字符序列是否是“回文”。 2、選做題 在順序存儲結構上實現輸出受限的雙端循環隊列的入列和出列算法。設每個元素表示一個待處理的作業,元素值表示作業的預計時間。入隊列采取簡化的短作業優先原則,若一個新提交的作業的預計執行時間小于隊頭和隊尾作業的平均時間,則插入在隊頭,否則插入在隊尾。程序清單: 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 金陵科技學院實驗報告 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 串 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗4 串 一、實驗目的和要求 掌握串的存儲及應用。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)編寫輸出字符串s中值等于字符ch的第一個字符的函數,并用主函數測試結果。 (2)編寫輸出字符串s中值等于字符ch的所有字符的函數,并用主函數測試結果。 解題思路:可以將第一題程序改進成一個子函數,在本題中循環調用。(3)設字符串采用單字符的鏈式存儲結構,編程刪除串s從位置i開始長度為k的子串。 2、選做題 假設以鏈結構表示串,編寫算法實現將串S插入到串T中某個字符之后,若串T中不存在這個字符,則將串S聯接在串T的末尾。 提示:為提高程序的通用性,插入位置字符應設計為從鍵盤輸入。程序清單: 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 金陵科技學院實驗報告 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 二叉樹 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗5 二叉樹 一、實驗目的和要求 (1)掌握二叉樹的生成,以及前、中、后序遍歷算法。(2)掌握應用二叉樹遞歸遍歷思想解決問題的方法。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)建立一棵二叉樹。對此樹進行前序遍歷、中序遍歷及后序遍歷,輸出遍歷序列。 (2)在第一題基礎上,求二叉樹中葉結點的個數。(3)在第一題基礎上,求二叉樹中結點總數。(4)在第一題基礎上,求二叉樹的深度。 2、選做題 已知一棵完全二叉樹存于順序表sa中,sa.elem[1…sa.last]存儲結點的值。試編寫算法由此順序存儲結構建立該二叉樹的二叉鏈表。 解題思路:根據完全二叉樹順序存儲的性質來確定二叉樹的父子關系即“還原”了二叉樹,之后再按照二叉樹二叉鏈表的構造方法進行建立。完全二叉樹順序存儲的一個重要性質為,第i個結點的左孩子是編號為2i的結點,第i個結點的右孩子是編號為2i+1的結點。程序清單: 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 金陵科技學院實驗報告 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 圖 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗6 圖 一、實驗目的和要求 (1)熟練掌握圖的基本概念、構造及其存儲結構。 (2)熟練掌握對圖的深度優先搜索遍歷和廣度優先搜索遍歷的算法。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)構造一個無向圖(用鄰接矩陣表示存儲結構)。 (2)對上面所構造的無向圖,進行深度優先遍歷和廣度優先遍歷,輸出遍歷序列。 2、選做題 采用鄰接表存儲結構,編寫一個判別無向圖中任意給定的兩個頂點之間是否存在一條長度為k的簡單路徑的算法。簡單路徑是指其頂點序列中不含有重復頂點的路徑。提示:兩個頂點及k值均作為參數給出。程序清單: 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 排序 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗7 排序 一、實驗目的和要求 (1)熟練掌握希爾排序、堆排序、直接插入排序、起泡排序、快速排序、直接選擇排序、歸并排序和基數排序的基本概念。 (2)掌握以上各種排序的算法。區分以上不同排序的優、缺點。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 用隨機數產生100000個待排序數據元素的關鍵字值。測試下列各排序函數的機器實際執行時間(至少測試兩個):直接插入排序、希爾排序(增量為4,2,1)、冒泡排序、快速排序、直接選擇排序、堆排序。 2、選做題 假設含n個記錄的序列中,其所有關鍵字為值介于v和w之間的整數,且其中很多關鍵字的值是相同的。則可按如下方法排序:另設數組number[v…w],令number[i]統計關鍵字為整數i的紀錄個數,然后按number重排序列以達到有序。試編寫算法實現上述排序方法,并討論此種方法的優缺點。程序清單: 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 金陵科技學院實驗報告 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 金陵科技學院實驗報告 實驗項目名稱: 查找 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗8 查找 一、實驗目的和要求 (1)掌握順序表查找、有序表查找、索引順序表查找的各種算法。(2)掌握哈希表設計。 二、實驗儀器和設備 Turbo C 2.0/ Visual C++ 三、實驗內容與過程(含程序清單及流程圖) 1、必做題 (1)在一個遞增有序的線性表中利用二分查找法查找數據元素X。 2、選做題 (2)構造一個哈希表,哈希函數采用除留余數法,哈希沖突解決方法采用鏈地址法。設計一個測試程序進行測試。 提示:構造哈希表只是完成查找的第一步,大家應該掌握在哈希表上進行查找的過程,可以試著編程序實現。程序清單: 金陵科技學院實驗報告 四、實驗結果與分析(程序運行結果及其分析) 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 《數據結構與算法》課程學習總結報告 100401200510計本(4)班章興春 本學期所學習的《數據結構與算法》課程已經告一段落,就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。以便在所學習知識有更深刻的認識。 一、《數據結構與算法》知識點: 學習數據結構之前、一直以為數據結構是一門新的語言、后來才知道學習數據結構是為了更加高效的的組織數據、設計出良好的算法,而算法則是一個程序的靈魂。經過了一學期的數據結構了,在期末之際對其進行總結。首先,學完數據結構我們應該知道數據結構講的是什么,數據結構課程主要是研究非數值計算的研究的程序設計問題中所出現的計算機處理對象以及它們之間關系和操作的學科。 第一章主要介紹了相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。 第二章具體地介紹了順序表的定義、特點及其主要操作,如查找、插入和刪除的實現。需要掌握對它們的性能估計。包括查找算法的平均查找長度,插入與刪除算法中的對象平均移動次數。 鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。 第三章介紹了堆棧與隊列這兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。算法上要求掌握進棧、退棧、取棧頂元素、判棧空盒置空棧等五種操作及掌握使用元素個數計數器及少用一個元素空間來區分隊列空、隊列滿的方法。 第四章串和數組中,我們知道串是一種特殊的線性表,是由零個或多個任意字符組成的字符序列。串的儲存結構分為緊縮模式和非緊縮模式。 基本運算需掌握求串長、串賦值、連接操作、求子串、串比較、串定位、串插入、串刪除、串替換等。 第五章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。 樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。 第六章介紹了圖的概念及其應用,圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。 最后兩章集體說明了查找和排序算法,查找教材上介紹了靜態查找表和哈希查找表,靜態查找表中介紹了順序查找、折半查找以及分塊查找。哈希法中,學習要點包括哈希函數的比較;解決地址沖突的線性探查法的運用,平均探查次數;解決地址沖突的二次哈希法的運用。 排序是使用最頻繁的一類算法,可分為內部排序和外部排序。主要需要理解排序的基本概念,在算法上、需要掌握插入排序(包括直接插入排序算法、折半插入排序算法),交換排序(包括冒泡排序算法、快速排序遞歸算法),選擇排序(包括直接選擇排序算法、堆排序算法)等。 二、對各知識點的掌握情況 總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象。現將各個章節出現的知識點理解情況列舉如下。 第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。 第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。 鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。 接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。 在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。 第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。 第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。 散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。 最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。 由于平時上機練習的少,對于教材中很多算法都掌握的不是很熟悉、不過這些都是可以彌補的,我會在剩下的時間中不斷練習書上給出的算法和練習,正如教材上說的,學習數據結構,僅從書本上學習是不夠的,必須經過大量的程序設計實踐,在實踐中體會構造性思維方法,掌握數據組織與程序設計技術。 三、學習體會: 多做實驗!這個就沒有太多理由了,我一直覺得編程是一門熟練科學,多編程,水平肯定會提高,最重要的是能夠養成一種感覺,就是對程序對算法的敏感,為什么那些牛人看一個算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了過了一陣子又忘記了?其實這個是因為牛人們以前看的程序很多,編得也很多,所以他們有了那種感覺,所以我覺得大家應該多看程序,多寫程序,培養自己的感覺。 復習和考試的技巧,我想大家應該都有這樣的感覺,就是覺得自己什么都掌握了,但是在考試的時候就是會犯暈,有時候一出考場就知道錯在哪個了,然后考完以后一對答案,發現其實考得很簡單,應該都是自己會做的,這個就是與自己的復習和考試的技巧有關系了。 首先就是復習,前面已經說過其實我們學的算法也就是幾十個,那么我們的任務也就是理解這幾十個算法,復習也就是要加深你的理解。如何理解算法,然后理解到什么程度呢? 是能默出整個算法嗎?其實不是這樣的,數據結構的考試有它的特點,考過程考試了,大家應該都發現數據結構其實不要求你把整個算法背出來,它注重考察你的理解,那么怎么考察呢?其實也就是兩種方式吧,一種就是用實例,就是給你一個例子,要你用某個算法運行出結果,我想這個期末考試的時候仍然會有很多這樣的題目,比如排序那塊就很好出這樣的題目,要復習這種題目我覺得很簡單,就是每個算法都自己用例子去實踐一下,以不變應萬變,我期中復習的時候就是這樣去做的,而且考試之前我就覺得那個并查集的題目就很有可能會考,于是就自己出了幾個例子,做了一下。另外一種考察方式就是算法填空和算法改錯,可能有一些同學覺得這種題目很難,其實我們首先可以確定這兩種題目肯定是與書上算法有關系的,只要理解了書上的算法就可以了,有人覺得看完書以后什么都懂了,而且要默也默得出來,其實不是這樣的,算法改錯和填空主要是考察的細微處,雖然你覺得你默得出來,那是能夠默出算法的主體部分,很多細微的地方你就會很容易忽略。我想大家考過期中考以后應該都有這種感覺吧?那要怎樣解決這種問題呢? 我覺得有兩種方法,一種就是自己去編程實現,這種方法比較有意義,還能夠提高編程水平,另外一種就是用實例分析算法的每句話,我認為這種方法是最有效的。 然后還有一種題目,就是最后的寫算法的題目,我覺得這種題目還是很好解決的,只要是能夠自己做出作業的,基本上都會很容易做出來,這也是為什么我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心,尤其是題目簡單的時候,那肯定會有一些小地方要考慮清楚,一不小心就會被扣掉很多分,這樣很不值。 我覺得考試的時候沒有太多要講的,只要復習好了,考試的時候細心一點就可以了,然后就是做一個題目開始就要盡量保證正確,如果覺得留在那里等后面做完了再來檢查,這樣錯誤還是很有可能檢查不出來,我期中考試的時候就基本上沒有檢查,因為我做每個題目都是確保正確,用的時間也挺多的,然后也覺得沒有檢查的必要了。 三、對《數據結構與算法》課程教學的建議 1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。 2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。 3、要更加重視實驗的重要性。 以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進! 《數據結構與算法》課程學習總結報告 070401301507計本(3)班張浩 本學期開設的《數據結構與算法》課程已經告一段落,現就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。 一、《數據結構與算法》知識點 在課本的第一章便交代了該學科的相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。緊接著介紹了一些常用的數據運算。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。 第二章具體地介紹了順序表的概念、基本運算及其應用。基本運算有:初始化表、求表長、排序、元素的查找、插入及刪除等。元素查找方法有:簡單順序查找、二分查找和分塊查找。排序方法有:直接插入排序、希爾排序、冒泡排序、快速排序、直接選擇排序及歸并排序等。最后介紹了順序串的概念,重點在于串的模式匹配。 鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。 堆棧與隊列是兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。 第六章介紹了特殊矩陣和廣義表的概念與應用。其中,特殊矩陣包括對稱矩陣、三角矩陣、對角矩陣和稀疏矩陣,書中分別詳細介紹了它們的存儲結構。稀疏矩陣的應用包括轉置和加法運算等。最后介紹了廣義表的相關概念及存儲結構,關于它的應用,課本中舉了m元多項式的表示問題。 第七章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。 樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。散列結構是一種查找效率很高的一種數據結構。本章的主要知識點有:散列結構的概念及其存儲結構、散列函數、兩種沖突處理方法、線性探測散列和鏈地址散列的基本算法以及散列結構的查找性能分析。 最后一章介紹了圖的概念及其應用,是本書的難點。圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。 二、對各知識點的掌握情況 總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象。現將各個章節出現的知識點理解情況列舉如下。 第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。 第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。 鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。 接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。 在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。 第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。 第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。 散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。 最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。 三、學習體會 接觸這門課程以前,我對該課程所學的內容有許多疑點,例如:這門課是否是在介紹一種新的計算機語言?如果不是,那么學習這門課程的用途是什么?為什么市面上各種介紹數據結構的資料采用了不同的計算機語言,如C、C++還有Java?我的C語言學得不好,對學習這門課是否有影響?? 在學習伊始,老師就明確提出它不是一種計算機語言,不會介紹新的關鍵詞,而是通過學習可以設計出良好的算法,高效地組織數據。一個程序無論采用何種語言,其基本算法思想不會改變。聯系到在大一和大二上學期學習的C和C++語言,我深刻認識到了這一點。“軟件開發好比寫作文,計算機語言提供了許多華麗的辭藻,而數據結構則考慮如何將這些辭藻組織成一篇優秀的文章來。”在學習這門課中,要熟悉對算法思想的一些描述手段,包括文字描述、圖形描述和計算機語言描述等。因此,計算機語言基礎是必須的,因為它提供了一種重要的算法思想描述手段——機器可識別的描述。 這門課結束之后,我總結了學習中遇到的一些問題,最為突出的,書本上的知識與老師的講解都比較容易理解,但是當自己采用剛學的知識點編寫程序時卻感到十分棘手,有時表現在想不到適合題意的算法,有時表現在算法想出來后,只能將書本上原有的程序段謄寫到 自己的程序中再加以必要的連接以完成程序的編寫。針對這一情況,我會嚴格要求自己,熟練掌握算法思想,盡量獨立完成程序的編寫與修改工作,只有這樣,才能夠提高運用知識,解決問題的能力。 四、對《數據結構與算法》課程教學的建議 1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。 2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。 以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進!第二篇:算法與數據結構總結
第三篇:算法與數據結構實驗
第四篇:數據結構與算法總結
第五篇:數據結構與算法總結