電腦的存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)_第1頁
電腦的存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)_第2頁
電腦的存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)_第3頁
電腦的存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)_第4頁
電腦的存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、一、課題名稱 電腦存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)(樹,查找)二、主要內(nèi)容電腦存儲結(jié)構(gòu)設(shè)計(jì)與實(shí)現(xiàn)主要是模擬“我的電腦”中硬盤信息的建立、查找、插入、修改、刪除等功能。可?;竟δ苋缦拢海?)硬盤初始化信息:我的電腦(根結(jié)點(diǎn))。(2)硬盤格式化:為我的電腦分區(qū),分區(qū)的個數(shù)由后臺終端輸入決定,每個硬盤分區(qū)信息包括卷名、文件系統(tǒng)類型、容量等。(3)文件或文件夾的添加:即創(chuàng)建某個分區(qū)的孩子結(jié)點(diǎn)信息(文件(夾),孩子結(jié)點(diǎn)的數(shù)目由控制臺端給出,信息包括文件(夾)名,文件(夾)大小,所有文件(夾)的文件名此處不能重復(fù)。 創(chuàng)建好的文件夾中還能創(chuàng)建其孩子結(jié)點(diǎn)信息(文件(夾)。(4)文件或文件夾信息的修改:可以修改某一文件或文

2、件夾的信息,包括名字和大小。(5)文件或文件夾的查詢:查詢某一文件或文件夾的具體路徑。(從我的電腦開始)(6)文件或文件夾的刪除:刪除此文件,如果是文件夾,若其有后代,將刪除其所有后代成員(文件或文件夾)。三、課題設(shè)計(jì)的基本思想,原理和算法描述此課題主要用樹來建立電腦的存儲結(jié)構(gòu)設(shè)計(jì),并用樹的相關(guān)知識,遞歸的思想貫穿始終,實(shí)現(xiàn)硬盤的初始化和格式化,并在分區(qū)里實(shí)現(xiàn)文件(夾)的添加、修改、查詢、刪除的功能。主函數(shù)和總界面:void menu()system(cls);printf( *n);printf( * 歡迎進(jìn)入電腦存儲設(shè)計(jì)與實(shí)現(xiàn)系統(tǒng)! *n);printf( * - * n);printf(

3、 * 1.硬盤初始化信息: *n);printf( * 2.硬盤格式化信息: * n);printf( * 3.添加文件(夾)的信息: *n);printf( * 4.修改文件(夾)的信息: * n);printf( * 5.查詢文件(夾)的信息: *n);printf( * 6.刪除文件(夾)的信息 * n);printf( * 7.退出 *n);printf( *n);printf(請選擇功能操作號:); /選擇相應(yīng)數(shù)字實(shí)現(xiàn)對應(yīng)功能項(xiàng)void main() TSBNode *b;while(1)menu();int c;scanf(%d,&c);switch(c) case 1:Creat

4、eBTNode(b);break; case 2:areaTSBNode(b);break; case 3:Add(b);break; case 4:Change(b);break; case 5:Search(b);break; case 6:Delete(b);break; case 7:return; default:printf(選擇有誤,請重新選擇!n); 硬盤初始化中:直接輸入主盤的名字,并將此名字賦給根節(jié)點(diǎn)。void CreateBTNode(TSBNode *&b) /硬盤初始化信息 # 1 初始化 #system(cls); printf( *歡迎來到硬盤初始化信息界面 !*

5、n);printf(n);b=NULL; b=(TSBNode *)malloc(sizeof(TSBNode);printf(請輸入主盤的名字:);scanf(%s,&); b-child=b-brother=NULL;printf(初始化成功!n);chushi=1;system(pause);/按回車鍵繼續(xù)硬盤格式化中:首先輸入主盤的名字,判斷是否存在此主盤,同時也判斷是否進(jìn)行硬盤初始化,是的話繼續(xù),否則返回初始化的界面。判斷結(jié)束后,輸入需要添加分區(qū)的數(shù)目,一個一個地輸入信息。此期間會判斷是否重復(fù),重復(fù)的話重新輸入。最后在for循環(huán)里,對每個分區(qū)和根節(jié)點(diǎn)建立關(guān)系。v

6、oid areaTSBNode(TSBNode *&b)/硬盤格式化 # 2 格式化 # system(cls);printf( *歡迎來到硬盤格式化信息界面!*n);printf(n);TSBNode *pMAXCHILD;char nameMAX; /定義數(shù)組指針printf(請輸入需要添加分區(qū)的主盤的名字:); scanf(%s,&name);if(chushi=0) /判斷是否進(jìn)行初始化,否則返回初始化界面 printf(請先進(jìn)行硬盤初始化!n); system(pause);/按回車鍵繼續(xù); CreateBTNode(b); return;if(strcmp(,

7、name)!=0) /判斷是否存在printf(不存在此主盤,請重新輸入!n);printf(請輸入需要添加分區(qū)的主盤的名字:); scanf(%s,&name);int childnum; /定義分區(qū)數(shù)目printf(請輸入分區(qū)的數(shù)目:); scanf(%d,&childnum); for(int i=1;ichild=pi-brother=NULL;printf(請輸入第%d個分區(qū)的信息:n,i);printf(卷名:); scanf(%s,&);printf(類型:);scanf(%s,&pi-data.type);printf(容量:);scanf(%s,&pi

8、-data.volume);if(FindNode(b,)!=NULL) /判斷是否重復(fù)printf(分區(qū)卷名重復(fù),請重新輸入!n);printf(卷名:); scanf(%s,&); printf(類型:); scanf(%s,&pi-data.type); printf(容量:); scanf(%s,&pi-data.volume);if(i=1)b-child=pi;elsepi-1-brother=pi;printf(格式化成功!n);geshi=1;system(pause);/按回車鍵繼續(xù);文件(夾)的添加中:同格式化,首先輸入分區(qū)或

9、文件(夾)的名字,判斷是否存在此分區(qū)或文件(夾),同時也判斷是否進(jìn)行硬盤格式化,是的話繼續(xù),否則返回格式化的界面。還增加了需要添加文件的輸入,并判斷是否存在或重復(fù)。方便下面的建立關(guān)系。void Add(TSBNode *&b)/文件(夾)的添加 # 3 文件增加 #system(cls);printf( *歡迎來到添加文件(夾)的信息界面!*n);printf(n);TSBNode *pMAXCHILD,*q; int childnum; char nameMAX; printf(請輸入需要添加文件(夾)的分區(qū)或文件夾名字:); scanf(%s,&name);if(geshi=0) /判斷是

10、否進(jìn)行格式化,否則返回格式化界面printf(請先進(jìn)行格式化!n);system(pause);/按回車鍵繼續(xù);areaTSBNode(b);return;q=FindNode(b,name); while(q=NULL) printf(不存在此分區(qū)或文件夾,請重新輸入:); /判斷是否存在 scanf(%s,&name); q=FindNode(b,name); printf(請輸入文件(夾)的數(shù)目:); scanf(%d,&childnum); for(int i=1;ichild=pi-brother=NULL; printf(請輸入第%d個文件(夾)的信息:n,i); printf(名

11、字:); scanf(%s,&);printf(大小:);scanf(%s,&pi-data.volume); if(FindNode(b,)!=NULL) /判斷是否重復(fù)printf(此文件夾已添加,請重新輸入!n);printf(名字:n); scanf(%s,&); printf(大?。?; scanf(%s,&pi-data.volume);if(i=1)q-child=pi;elsepi-1-brother=pi;printf(添加成功!n);system(pause);文件(夾)的修改中:前面寫了查詢結(jié)點(diǎn)的函數(shù)

12、,此中輸入需要修改的文件(夾)的名字,查找到后直接修改信息。void Change(TSBNode *b)/文件(夾)的修改 # 4 文件修改 # system(cls); printf( *歡迎來到修改文件(夾)的信息界面!*n);printf(n);TSBNode *q;char nameMAX;printf(請輸入需要修改的文件(夾)的名字:);scanf(%s,&name); q=FindNode(b,name); if(q=NULL) printf(此文件(夾)不存在!n); system(pause); return;printf(請輸入修改后的文件(夾)的信息:n);printf

13、(名字:); scanf(%s,&);printf(大?。?;scanf(%s,&q-data.volume);system(pause);/按回車鍵繼續(xù)文件(夾)的查詢中:首先查找到結(jié)點(diǎn),判斷是否存在,存在的話直接輸出此文件(夾)的信息。下面輸出路徑中,要寫查找父結(jié)點(diǎn)的函數(shù)和結(jié)點(diǎn)高度的函數(shù)。在查詢中用for循環(huán)(用高度作為判斷條件)將每個需要的父節(jié)點(diǎn)輸入到數(shù)組里,結(jié)束后,倒序輸出。int TSBHeight(TSBNode *b,TSBNode *q) /計(jì)算成員的文件夾的高度 static int h=0; static int n=1;if(b=NULL)retur

14、n h;if(strcmp(,)=0)return (h=n);n+; TSBHeight(b-child,q);n-; TSBHeight(b-brother,q); return h;TSBNode *FindFather(TSBNode *b,TSBNode *q)/查找某結(jié)點(diǎn)的父親結(jié)點(diǎn) TSBNode *p;if(b!=NULL) p=b-child; while (p!=NULL) if (p=q) return b; else p=p-brother; p=FindFather(b-child,q); if(p!=NULL) return

15、 p; else return FindFather(b-brother,q);return 0;void Path(TSBNode *b,TSBNode *q) /輸出文件(夾)路徑TSBNode *p;p=q;if(TSBHeight(b,q)=0) printf(空文件!); else int h; /表示文件的高度h=TSBHeight(b,q);for(int i=1;,FindFather(b,q)-);q=FindFather(b,q); printf(路徑為:);for(i=h-1;i=1;i-)printf(%s-,b-datei.na

16、me);printf(%s,);printf(n);void Display(TSBNode *b,TSBNode *q) /輸出文件夾信息和路徑printf(名字:%s大?。?sn,,q-data.volume); Path(b,q);void Search(TSBNode *b)/文件(夾)的查詢 # 5 文件查詢 # system(cls);printf( *歡迎來到查詢文件(夾)信息界面!*n);printf(n);TSBNode *q;char nameMAX;printf(請輸入你要查詢的文件(夾)的名字:);scanf(%s,&name

17、); q=FindNode(b,name); if(q=NULL)printf(不存在此文件(夾)!n);system(pause);return;Display(b,q);system(pause);文件(夾)的刪除中:首先寫刪除子文件的函數(shù)和查找前驅(qū)的函數(shù)。在刪除文件(夾)中首先輸入需要刪除的文件(夾)的名字,判斷是否存在,存在的話,用p-brother和p-child同時為空和其中一個為空和都不為空四個條件來判斷,刪除子文件和查找前驅(qū)在里面調(diào)用,和相應(yīng)的遞歸來實(shí)現(xiàn)。刪除了此文件,也刪除了其子文件。void DelTSBNode(TSBNode *b) /刪除子文件 if(b-brothe

18、r=NULL&b-child=NULL) free(b); elseif(b-brother!=NULL) DelTSBNode(b-brother);if(b-child!=NULL)DelTSBNode(b-child);TSBNode * TSBFront(TSBNode *&b,char *name) /查找前驅(qū)結(jié)點(diǎn)if(b-brother!=NULL & b-child=NULL)if(strcmp(,name)return TSBFront(b-brother,name);elsereturn b;if(b-child!=NULL & b-br

19、other=NULL)if(strcmp(,name)return TSBFront(b-child,name);elsereturn b;if(b-child!=NULL & b-brother!=NULL)if(strcmp(,name)=0|strcmp(,name)=0)return b;elseif(TSBFront(b-brother,name)=NULL)return TSBFront(b-child,name);elsereturn TSBFront(b-brother,n

20、ame);if(b-brother=NULL&b-child=NULL)return NULL;void Delete(TSBNode *b) /電腦文件刪除 system(cls);printf( *歡迎來到刪除文件(夾)信息界面!*n);printf(n);char nameMAX;printf(請輸入你要刪除的文件(夾)的名字(其子文(件)將一并刪除):);scanf(%s,name);TSBNode *p=FindNode(b,name); if(p=NULL)printf(無此文件(夾)!n);else if(p=b) if(p-child!=NULL) DelTSBNode(p-c

21、hild); elseTSBNode *q=TSBFront(b,name); if(p-brother=NULL)if(q-child=p)q-child=NULL; if(p-child!=NULL) DelTSBNode(p-child); free(p);elseq-brother=NULL; if(p-child!=NULL) DelTSBNode(p-child); free(p); elseif(q-child=p) q-child=p-brother; if(p-child!=NULL) DelTSBNode(p-child); free(p); else q-brother=

22、p-brother; if(p-child!=NULL) DelTSBNode(p-child); free(p);主函數(shù)硬盤初始化文件(夾)的查詢硬盤格式化文件(夾)的修改文件(夾)的添加文件(夾)的刪除P=q重復(fù)!繼續(xù)!P=qP=qP=q重輸!繼續(xù)!繼續(xù)!重輸!繼續(xù)!重輸!退出!printf( 刪除成功!n);system(pause);流程圖: Yes no yes no yes no yes no符號說明:char nameMAX;char typeMAX;char volumeMAX;文件夾的信息int chushi=0,geshi=0;定義的全局變量,分別用在格式化和添加文件的函數(shù)

23、中,判斷初始化和格式化是否進(jìn)行,是的話繼續(xù),否則返回相應(yīng)界面struct tnode *brother; 指向兄弟struct tnode *child; 指向孩子ElemType data; 結(jié)點(diǎn)的值ElemType dateMAX;定義數(shù)組,用于路徑中父節(jié)點(diǎn)的存儲,最后輸出 #include 頭文件 system(cls);達(dá)到清屏的效果四、運(yùn)行示例及結(jié)果分析主函數(shù),最初的界面圖1初始化界面:圖2格式化界面:圖3另一種情況,主盤名字不存在:圖4添加文件夾界面:圖5添加信息時,文件重復(fù)的情況:圖6在文件夾里添加文件(夾):圖7修改界面:圖8修改的另一種情況,不存在:圖9查詢界面:圖10刪除界

24、面: 圖11 刪除后進(jìn)行查詢的效果,1的子孩子也被刪除了,界面: 圖12 1的兄弟還存在,不受影響的界面:圖13退出結(jié)束的界面:圖14五、調(diào)試和運(yùn)行程序過程中產(chǎn)生的問題及采取的措施1、在主菜單中如果直接進(jìn)行3添加的信息,就會直接結(jié)束,因?yàn)楸仨毾劝?初始化和2格式化做好。所以就設(shè)了兩個全局變量int chushi=0,geshi=0;分別放在格式化和添加的函數(shù)中進(jìn)行判斷。例如:if(chushi=0) /判斷是否進(jìn)行初始化,否則返回初始化界面 printf(請先進(jìn)行硬盤初始化!n); system(pause);/按回車鍵繼續(xù); CreateBTNode(b); return;2、 在刪除里面,

25、首先建立前驅(qū)函數(shù),和查找中建立父節(jié)點(diǎn)的函數(shù),剛開始寫的找不到,直接結(jié)束,越看越亂,后來就畫一個樹,指定結(jié)點(diǎn)去順,就很容易發(fā)現(xiàn)漏條件的情況,再添加進(jìn)去就好了。3、 在輸出路徑中,就是想從根節(jié)點(diǎn)進(jìn)行往下找,但是函數(shù)總是實(shí)現(xiàn)不了,而且思路很復(fù)雜,有太多的情況出現(xiàn)。后來就倒著找,調(diào)用父節(jié)點(diǎn)的函數(shù),一個一個輸出。但一直是倒序輸出的情況。就定義了一個數(shù)組datemax,查找到就輸進(jìn)去,然后根據(jù)高度作為條件用for循環(huán)倒著將數(shù)組輸出。就變成我想要的正序了。for(i=h-1;i=1;i-)printf(%s-,);printf(%s,);printf(n); 4、接下來就是好多小的錯誤,例如return;在if中和函數(shù)中放的位置有誤,導(dǎo)致直接結(jié)束,沒有進(jìn)行下一步。還有函數(shù)定義void Display(TSBNode *b,TSBNode *q)中TSBNode *b未定義,出現(xiàn)錯誤。下面調(diào)用此函數(shù)中,少寫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論