第一篇:《數據結構》課程實驗報告
實驗一 基于二叉鏈表的二叉樹的實現
4.1 問題描述
基于二叉鏈表和隊列及其堆棧存儲結構,實現二叉鏈表的二叉樹的對數據進行各種必要的操作。
4.2 系統設計
1.2.1提供20個功能,分別是:
1.2.2二叉鏈表的結構試一堆棧和隊列的形式進行儲存的分別是:
1.2.3在程序中所定義的數據結構有:
2.3 系統實現
1.3.1 InitTree功能
初始二叉鏈表,傳入的是頭結點地址。申請一個存儲空間,并用頭結點中的首結點指針指向該空間首地址,相應的 時間復雜度為1。具體實現如下:
1.3.2 DestroyTree功能
銷毀頭結點中首結點址針指向的線性存儲空間,傳入的是頭結點地址。具體實現如下:
1.3.3 CreateBiTree功能
與DestroyBiTree類似但是又有不同,ClearBiTree并不銷毀物理空間,而是修改邏輯關系值:
1.3.4 ClearBiTree功能
與DestroyBiTree類似但是又有不同,ClearBiTree并不銷毀物理空間,而是修改邏輯關系值
1.3.5 BiTreeEmpty功能
判空功能,判斷表是否為空表。時間復雜度為1,因為只需判斷一次就可以知道是否為空。實現如下:
1.3.6 BiTreeDepth功能
求二叉鏈表深度的功能,由于創建過程中已經把表長信息包含在頭結點中,所以直接調用并顯示即可
1.3.7 Root(BiTree T)功能
獲取二叉鏈表的根節點的元素,通過遍歷二叉鏈表中的元素,來逐個判斷,時間復雜度為(n)。
1.3.8 Value(BiTree T,TElemType e)功能
求指定元素的前一個元素的內容,傳入頭結點值、包含指定元素信息的一個臨時表結點值、存儲前一個元素的表結點地址。主要思路是遞歸算法。時間復雜度為O(n)。具體實現如下:
1.3.9 Assign功能
求指定元素的后一個元素的內容,傳入頭結點值、包含指定元素信息的一個臨時表結點值、存儲前一個元素的表結點地址。找到后,把新的數據值賦給所找到的節點。時間復雜度為O(n)。具體實現如下:
1.3.10 Parent功能
找雙親節點,找到后輸出
1.3.11 LeftChild功能
查找左孩子,利用遞歸的算法,與遍歷的時間復雜度為相同O(n)
1.3.12RightChild功能
查找右孩子,利用遞歸的算法,與遍歷的時間復雜度為相同O(n)
1.3.13 LeftSibling功能
查找節點的左邊的堂兄弟的,找到后輸出該節點的數據
1.3.14 RightSibling功能
查找節點的右邊的堂兄弟的,找到后輸出該節點的數據
1.3.15 InsertChild函數 在二叉鏈表中插入新的節點
1.3.15 DeleteChild功能
刪除指定編號的數據元素,傳入頭結點地址、編號i、表結點類型結構體地址來返回被刪除元素內容。執行前先判斷傳入的編號是否在可尋找范圍內。執行刪除操作之后,進行“移位”運算。時間復雜度仍為O(n)。如下:
1.3.16 PreOrderTraverse功能
前序遍歷二叉鏈表中的數據,采用先遍歷左孩子,再訪問根節點,后訪問右孩子的思想來實現前序遍歷的算法的。
1.3.17 InOrderTraverse功能
中序遍歷的函數,對二叉鏈表的數據進行訪問,并且利用PreOrderTraverse函數
1.3.18 PostOrderTraverse功能
采用后續遍歷的思想,利用先序遍歷的函數進行
1.3.19 LevelOrderTraverse功能
完全遍歷二叉鏈表中的數據,并進行輸出的
1.3.20 Point功能 定位節點的函數,在需要查找二叉鏈表二叉樹的節點的時候,可以直接調用該函數,進行處理,相應的代碼如下
1.3.21 FILE * fileOpen功能
讀取功能,通過fscanf實現格式化讀取,同時結合CreateList函數實現順序
1.3.22 BiTNode * Create(FILE *fp)功能 把二叉鏈表二叉樹的數據寫入到文件中去
1.4效率分析
在上面介紹各功能時已經提到時間復雜度的計算了,這里再簡單分析一下。
具有同數量級復雜度的功能在實現方法上一般近似。
比如InOrderTraverse,PostOrderTraverse,BiTreeDepth,LevelOrderTraverse 它們都是基于PreOrderTraverse 來設計的,所以效率都是O(n);
而Root,Value,Assign,Parent,LeftChild,RightChild,LeftSibling RightSibling,InsertChild,DeleteChild 是基于VisitPoint,平均效率為O(n);
InitTree
DestroyBiTree所需信息,所以效率為O(1);
CreateBiTreeClearBiTreeBiTreeEmpty都要對二叉鏈表,平均效率為O(n)。
實驗總結與評價
我做了這個實驗發現自己的編程能力很不好,自己的腦袋中有相應的想法和主意,但是因為自己的編程能力很不好也就實現不了自己的想法。
二叉鏈表的二叉樹的時候,實現二叉鏈表線性的對我來說還可以實現,因為線性的所用到方法和技術,在學習十字鏈表的時候練習的比較少,實現起來難度是很大。特別是有了老師給的框架以后,我們要做的任務就是向里面填我們自己寫的函數,在填寫的過程中,我深深的感受到了,認真的重要性,因為我在寫好調試的中發現了很多,因為自己的不小心和在敲代碼的過程中的不認真而造成的很不應該的錯誤,這些錯誤也給自己在調試的過程中也造成了很大的麻煩,因為是不認真而犯的錯誤,因此調試的過程中也很不好發現。
對我來說,因為我的C語言的功底很不好,運用指針和鏈表的能力還沒有能達到運用自如,理解深刻的地步,所以在順序鏈表的鏈表的實現中,對我來說是一個很大的挑戰,我有很多不會的地方通過自己看書,問室友和上網查詢,一點一點的寫了出來,肯定現在還是會有很多的問題,但是這也是我一直在努力把它做的更好,在調試的中出現了很多的BUG,自己一個個的慢慢的消除掉了,做出了,現在的程序。
如果問自己的體會,那一定是希望我自己以后多多的動手,把以前C語言的書好好再復習一遍,還有就是把現在正在學習的數據結構的書上各個程序,自己要一個個的敲一遍,練習一下自己的熟悉程度。
總的來說,我對這次的實驗是很有感觸的。因為,這次實驗讓我認識到了,自己的編程能力的低下,如果自己再不下一下功夫的話,那么數據結構的考試自己就十分的危險了。因此,我要加緊復習C語言的知識和數據結構學過的內容,爭取自己能在接下來的學習中能有些進步。
附錄:
參考書《數據結構》(C語言版)嚴蔚敏 吳偉民編著
《C語言程序設計》 曹計昌,李開編著
實驗心得體會
對于這兩次的實驗,我自己的體會是很深刻的,也是記憶深刻的。因為,正是因為這兩次的實驗深深地讓我認識到了自己的水平是多么的低下,以前,自己還有點夜郎自大的認為,自己對所學的東西,自己掌握的還差不多了呢。但是,經過這次的實驗,我真的是清楚的發現自己對所學的知識的掌握還差的很多,自己還有很多的功課要補。
第一,以前無論是學習C語言還是數據結構,我的方法是拿著書本看,還有就是拿著練習本寫一寫,而自己家上機的實踐的時間是非常少的,因為我感覺上機得到的結構一定會和自己想的和寫的一樣呢,顯然,我是錯誤的,因為在這次的實驗里我就發現,即使是書上一模一樣的代碼,在機子上也是有很大 的可能出錯的,更不用說是自己寫的了,在寫線性表,線性鏈表和二叉鏈表的時候,我出現了用書上的代碼不能用的情況,而且是非常嚴重的錯誤。有些聲明和指針的問題會出現很大的不同。我的體會是,從現在起,重視上機的過程,多書上的程序一定要在機子上跑一下,然后再分析一下,出現這種結果的原因和整個程序的流程。
第二,就是實驗的 時候的規范的問題,由于,自己寫代碼沒有很好的習慣和規則,于是,在自己寫好的程序出現錯誤后自己不能夠很快的 找到出現錯誤的位置,比如,對全局變量聲明的時候,全局變量的位置問題,在結構和聯合聲明指針的時候,指針的形式和指針的命名的形式問題,這些錯誤都有在自己的實驗的過程中出現,而且,也給自己帶來了很大的麻煩。我的體會是,以后再寫程序的時候一定遵守一定的規則和習慣,例如關鍵詞的命名習慣,指針的使用形式和結構聯合中的一些形式的問題,應該遵循一定的規則和習慣,因為,只有這樣的自己在寫好的調試和檢查的過程中才不會走那么多 的彎路,才會把做事的速度提高上去。
最后,就是自己的一些心得體會對這次的實驗。做什么事情都要認真對待,無論事情的大小,因為只有這樣自己才會養成認真做事的習慣,這次的數據結構的實驗讓我深深的意識到了這一點。
附錄:
實驗三代碼: #include
#define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASTABLE-1 #define OVERFLOW-2 #define MAX_TREE_SIZE 100
typedef int Status;typedef int TElemType;//數據元素類型定義,注意這里是整型的,可以使char typedef TElemType SqBiTree[MAX_TREE_SIZE];SqBiTree bt;
typedef struct{ TElemType *base;TElemType *top;int stacksize;}SqStack;
Status InitStack(SqStack*S);Status Pop(SqStack*S,TElemType e);Status Push(SqStack*S,TElemType e);Status StackEmpty(SqStack*S);//全局變量的聲明
char *m_pCharBuf = NULL;int m_nList[100];int m_nCount = 0;
char* openFileOnlyRead(char * fileName);void writeQuickSortResult(char *pResult);char* openFileOnlyRead(char * fileName){
int nLen = 0;FILE *pFile = fopen(fileName, “r”);//打開文件
fseek(pFile, 0, SEEK_END);//文件指針移到文件尾
nLen = ftell(pFile);//得到當前指針位置, 即是文件的長度 rewind(pFile);//文件指針恢復到文件頭位置
//動態申請空間, 為保存字符串結尾標志 主站蜘蛛池模板: 影音先锋人妻啪啪av资源网站| 国产360激情盗摄全集| 337p日本欧洲亚洲大胆| 午夜一区欧美二区高清三区| 国产成人亚洲综合色婷婷秒播| 成人网站亚洲综合久久| 精品国产aⅴ一区二区三区| 粗大猛烈进出高潮视频免费看| 免费看无码自慰一区二区| 天堂资源最新在线| 51国产黑色丝袜高跟鞋| 欧美熟妇另类久久久久久不卡| 亚洲国产精品无码久久| 久久久无码精品亚洲日韩精东传媒| 亚洲人成网线在线播放va| 欧美成年视频在线观看| 日韩欧美一区二区三区永久免费| 8x福利精品第一导航| 97人人超碰国产精品最新| 国产白丝无码免费视频| 久久天天躁夜夜躁狠狠85麻豆| 久久婷婷五月综合国产尤物app| 亚洲色成人网站www永久| 日韩人妻无码精品久久久不卡| 亚洲av无码乱码国产精品fc2| 2020国产精品久久精品| 国产午夜亚洲精品国产成人小说| 精品九九人人做人人爱| 久久婷婷是五月综合色| 国产一区二区三区精品av| 久久久久国产精品熟女影院| 欧日韩无套内射变态| 午夜亚洲av永久无码精品| 无码高潮喷吹在线播放亚洲| 国产成人综合久久久久久| 美女露内裤扒开腿让男人桶无遮挡| 中文字幕热久久久久久久| 无码国产成人午夜视频在线播放| 全黄激性性视频| 欧美亚洲一区二区三区| 亚洲午夜无码毛片av久久京东热|