日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

DS博客作业04--树大作业

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DS博客作业04--树大作业 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.樹的存儲結(jié)構(gòu)

本組采用的樹的存儲結(jié)構(gòu)為鏈?zhǔn)浇Y(jié)構(gòu),選擇如圖所示的結(jié)構(gòu)體
Name為結(jié)點的名稱
LevelNum為孩子節(jié)點的個數(shù)
*Children[20]用來指向不同的孩子結(jié)點(類似于二叉樹的結(jié)構(gòu)體,且數(shù)組大小這里取20,不夠可以再增加)

2.樹的函數(shù)說明

1.void Creatstr(string *str,int &length) 讀取并分割文件中的字符串

   strtok是字符串分割函數(shù),作用是將ch字符串中的字符串分割,分割的規(guī)則是在ch碰到與split變量有關(guān)的符號,都會將其改成‘\0’例如  split  =  "<>"ch = <html>用strtok分割后ch就變成了html,注意split中若有空格,ch中的空格也會被改成'\0',而且不是碰到 <> 在一起時才會將其改成'\0',只要字符串中含有 < 或者 > 都會被其改成'/0'void Creatstr(string *str,int &length)利用這個函數(shù)strtok()對讀取到的文件中的字符串進行分割并且存入一個字符串?dāng)?shù)組中比如 文件中的內(nèi)容如下<html><head><title>Demo</title></head><body><div>A<p>B</p>C</div><span>D</span></body></html>利用Creatstr(string *str,int &length)進行處理后str字符串?dāng)?shù)組中str[0] = htmlstr[1] = headstr[2] = titlestr[3] = Demostr[4] = /title......依次類推
而length就是字符串?dāng)?shù)組str的大小

2.void CreatTree(string str,BTNode &T,int length) 建立多叉樹

利用Creatstr()函數(shù)得到的字符串?dāng)?shù)組str[ ]以及其長度length進行建樹,建樹方法如下
建立兩個類型為<BTNode*>的棧 s1,s2
for i=0 to length-1 //遍歷str
{若str[i][0]!='/'   建立一個結(jié)點,結(jié)點的名稱為str[i],進s1棧若str[i][0]=='/'  (在s1棧中找到與之匹配的元素,例如 /html 對應(yīng)html (在下方有解釋)){while (不匹配)  {  s1.top()進s2棧且s1.pop() }找到匹配元素后(經(jīng)過while循環(huán)后匹配元素此時在s1.top())  { BTNode* T=s1.top()  s1.pop()  //用指針T存放棧頂元素然后讓棧頂出棧T對應(yīng)的結(jié)點的孩子結(jié)點個數(shù)即為棧s2的長度 即T->LevelNum=s2.size()將s2的元素依次出棧直到棧空,并且依次存放到T->Children[ ]中最后將T入s1棧}}
}然后這里是配對的操作 即代碼中的1 2 3步驟str2=str[i]str2.erase(str2.begin())用str2保存str[i],再用erase函數(shù)去除'/'字符str2.begin()是指向str2字符串的第一個字符,str.erase(p)就是刪去str中p對應(yīng)的字符所以str2.erase(str2.begin())是將str2字符串中的第一個字符串刪去例如 str2=/htmel,經(jīng)過erase()函數(shù)處理后就變成了 html 然后再去找s1中配對的元素

3.int FindPositionCode(BTNode T,string name,int a,int flag,int &flag2)


該函數(shù)有5個參數(shù)BTNode *T為樹,str name所查找元素的名稱,int *a為數(shù)組的頭地址,且a[ ]數(shù)組中的元素全部為-1int flag為孩子結(jié)點Children[ ]對應(yīng)的下標(biāo),頭節(jié)點沒有對應(yīng)下標(biāo)就用 -1int &flag2為了判斷所查找的元素是否存在,存在時返回0,不存在時返回1
該函數(shù)運行結(jié)果會把位置編碼儲存再數(shù)組a[ ]中
而位置編碼由上面的樹狀圖來解釋 
例如元素e的位置就為00,f的為01,g的為02,h的為10.....
但是經(jīng)過該函數(shù)處理后的數(shù)組a[ ]中a[0]一定為-1,后面的元素也都會是-1
所以數(shù)組a有用的部分就是  for a[1] to a[i] (a[i]的下一個元素a[i+1]=-1)
例如e的位置編碼為00,則數(shù)組a[10]將會是-1 0 0 -1 -1 -1 -1 -1 -1 -1f的位置編碼為01,則數(shù)組a[10]將會是-1 0 1 -1 -1 -1 -1 -1 -1 -1

4.void FindPosition(BTNode T,int a) 按格式輸出元素路徑

該函數(shù)利用上面FindPositionCode()函數(shù)得到的數(shù)組a[ ],然后進行處理,最后按格式輸出路徑

5.void CreatFileTree(BTNode T,int i,FILE fp) 建立文檔樹并寫入tree.txt文件中

用遞歸遍歷樹T,然后再按照格式輸出文檔樹
(類似于線序遍歷,看代碼慢慢體會)

3.樹結(jié)果演示






4.碰到問題

1.選擇樹的結(jié)構(gòu)體上花費較多時間
2.建樹算法為本小組自創(chuàng)的非遞歸算法,在設(shè)計過程中花費較多時間,最后參考算術(shù)表達式轉(zhuǎn)化成中綴表達式的算法設(shè)計出來
3.在設(shè)計輸出路徑的功能中,采取先獲取位置編碼然后再進行輸出處理的做法也是本小組自創(chuàng),在設(shè)計過程中也花費較多時間
4.在調(diào)式上,因為傳參時忘了加符號&,導(dǎo)致程序崩潰

5.小結(jié)

1.雖然采用了比較不同的結(jié)構(gòu)體,但是采取該結(jié)構(gòu)體后可能會造成空間上的浪費
2.采用該結(jié)構(gòu)體在遍歷時時間復(fù)雜度比較高,而且建樹過程較為復(fù)雜
3.好處就是建樹的模型比較清晰做法比較獨特

6.小組成員分配說明

main()函數(shù):劉羽 1.5分
Creatstr()函數(shù):阮承南 1.5分
CreatTree()函數(shù):唐洪俊 2分
FindPositionCode()函數(shù):沈宇濤 2分
FindPositionCode()函數(shù):沈宇濤 
CreatFileTree()函數(shù):蔡豐俊 2分
博客園:張明海 1分

轉(zhuǎn)載于:https://www.cnblogs.com/syt666/p/10896350.html

總結(jié)

以上是生活随笔為你收集整理的DS博客作业04--树大作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。