电脑的存储结构设计与实现.doc_第1页
电脑的存储结构设计与实现.doc_第2页
电脑的存储结构设计与实现.doc_第3页
电脑的存储结构设计与实现.doc_第4页
电脑的存储结构设计与实现.doc_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

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

文档简介

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

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

3、n);printf(*1.硬盘初始化信息:*n);printf(*2.硬盘格式化信息:*n);printf(*3.添加文件(夹)的信息:*n);printf(*4.修改文件(夹)的信息:*n);printf(*5.查询文件(夹)的信息:*n);printf(*6.删除文件(夹)的信息*n);printf(*7.退出*n);printf(*n);printf( 请选择功能操作号:);/ 选择相应数字实现对应功能项void main()TSBNode *b;while(1)menu();int c;scanf(%d,&c);switch(c)case 1:CreateBTNode(b);break

4、;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);硬盘初始化中:直接输入主盘的名字,并将此名字赋给根节点。voidCreateBTNode(TSBNode*&b)/ 硬盘初始化信息#1初始化#system(cls);printf(* 欢迎来到硬盘初始化信息界面!*n);printf(n);b=NULL;b=(TSBNode

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

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

7、重新输入!n);printf( 请输入需要添加分区的主盘的名字:);scanf(%s,&name);int childnum;/ 定义分区数目printf( 请输入分区的数目:);scanf(%d,&childnum);for(int i=1;ichild=pi-brother=NULL;printf( 请输入第 %d个分区的信息:n,i);printf( 卷名: );scanf(%s,&);printf( 类型: );scanf(%s,&pi-data.type);printf( 容量: );scanf(%s,&pi-data.volume);if(FindNode(

8、b,)!=NULL)/ 判断是否重复printf( 分区卷名重复,请重新输入!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);/ 按回车键继续;文件(夹)的添加中:同格式化,首先输入分区或文件(夹)的名字,判断是否存在此分区或文件

9、(夹),同时也判断是否进行硬盘格式化,是的话继续,否则返回格式化的界面。还增加了需要添加文件的输入,并判断是否存在或重复。方便下面的建立关系。void Add(TSBNode *&b)/文件(夹)的添加#3文件增加#system(cls);printf( * 欢迎来到添加文件(夹)的信息界面 !*n); printf(n);TSBNode *pMAXCHILD,*q;int childnum;char nameMAX;printf( 请输入需要添加文件(夹)的分区或文件夹名字:);scanf(%s,&name);if(geshi=0)/ 判断是否进行格式化,否则返回格式化界面printf( 请

10、先进行格式化!n);system(pause);/ 按回车键继续;areaTSBNode(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;ichild=pi-brother=NULL;printf( 请输入第 %d个文件(夹)的信息:n,i);printf( 名字: );scanf(%s,&

11、);printf( 大小: );scanf(%s,&pi-data.volume);if(FindNode(b,)!=NULL)/ 判断是否重复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);文件(夹)的修改中:前面写了查询结点的函数,此中输入需要修改的文件(夹)的名字,查找

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( 名字: );scanf(%s,&

13、);printf( 大小: );scanf(%s,&q-data.volume);system(pause);/ 按回车键继续文件(夹)的查询中:首先查找到结点,判断是否存在,存在的话直接输出此文件(夹)的信息。下面输出路径中, 要写查找父结点的函数和结点高度的函数。在查询中用for循环(用高度作为判断条件)将每个需要的父节点输入到数组里,结束后,倒序输出。int TSBHeight(TSBNode *b,TSBNode *q)/ 计算成员的文件夹的高度static int h=0;static int n=1;if(b=NULL)return h;if(strcmp(,

14、)=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(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);r

15、eturn 0;void Path(TSBNode *b,TSBNode *q)/ 输出文件 (夹 )路径TSBNode *p;p=q;if(TSBHeight(b,q)=0)printf( 空文件 !);elseint 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-,);printf(%s,);printf(n);vo

16、id 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);q=FindNode(b,name);if(q=NULL)printf(

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

18、-brother!=NULL)DelTSBNode(b-brother);if(b-child!=NULL)DelTSBNode(b-child);TSBNode * TSBFront(TSBNode *&b,char *name)/ 查找前驱结点if(b-brother!=NULL & b-child=NULL)if(strcmp(,name)return TSBFront(b-brother,name);elsereturn b;if(b-child!=NULL & b-brother=NULL)if(strcmp(,

19、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,name);if(b-brother=NULL&b-child=NULL)ret

20、urn 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);: );elseif(p=b)if(p-child!=NULL)DelTSBNode(p-child);elseTSBNode *q=TSBFront(b,name);i

21、f(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);elseq-brother=p-brother;if(p-child!=NULL)DelTSBNode(p-child);free(p)

22、;printf(删除成功 !n);主函数system(pause);流程图:硬盘初始化硬盘格式化文件(夹)文件(夹)的添加的修改P=qP=qYesnoyesno重复!继续!继续!重输!退出!文件(夹)文件(夹)的查询的删除P=qP=qnoyesnoyes继续!重输!继续!重输!符号说明: char nameMAX;char typeMAX;char volumeMAX;文件夹的信息int chushi=0,geshi=0; 定义的全局变量,分别用在格式化和添加文件的函数中,判断初始化和格式化是否进行,是的话继续,否则返回相应界面struct tnode *brother;指向兄弟 struct

23、 tnode *child;指向孩子ElemType data;结点的值ElemType dateMAX; 定义数组,用于路径中父节点的存储,最后输出#include 头文件system(cls); 达到清屏的效果四、运行示例及结果分析主函数,最初的界面图 1初始化界面:图 2格式化界面:图 3另一种情况,主盘名字不存在:图 4添加文件夹界面:图 5添加信息时,文件重复的情况:图 6在文件夹里添加文件(夹):图 7修改界面:图 8修改的另一种情况,不存在:图 9查询界面:图 10删除界面:图 11删除后进行查询的效果,1 的子孩子也被删除了,界面:图 121 的兄弟还存在,不受影响的界面:图

24、13退出结束的界面:图 14五、调试和运行程序过程中产生的问题及采取的措施1、在主菜单中如果直接进行3 添加的信息,就会直接结束,因为必须先把1 初始化和2 格式化做好。所以就设了两个全局变量int chushi=0,geshi=0; 分别放在格式化和添加的函数中进行判断。例如:if(chushi=0)/ 判断是否进行初始化,否则返回初始化界面printf( 请先进行硬盘初始化!n);system(pause);/ 按回车键继续;CreateBTNode(b);return;2、在删除里面, 首先建立前驱函数,和查找中建立父节点的函数,刚开始写的找不到,直接结束,越看越乱,后来就画一个树,指定

25、结点去顺,就很容易发现漏条件的情况,再添加进去就好了。3、在输出路径中,就是想从根节点进行往下找,但是函数总是实现不了,而且思路很复杂,有太多的情况出现。后来就倒着找,调用父节点的函数,一个一个输出。但一直是倒序输出的情况。就定义了一个数组datemax ,查找到就输进去,然后根据高度作为条件用for 循环倒着将数组输出。就变成我想要的正序了。for(i=h-1;i=1;i-)printf(%s-,);printf(%s,);printf(n);4、接下来就是好多小的错误,例如return;在if中和函数中放的位置有误,导致直接结束,没有进行下一步。 还有函数定义void Display(TSBNode *b,TSBNode *q)中TSBNode *b未定义,出现错误。下面调用此函数中,少写了变量和

温馨提示

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

评论

0/150

提交评论