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

下载本文档

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

文档简介

一、课题名称电脑存储构造设计与实现(树,查找)二、重要内容电脑存储构造设计与实现重要是模仿“我电脑”中硬盘信息建立、查找、插入、修改、删除等功能。可。基本功能如下:(1)硬盘初始化信息:我电脑(根结点)。(2)硬盘格式化:为我电脑分区,分区个数由后台终端输入决定,每个硬盘分区信息涉及卷名、文献系统类型、容量等。(3)文献或文献夹添加:即创立某个分区孩子结点信息(文献(夹)),孩子结点数目由控制台端给出,信息涉及文献(夹)名,文献(夹)大小,所有文献(夹)文献名此处不能重复。创立好文献夹中还能创立其孩子结点信息(文献(夹))。(4)文献或文献夹信息修改:可以修改某一文献或文献夹信息,涉及名字和大小。(5)文献或文献夹查询:查询某一文献或文献夹详细途径。(从我电脑开始)(6)文献或文献夹删除:删除此文献,如果是文献夹,若其有后裔,将删除其所有后裔成员(文献或文献夹)。三、课题设计基本思想,原理和算法描述此课题重要用树来建立电脑存储构造设计,并用树有关知识,递归思想贯穿始终,实现硬盘初始化和格式化,并在分区里实现文献(夹)添加、修改、查询、删除功能。主函数和总界面:voidmenu(){ system("cls"); printf("******************************************************\n"); printf("*欢迎进入电脑存储设计与实现系统!*\n"); printf("*-----------------*\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("请选取功能操作号:");//选取相应数字实现相应功能项}voidmain(){TSBNode*b; while(1) { menu(); intc; scanf("%d",&c); switch(c) { case1:CreateBTNode(b);break; case2:areaTSBNode(b);break; case3:Add(b);break; case4:Change(b);break; case5:Search(b);break; case6:Delete(b);break; case7:return; default:printf("选取有误,请重新选取!\n"); } }}硬盘初始化中:直接输入主盘名字,并将此名字赋给根节点。voidCreateBTNode(TSBNode*&b)//硬盘初始化信息####1初始化####{ system("cls"); printf("********欢迎来到硬盘初始化信息界面!********\n"); printf("\n"); b=NULL;b=(TSBNode*)malloc(sizeof(TSBNode)); printf("请输入主盘名字:"); scanf("%s",&b->);b->child=b->brother=NULL; printf("初始化成功!\n"); chushi=1; system("pause");//按回车键继续}硬盘格式化中:一方面输入主盘名字,判断与否存在此主盘,同步也判断与否进行硬盘初始化,是话继续,否则返回初始化界面。判断结束后,输入需要添加分区数目,一种一种地输入信息。此期间会判断与否重复,重复话重新输入。最后在for循环里,对每个分区和根节点建立关系。voidareaTSBNode(TSBNode*&b)//硬盘格式化####2格式化####{ system("cls"); printf("********欢迎来到硬盘格式化信息界面!********\n"); printf("\n"); TSBNode*p[MAXCHILD]; charname[MAX];//定义数组指针 printf("请输入需要添加分区主盘名字:");scanf("%s",&name); if(chushi==0)//判断与否进行初始化,否则返回初始化界面 {printf("请先进行硬盘初始化!\n"); system("pause"); //按回车键继续; CreateBTNode(b); return; } if(strcmp(b->,name)!=0)//判断与否存在 { printf("不存在此主盘,请重新输入!\n"); printf("请输入需要添加分区主盘名字:");scanf("%s",&name); } intchildnum;//定义分区数目 printf("请输入分区数目:"); scanf("%d",&childnum); for(inti=1;i<=childnum;i++)//for语句依次添加信息 { p[i]=(TSBNode*)malloc(sizeof(TSBNode)); p[i]->child=p[i]->brother=NULL; printf("请输入第%d个分区信息:\n",i); printf("卷名:"); scanf("%s",&p[i]->); printf("类型:"); scanf("%s",&p[i]->data.type); printf("容量:"); scanf("%s",&p[i]->data.volume); if(FindNode(b,p[i]->)!=NULL)//判断与否重复 { printf("分区卷名重复,请重新输入!\n"); printf("卷名:"); scanf("%s",&p[i]->); printf("类型:"); scanf("%s",&p[i]->data.type); printf("容量:"); scanf("%s",&p[i]->data.volume); } if(i==1) b->child=p[i]; else p[i-1]->brother=p[i]; } printf("格式化成功!\n");geshi=1; system("pause"); //按回车键继续;}文献(夹)添加中:同格式化,一方面输入分区或文献(夹)名字,判断与否存在此分区或文献(夹),同步也判断与否进行硬盘格式化,是话继续,否则返回格式化界面。还增长了需要添加文献输入,并判断与否存在或重复。以便下面建立关系。voidAdd(TSBNode*&b)//文献(夹)添加####3文献增长####{ system("cls"); printf("********欢迎来到添加文献(夹)信息界面!********\n"); printf("\n"); TSBNode*p[MAXCHILD],*q;intchildnum;charname[MAX];printf("请输入需要添加文献(夹)分区或文献夹名字:");scanf("%s",&name); if(geshi==0)//判断与否进行格式化,否则返回格式化界面 { printf("请先进行格式化!\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(inti=1;i<=childnum;i++) { p[i]=(TSBNode*)malloc(sizeof(TSBNode)); p[i]->child=p[i]->brother=NULL;printf("请输入第%d个文献(夹)信息:\n",i);printf("名字:");scanf("%s",&p[i]->); printf("大小:"); scanf("%s",&p[i]->data.volume); if(FindNode(b,p[i]->)!=NULL)//判断与否重复 { printf("此文献夹已添加,请重新输入!\n"); printf("名字:\n");scanf("%s",&p[i]->); printf("大小:"); scanf("%s",&p[i]->data.volume); } if(i==1) q->child=p[i]; else p[i-1]->brother=p[i]; } printf("添加成功!\n"); system("pause");}文献(夹)修改中:前面写了查询结点函数,此中输入需要修改文献(夹)名字,查找到后直接修改信息。voidChange(TSBNode*b)//文献(夹)修改####4文献修改####{ system("cls"); printf("********欢迎来到修改文献(夹)信息界面!********\n"); printf("\n"); TSBNode*q; charname[MAX]; printf("请输入需要修改文献(夹)名字:"); scanf("%s",&name);q=FindNode(b,name);if(q==NULL) {printf("此文献(夹)不存在!\n");system("pause"); return; } printf("请输入修改后文献(夹)信息:\n"); printf("名字:");scanf("%s",&q->); printf("大小:"); scanf("%s",&q->data.volume); system("pause");//按回车键继续}文献(夹)查询中:一方面查找到结点,判断与否存在,存在话直接输出此文献(夹)信息。下面输出途径中,要写查找父结点函数和结点高度函数。在查询中用for循环(用高度作为判断条件)将每个需要父节点输入到数组里,结束后,倒序输出。intTSBHeight(TSBNode*b,TSBNode*q)//计算成员文献夹高度{staticinth=0;staticintn=1; if(b==NULL) returnh; if(strcmp(b->,q->)==0) return(h=n); n++;TSBHeight(b->child,q); n--;TSBHeight(b->brother,q);returnh;}TSBNode*FindFather(TSBNode*b,TSBNode*q)//查找某结点爸爸结点{ TSBNode*p; if(b!=NULL) { p=b->child; while(p!=NULL) { if(p==q) returnb; else p=p->brother; } p=FindFather(b->child,q); if(p!=NULL) returnp; else returnFindFather(b->brother,q); } return0;}voidPath(TSBNode*b,TSBNode*q)//输出文献(夹)途径{ TSBNode*p; p=q; if(TSBHeight(b,q)==0)printf("空文献!");else { inth;//表达文献高度 h=TSBHeight(b,q); for(inti=1;i<h;i++) { strcpy(b->date[i].name,FindFather(b,q)->); q=FindFather(b,q); } printf("途径为:"); for(i=h-1;i>=1;i--) { printf("%s-->",b->date[i].name); } printf("%s",p->);printf("\n"); }}voidDisplay(TSBNode*b,TSBNode*q)//输出文献夹信息和途径{ printf("名字:%s 大小:%s\n",q->,q->data.volume);Path(b,q); }voidSearch(TSBNode*b)//文献(夹)查询####5文献查询####{ system("cls"); printf("********欢迎来到查询文献(夹)信息界面!********\n"); printf("\n"); TSBNode*q; charname[MAX]; printf("请输入你要查询文献(夹)名字:"); scanf("%s",&name);q=FindNode(b,name);if(q==NULL) { printf("不存在此文献(夹)!\n"); system("pause"); return; } Display(b,q); system("pause");}文献(夹)删除中:一方面写删除子文献函数和查找前驱函数。在删除文献(夹)中一方面输入需要删除文献(夹)名字,判断与否存在,存在话,用p->brother和p->child同步为空和其中一种为空和都不为空四个条件来判断,删除子文献和查找前驱在里面调用,和相应递归来实现。删除了此文献,也删除了其子文献。voidDelTSBNode(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&&b->child==NULL) { if(strcmp(b->brother->,name)) returnTSBFront(b->brother,name); else returnb; } if(b->child!=NULL&&b->brother==NULL) { if(strcmp(b->child->,name)) returnTSBFront(b->child,name); else returnb; } if(b->child!=NULL&&b->brother!=NULL) { if(strcmp(b->child->,name)==0||strcmp(b->brother->,name)==0) { returnb; } else { if(TSBFront(b->brother,name)==NULL) returnTSBFront(b->child,name); else returnTSBFront(b->brother,name); } } if(b->brother==NULL&&b->child==NULL) returnNULL;}voidDelete(TSBNode*b)//电脑文献删除{ system("cls"); printf("********欢迎来到删除文献(夹)信息界面!********\n"); printf("\n"); charname[MAX]; printf("请输入你要删除文献(夹)名字(其子文(件)将一并删除):"); scanf("%s",name); TSBNode*p=FindNode(b,name);if(p==NULL) printf("无此文献(夹)!\n"); else { if(p==b) { if(p->child!=NULL) 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; if(p->child!=NULL) DelTSBNode(p->child); free(p); } else { q->brother=p->brother; if(p->child!=NULL) DelTSBNode(p->child); free(p); } }主函数硬盘初始化主函数硬盘初始化文献(夹)查询硬盘格式化文献(夹)修改文献(夹)添加文献(夹)删除P=q重复!继续!P=qP=qP=q重输!继续!继续!重输!继续!重输!退出! } system("pause");}流程图:Yesnoyesnoyesnoyesno符号阐明:charname[MAX];chartype[MAX];charvolume[MAX];文献夹信息intchushi=0,geshi=0;定义全局变量,分别用在格式化和添加文献函数中,判断初始化和格式化与否进行,是话继续,否则返回相应界面structtnode*brother;指向兄弟structtnode*child;指向孩子ElemTypedata;结点值ElemTypedate[MAX];定义数组,用于途径中父节点存储,最后输出#include<stdlib.h>头文献system("cls");达到清屏效果四、运营示例及成果分析主函数,最初界面图1初始化界面:图2格式化界面:图3另一种状况,主盘名字不存在:图4添加文献夹界面:图5添加信息时,文献重复状况:图6在文献夹里添加文献(夹):图7修改界面:图8修改另一种状况,不存在:图9查询界面:图10删除界面:图11删除后进行查询效果,1子孩子也被删除了,界面:图121兄弟还存在,不受影响界面:图13退出结束界面:图14五、调试和运营程序过程中产生问题及采用办法1、在主菜单中如果直接进行3添加信息,就会直接结束,由于必要先把1初始化和2格式化做好。因此就设了两个全局变量intchushi=0,geshi=0;分别放在格式化和添加函数中进行判断。例如:if(chushi==0)//判断与否进行初始化,否则返回初始化界面{printf("请先进行硬盘初始化!\n"); system("pause"); //按回车键继续; CreateBTNode(b); return;}在删除里面,一方面建立前驱函数,和查找中建立父节点函数,刚开始写找不到,直接结束,越看越乱,日后就画一种树,指定结点去顺,就很容易发现漏条件状况,再添加进去就好了。在输出途径中,就是想从根节点进行往下找,但是函数总是实现不了,并且思路很复杂,有太多状况浮现。日后就倒着找,调用父节点函数,一种一种输出。但始终是倒序输出状况。就定义了一种数组date[max],查找到就输进去,然后依照高度作为条件用for循环倒着将数组

温馨提示

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

评论

0/150

提交评论