电脑的存储结构设计与实现_第1页
电脑的存储结构设计与实现_第2页
电脑的存储结构设计与实现_第3页
电脑的存储结构设计与实现_第4页
电脑的存储结构设计与实现_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、、课题名称电脑存储结构设计与实现(树,查找)二、主要容电脑存储结构设计与实现主要是模拟“我的电脑”中硬盘信息的建立、查找、插入、修改、删除等功能。可。基本功能如下:(1)硬盘初始化信息:我的电脑(根结点)。(2)硬盘格式化:为我的电脑分区,分区的个数由后台终端输入决定,每个硬盘分区信息 包括卷名、文件系统类型、容量等。(3)文件或文件夹的添加:即创建某个分区的孩子结点信息(文件(夹),孩子结点的数目由控制台端给出,信息包括文件(夹)名,文件(夹)大小,所有文件(夹)的文件名此 处不能重复。创建好的文件夹中还能创建其孩子结点信息(文件(夹)。(4)文件或文件夹信息的修改:可以修改某一文件或文件夹

2、的信息,包括名字和大小。(5)文件或文件夹的查询:查询某一文件或文件夹的具体路径。(从我的电脑开始)(6)文件或文件夹的删除:删除此文件,如果是文件夹,若其有后代,将删除其所有后代 成员(文件或文件夹)。三、课题设计的基本思想,原理和算法描述此课题主要用树来建立电脑的存储结构设计,并用树的相关知识,递归的思想贯穿始终,实现硬盘的初始化和格式化,并在分区里实现文件(夹)的添加、修改、查询、删除的功能。主函数和总界面:void menu()system("cls");printf("printf("*n,);*欢迎进入电脑存储设计与实现系统!*n"

3、);printf("*printf("*1.硬盘初始化信息:*n");printf("*2.硬盘格式化信息:*n");printf("*3.添加文件(夹)的信息:*n");printf("*4.修改文件(夹)的信息:*n");printf("*5.查询文件(夹)的信息:*n");printf("*6.删除文件(夹)的信息*n");printf("*7.退出*n");printf("printf("*坨”);请选择功能操作号:&

4、quot;);/选择相应数字实现对应功能项n");) void main() ( TSBNode *b; while(1) ( menu(); int c;scanf("%d",&c); switch(c) (case 1:CreateBTNode(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(&

5、quot;选择有误,请重新选择 !n"); ) ) )硬盘初始化中:直接输入主盘的名字,并将此名字赋给根节点。初始化void CreateBTNode(TSBNode *&b)硬盘初始化信息#1# (system("cls");printf("*欢迎来到硬盘初始化信息界面产*");printf("n");b=NULL;b=(TSBNode *)malloc(sizeof(TSBNode);printf("请输入主盘的名字:");scanf("%s",&b->dat

6、);b->child=b->brother=NULL;printf("初始化成功!n");chushi=1;system("pause");按回车键继续)硬盘格式化中:首先输入主盘的名字,判断是否存在此主盘,同时也判断是否进行硬盘初始 化,是的话继续,否则返回初始化的界面。判断结束后,输入需要添加分区的数目,一个一 个地输入信息。此期间会判断是否重复,重复的话重新输入。最后在 for循环里,对每个分 区和根节点建立关系。void areaTSBNode(TSBNode *&b)/ 硬盘格式化#2 格式化 #(system(

7、"cls");printf("*欢迎来到硬盘格式化信息界面!*n");printf("n"); TSBNode *pMAXCHILD; char nameMAX; /定义数组指针 printf("请输入需要添加分区的主盘的名字:");scanf("%s",&name);if(chushi=0)判断是否进行初始化,否则返回初始化界面( printf("请先进行硬盘初始化!n"); system("pause"); / 按回车键继续; CreateBT

8、Node(b); return; ) if(strcmp(b->,name)!=0)/ 判断是否存在( printf("不存在此主盘,请重新输入!n");printf("请输入需要添加分区的主盘的名字:");scanf("%s",&name); ) int childnum;/定义分区数目printf("请输入分区的数目:"); scanf("%d",&childnum); for(int i=1;i<=childnum;i+)/for 语句依次添加

9、信息( pi=(TSBNode *)malloc(sizeof(TSBNode); pi->child=pi->brother=NULL; printf("请输入第%dj分区的信息:n",i); printf("卷名:"); scanf("%s",&pi->);printf("类型:");scanf("%s”,&pi->data.type);printf("容量:");scanf("%s",&pi-&

10、gt;data.volume);if(FindNode(b,pi->)!=NULL)/ 判断是否重复 printf("分区卷名重复,请重新输入!n");printf("卷名:"); scanf("%s",&pi->);printf("类型:");scanf("%s",&pi->data.type); printf("容量:");scanf("%s",&pi->data.vo

11、lume);if(i=1) b->child=pi;elsepi-1->brother=pi; printf("格式化成功!n");geshi=1; system("pause"); 按回车键继续; 文件(夹)的添加中:同格式化,首先输入分区或文件(夹)的名字,判断是否存在此分区 或文件(夹),同时也判断是否进行硬盘格式化,是的话继续,否则返回格式化的界面。还 增加了需要添加文件的输入,并判断是否存在或重复。方便下面的建立关系。void Add(TSBNode *&b)/ 文件(夹)的添加#3 文件增力口 #system("

12、cls");printf("*欢迎来到添加文件(夹)的信息界面 !*n");printf("n"); TSBNode *pMAXCHILD,*q; int childnum; char nameMAX;printf("请输入需要添加文件(夹)白分区或文件夹名字:");scanf("%s",&name);if(geshi=0)/判断是否进行格式化,否则返回格式化界面printf("请先进行格式化!n");system("pause");/ 按回车键继续;are

13、aTSBNode(b);return;q=FindNode(b,name);while(q=NULL)printf("不存在此分区或文件夹,请重新输入:");scanf("%s",&name);q=FindNode(b,name);printf("请输入文件(夹)的数目:");scanf("%d",&childnum);for(int i=1;i<=childnum;i+)pi=(TSBNode *)malloc(sizeof(TSBNode);pi->child=pi->brot

14、her=NULL;printf("请输入第d个文件(夹)的信息:n",i);printf("名字:");scanf("%s",&pi->);printf("大小:");scanf("%s",&pi->data.volume);if(FindNode(b,pi->)!=NULL)printf("此文件夹已添加,请重新输入!n");printf("名字:n");scanf("%s&

15、quot;,&pi->);printf("大小:");scanf("%s",&pi->data.volume);if(i=1)q->child=pi;else/判断是否存在/判断是否重复pi-1->brother=pi;)printf("添力口成功!n");system("pause");)文件(夹)的修改中:前面写了查询结点的函数,此中输入需要修改的文件(夹)的名字,查找到后直接修改信息。void Change(TSBNode *b)/ 文件(夹)的修改#

16、4文件彳改 #(system("cls");printf("*欢迎来到修改文件(夹)的信息界面!*坨”);printf("n");TSBNode *q;char nameMAX;printf("请输入需要修改的文件(夹)的名字: ");scanf("%s",&name);q=FindNode(b,name);if(q=NULL)(printf("此文件(夹)不存在!n");system("pause");return;)printf("请输入修改后

17、的文件(夹)的信息: n");printf("名字:");scanf("%s",&q->);printf("大小:");scanf("%s",&q->data.volume);system("pause");/按回车键继续)文件(夹)的查询中:首先查找到结点,判断是否存在,存在的话直接输出此文件(夹)的信息。下面输出路径中,要写查找父结点的函数和结点高度的函数。在查询中用for循环(用高度作为判断条件)将每个需要的父节点输入到数组里,结束后

18、,倒序输出。int TSBHeight(TSBNode *b,TSBNode *q)/ 计算成员的文件夹的高度 static int h=0;static int n=1; if(b=NULL) return h;if(strcmp(b->,q->)=0)return (h=n);n+;TSBHeight(b->child,q);n-;TSBHeight(b->brother,q);return h;TSBNode *FindFather(TSBNode *b,TSBNode *q)/查找某结点的父亲结点(TSBNode *p;if(

19、b!=NULL) ( p=b->child; while (p!=NULL) (if (p=q)return b;elsep=p->brother;p=FindFather(b->child,q);if(p!=NULL)return p; elsereturn 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;表示文件的高

20、度h=TSBHeight(b,q);for(int i=1;i<h;i+)(strcpy(b->,FindFather(b,q)->);q=FindFather(b,q); printf("路径为:"); for(i=h-1;i>=1;i-) (printf("%s->",b->);printf("%s",p->);printf("n");void Display(TSBNode *b,TSBNod

21、e *q)/ 输出文件夹信息和路径(printf("名字:%s 大小:sn",q->,q->data.volume);Path(b,q);#void Search(TSBNode *b)/文件(夹)的查询#5 文件查询(system("cls");printf("*欢迎来到查询文件(夹)信息界面!*n");printf("n");TSBNode *q;char nameMAX;printf("请输入你要查询的文件(夹)的名字:");scanf("%s&qu

22、ot;,&name);q=FindNode(b,name);if(q=NULL) (printf("不存在此文件(夹)!n");system("pause");return;Display(b,q);system("pause");)文件(夹)的删除中:首先写删除子文件的函数和查找前驱的函数。在删除文件(夹)中首 先输入需要删除的文件(夹)的名字,判断是否存在,存在的话,用p->brother和p->child 同时为空和其中一个为空和都不为空四个条件来判断,删除子文件和查找前驱在里面调用, 和相应的递归来实现。删

23、除了此文件,也删除了其子文件。void DelTSBNode(TSBNode *b)/ 删除子文件(if(b->brother=NULL&&b->child=NULL)( free(b);) else (if(b->brother!=NULL)( DelTSBNode(b->brother);)if(b->child!=NULL)(DelTSBNode(b->child);)TSBNode * TSBFront(TSBNode *&b,char *name) / 查找前驱结点(if(b->brother!=NULL &&

24、amp; b->child=NULL)(if(strcmp(b->brother->,name) return TSBFront(b->brother,name);elsereturn b;)if(b->child!=NULL && b->brother=NULL)(if(strcmp(b->child->,name) return TSBFront(b->child,name);elsereturn b;)if(b->child!=NULL && b->bro

25、ther!=NULL)(if(strcmp(b->child->,name)=0|strcmp(b->brother->,name)=0)(return b;)else(if(TSBFront(b->brother,name)=NULL)return TSBFront(b->child,name);elsereturn TSBFront(b->brother,name);)if(b->brother=NULL&&b->child=NULL)return NULL;)void Delete(

26、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

27、)DelTSBNode(p->child);)else (TSBNode *q=TSBFront(b,name);if(p->brother=NULL)(if(q->child=p)(q->child=NULL;if(p->child!=NULL)DelTSBNode(p->child); free(p);)else(q->brother=NULL;if(p->child!=NULL)DelTSBNode(p->child); free(p);)else(if(q->child=p)(q->child=p->brother

28、;if(p->child!=NULL)DelTSBNode(p->child); free(p);)else(q->brother=p->brother;if(p->child!=NULL)DelTSBNode(p->child);free(p);主函数printf("删除成功!n");)system("pause");符号说明:char nameMAX;char typeMAX;char volumeMAX; 文件夹的信息int chushi=0,geshi=0;定义的全局变量,分别用在格式化和添加文件的函数中,判断

29、初始化 和格式化是否进行,是的话继续,否则返回相应界面struct tnode *brother; 指向兄弟 struct tnode *child; 指向孩子ElemType data;结点的值ElemType dateMAX;定义数组,用于路径中父节点的存储,最后 输出 #include <stdlib.h> 头文件system("cls");达到清屏的效果四、运行示例及结果分析0回 君王函数,最初的界面I * C;U5 c八A drnini istratorDes kto p%计算机学习 3sss5吉枸谡程设计0ebu ql.exe'双迎进入电脑存

30、储设计与实观系统,国上il=®1自4士 :的的的前息息lw!夹天夫、文文文 硬 12 3 4 5 6 7*请无怪功熊操卡号二图1初始化界面:B * C:Us ers1,i Ad mi n istratorSJDe kto 计算叽学习偿E抠密为课号设计'Dubug'L uku,图3另一种情况,主盘名字不存在:I r C:Use rsAdrnin i wtritoADEs ktop d十尊机字为、数提3 湮隹"第+D=ugT.Le£eae Pi r in 问 r m的的 坪入盘 .王询王良 区重区H需比需第C人在人人人.(" £ 十

31、 口& W12座思 :窜量式技E -CUsersAdministr就oAOesIgop市其也字刁强据结构专程发巾Debugl exe'图5添加信息时,文件重复的情况:i1在文件夹里添加文件(夹)'"欢迎来到添加文什用分区或文件夬名字i人零普漆加文 IMS7修改界面: ' C !XUserAc?m inittra tn0m f do 闲一肄叽学习七黑猩黑建面十»匕L g.eKm '"XX""双迎幸到修改文件(夹)的信息界面,窗取黄享驾琢件(夫Z盟:字I 3 肆A修改后的文件(夹)的信息: 戾玳©0

32、Q青校任意键批续.一修改的另一种情况,不存在:图9查询界面:> p' ' C:Uwr5Adm i n istrdtorpe5ktcpi±V?1. ex«'图11删除后进行查询的效果,1的子孩子也被删除了,界面: XAJse rAdinini 中启 2匕口emktQpC一算我学习曲振淑3 菁程设ttl*bu回 521的兄弟还存在,不受影响的界面:E *GUacr5Adrn inistratrXDci ktp pl 程胱+Dcbu g,l.MWXWM廿1,欢迎来到查询文件夹)彳言息房面,丫三,且:为I wc2 净隹意楼绯城.道迪人你零宜询的文件(夹

33、)的名字;2 名字:2大小:W"图13欢迎过人屯府存储设计与实现系统,慢选3引能操作号力J/i'css emy key continue退出结束的界面:" C:Uh rsAdm in i stra+or次弓以叩0一匿明学完倒指给均读程受计Qbu g二7匕12 3 4 5 6 7一 .XKX文 一六E&加 一硬硬沃莺一要息息息息 a星j号一岩_n. E -TTT -mT"r -fTl 夹夫夹五、调试和运行程序过程中产生的问题及采取的措施1、在主菜单中如果直接进行3添加的信息,就会直接结束,因为必须先把 1初始化和2格式化做好。所以就设了两个全局变量i

34、nt chushi=0,geshi=0;分别放在格式化和添加的函数中进行判断。例如:if(chushi=0)判断是否进行初始化,否则返回初始化界面(printf("请先进行硬盘初始化!n");system("pause"); / 按回车键继续; CreateBTNode(b);return;2、在删除里面,首先建立前驱函数,和查找中建立父节点的函数,刚开始写的找不到,直接结束,越看越乱,后来就画一个树,指定结点去顺,就很容易发现漏条件的情况,再添 加进去就好了。3、在输出路径中,就是想从根节点进行往下找,但是函数总是实现不了,而且思路很 复杂,有太多的情况出现。后来就倒着找,调用父节点的函数,一个一个输出。但一直是倒 序输出的情况。就定义了一个数组dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论