还剩18页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
操作系统课程设计评定等级文件系统管理学院计算机学院专业计算机科学与技术班级姓名学号2013年1月8日广东工业大学计算机学院制文件系统管理
一、实验目的模拟文件系统的实现的基本功能,了解文件系统的基本构造和文件系统的管理方法看,加深了解文件系统的内部功能的实现通过高级语言编写和实现一个简单的文件系统,模拟文件管理的工作过程,从而对各种文件操作系统命令的实质内容和执行过程有比较深入的了解
二、实验内容和要求编程模拟一个简单的文件系统,实现文件系统的管理和控制功能在用户程序中通过使用文件系统提供的create,open,read,write,close,delete等文件命令,对文件进展操作以下报告主要包括
1.可行性分析
2.需求分析
3.概要设计4,详细设计
5.测试
6.总结
三、可行性分析
1、技术可行性对于图形编程还不了解,但是经过本学期的三次实验的练习,可以设计好命令操作界面利用大二期间学习的数据构造可以模拟出此课程设计的要求
2、经济可行性课程设计作为本课程的练习及进一步加深理解与经济无关,可以不考虑(零花费,零收益)〃左孩子接上elseparent_file-rightchild=del_file-leftchild;del_file-leftchild-parent=parent_file;freedel_file;else〃左右孩子都有{move_file_parent=del_file-leftchild;move_file=move_file_parent-rightchild;ifmove_file=NULL〃被删除结点的左孩子没有右孩子ifparent_file==NULL〃删除的为根结点fileBST=move_file_parent;fileBST-rightchild=del_file-rightchild;fileBST-parent=NULL;else ifparent_file-leftchild==del_fileparent_file-leftchild=move_file_parent;else parent_file-rightchild=move_file_parent;move_file_parent-parent=parent_file;move_file_parent-rightchild=del_file-rightchild;elsewhilemove_file-rightchild!=NULL〃寻找右边最底下的结点move_file=move_file-rightchild;move_file_parent=move_file_parent-rightchild;move_file_parent-rightchild=NULL;move_file-leftchild=del_file-leftchild;move_file-rightchild=del_file-rightchild;ifmove_file-rightchild!=NULLmove_file-rightchild-parent=move_file;〃右孩子的双亲也要改变move_file-parent=del_file-parent;iffileBST=del_file〃删除的为根结点fileBST=move_file;freedel_file;printf成功删除文件%s\n”,name;getch;return fileBST;void del_in_shareUFD*node RECfirst,^second;first=share_file;second=share_file-link;ifsecond==NULL{share_file=NULL;freefirst;}else doifsecond-file==node{first-link=second-link;freesecond;}elsefirst=first-link;second=second-link;}whilesecond!=NULL;void fcreateUFD*fileBST〃在fileBST的同一层创立文件char s;char name
[30];int flag=0;UFD*newfile,*temp=NULL;REC*stemp;systemnclsn;printfn------------------------------------------------------------------\nn;-文件系统/创建文件----------------------------------------\nn;printfC1----------------------------------------------------------------\n\nH;printfC1----------------do
1.创立文件\nH;printfn printfn
2.创立文件夹\nn;printfH printf
3.取消\nu;请选择:;\nscanfH%cH,s:*fflushstdin;ifs==,3return;ifs!=Ts!=2printf输入错误,请重新输入!\nn;}whiles!=Ts!=2;ifstrcmpfileBST-name,,,NULL,,=O〃节点已有未赋值用于本层文件夹的第一个文件的特殊情况ne wfile=fileB ST;else{newfile=UFD:f:mallocsizeofUFD;〃创立树节点newfile-leftchild=NULL;newfile-rightchild=NULL;printf”请输入文件夹名scanfH%sn,name;fflushstdin;〃搜索二叉树,文件重名就创立失败temp=searchB STfileBST,name;iftemp!=NULL printf已存在该文件夹,创立失败!\nn;strcpynewfile-name,nNULLn;return;strcpynewfile-name,name;iffolder_depth==1newfile-pre_folder=NULL;elsenewflle-pre_folder=pre_opera_folder;〃指向正在操作文件夹〃读写否,共享否whilelprintf只读r还是可读写w”;scanfn%cH,newfile-rw;fflushstdin;printf是否共享y/n”;scanfn%cn,newfile-share;fflushstdin;ifnewfile-rw==,r,||newfile-rw=w,newfile-share=y,||newfile-share==n,break;printff输入有误,请重新输入!\n〃***********以下为文件和文件夹初始化中不同的地方ifs=Tnewfile-file folder=f;newfile-folder=NULL;newfile-file=AFD*mallocsizeofAFD;printf”请输入文件的内容100n;scanfn%sn,newfile-file-afd_file;fflushstdin;newfile-length=strlennewfile-file-afd_file;else〃文件夹的初始化newfile-file_folder=o,;newfile-file=NULL;newfile-length=O;newfile-folder=UFDicmallocsizeofUFD;//连上一个空文件节点newfile-folder-pre_folder=newfile;newfile-folder-leftchild=NULL;strcpynewfile-folder-name,NULLH;newfile-folder-rightchild=NULL;//*1**1*■!**1**1*//•;、*.»•[、•卜♦卜•卜♦卜•卜,]■♦卜・卜*i*•卜♦卜•[、♦卜,[•♦卜■卜*»*,卜•卜•卜*•*,:、♦卜♦卜*T*•卜・卜*7*iffileBST!=newfileinsertBSTfileBST,newfile;〃初始化完成后插入到二叉树中elsenewflle-parent=NULL;//第一个结点略去插入,其双亲结点为空ifnewfile-share==,y〃接入共享链{stemp=REC*mallocsizeofREC;stemp-file=newfile;stemp-link=share_file;share_file=stemp;UFD*fdeleteUFD*fileBST〃在fileBST的同一层删除文件char name[30|;REC*temp;printf”请输入要删除的文件”;scanfn%sH,name;fflushstdin;temp=open_file;〃检查文件是否翻开,翻开那么删除失败whiletemp!=NULL{ifstrcmptemp-file-name,name==O{printfC文件翻开中,请关闭后再删除!getch;return fileBST;else temp=temp-link;fileBST=deleteBSTfileBST,name;return fileBST;void fopenUFD*fileBST char name
[30];UFD*temp=NULL,*templ=NULL;printf”请输入要翻开的文件的名字”;scanfn%sH,name;fflushstdin;temp=searchBSTfileBST,name;iftemp==NULLprintff文件不存在!\nn;temp=check_sharename;iftemp==NULL{print」文件不存在!\nn;return;〃*******************找至lj文件,以下为翻]开局部**********************iftemp-file_folder==,o,〃翻开文件夹folder_depth++;temp1=pre_opera_folder;//保护正在操作文件pre_opera_folder=temp;temp-folder=operationstemp-folder;pre_opera_folder=temp1;〃写回folder_depth—;else〃翻开文件{REC*newopen;newopen=REC*mallocsizeofREC;//接入翻开链newopen-file=temp;newopen-link=open_file;open_file=newopen;printf已成功翻开问%s!\nn,temp-name;getch;void fclosechar namef30];REC*first二NULL,second二NULL;printf”请输入要关闭的文件”;scanf,,%s,,name;fflushstdin;first=open_file;iffirst==NULLprintfn没有翻开的文件\n”;getch;return;else second=first-link;ifsecond==NULLstrcmpfirst-file-name,name==0freefirst;open_file=NULL;printf成功关闭文件%s\n!”,name;return;elsewhilesecond!=NULLifstrcmpsecond-fiie-name,name==0first-link=second-link;freesecond;printf成功关闭文件%s\n!”,name;return;else{first=first-link;second=second-link;}printf没有找到问件%$,关闭失败!\n\name;void fread_writeUFD*fileBST,char fchar s;char name
[30];char newfile
[100];UFD*temp=NULL;iff=5printf”请输入要读取的文件的名字”;elseprintf”请输入要写入的文件的名字”;scanf,%s,,name;fflushstdin;temp二searchB STfileBST,name;iftemp=NULLprintf文件不存在!\nH;temp=check_sharename;if temp二二NULL{printf文件不存在!\nn;return;iftemp-file_folder==,oprintf文件夹不可读写!return;}printf文件的内容是%s\n\n\n,,temp-file-afd_file;getch;iff==*5return;〃读取文件操作到此完毕iftemp-rw==,r,printf(只读文件,不可写入!\nn);return;else〃追加或重写dosystemnclsn;追加\吟;printfu printfn
1.重写printfn
2.\n
3.取消\nn;printf请选择:\nn;scanfn%cn,s;fflushstdin;ifs==3return;ifs!=Ts!=2printf输入错误,请重新输入!\n;}whiles!=Ts!=2;printf”请输入要重写或追加的内容100”;scanfn%sn,newfile;fflushstdin;ifs==T〃修改strcattemp-file-afd_file,newfile;elsestrcpytemp-file-afd_file,newfile;temp-length=strlentemp-file-afd_file;}UFD*check_sharechar name
[30]chars;UFD*temp=NULL;REC*stemp=NULL;printf”共享文件夹为\nH;stemp=share_file;whilestemp!=NULL{printfH%s\stemp-file-name;ifstemp-file-file_folder==,fprintf,,\tn;else printfn..\tn;stemp=stemp-link;printfCAn是否尝试在共享文件夹中翻开y/n;do{s=getchar;ifs==n||s==Nreturn NULL;else ifs==,y||s==,Y,break;elseprintf输入错误,请重新输入”;}whiles!=Vs!=ns!=Ys!=N;stemp=share_file;whilestemp!=NULLifstrcmpstemp-file-name,name==O{temp=stemp-file;break;}stemp=stemp-link;return temp;UFD*operationsUFD*fileBSTwhilelchar s;systemncls;ifopen_file!=NULL printf已翻开文件,请及时关闭!\nprintf”文件名\t文件长度\t读写\t共享\t内容printfn\nn;print_open_file;printfH\nn;printf当前路径:print_pathfileBST;printfH\nn;ifstrcmpfileBST-name/,NULLn==O printf本层文件为空!\nn;else{printf本文件夹包含以下文件:\nM;BSTtraversefileBST;printfn\nn;printfn
1.创立文件create\nn;printfn
2.删除文件delete\nprintfn
3.翻开文件open\nn;printfn
4.关闭文件close\n”;printfn
5.读文件read\nn;printfn
6.写文件write\nn;printfn
0.返回上一层/注销\n\nH;printf请选择”;printf*;scanfn%cn,s;fflushstdin;switchs{case*r fcreatefileBST;break;case2:fileBST=fdeletefileBST;break;case3:fopenfileBST;break;case4:fclose;break;case5:case6:fread_writefileBST,s;break;case O:return fileBST;default:break;}}void Log_inMFD*temp=NULL;char name[30|;char flag=O;ifmfd」ink==NULL printff目前还没有创立用户,请创立后再登陆!”;getch;return;doprintf”请输入用户名:;scanfH%sn,name;fflushstdin;ifstrcmpname,cancel==Oreturn;〃取消登陆temp=mfd_link;whiletemp!=NULL ifstrcmpname,temp-name==Opre_user=temp;folder_depth++;pre_opera_folder=temp-bst_pointer;temp-bst_pointer=operationstemp-bst_pointer;作〃进入文件操pre_opera_folder=NULL;folder_depth-;;flag=T return;else
3.法律可行性自己编写的程序,仅为练习,不作其他用途,与外界没什么联系,可行
四、需求分析编写程序实现文件系统,主要有以下几点要求:
1、实现无穷级目录管理及文件管理基本操作
2、实现共享“别名〃
3、加快了文件检索
五、概要设计为了抑制单级目录所存在的缺点,可以为每一位用户建设一个单独的用户文件目录UFD UserFileDirectory这些文件目录可以具有相似的构造,它由用户所有文件的文件控制块组成此外,在系统中o再建设一个主文件目录MFD MasterFile Directory;在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录的指针本设计主要实现下面几个数据构造M DF UF DA FD用户名文件名翻开文件名文件目录指针保护码翻开保护码用户名文件长度读写指针文件目录指针文件名■■■总体的流程图如下
六、详细设计主要数据构造
1.MFD MasterFile Directory,主要用以存放用户,可以增加存放密码的字符数组,本设计没有保密安全方面的忧虑,为了使用时操作更简单省去密码所以,MFD构造仅包括用户名和指向子目录的一个指针,以及指向下一用户的连接点,为线性构造struct MFDchar name
[20];〃用户名UFD^bst.pointcr;〃文件目录指针MFD*link;;
2.UFD UserFile Directory,用于存放文件的数据构造由于本设计为了加快检索速度,使用了二叉排序树的构造,所以UFD构造中相应参加了用于树构造的parent,leftchild,和rightchild记录链接情况temp=temp-link;printf”用户不存在,请重新输入!输入cancel取消登陆〃防止使用者忘记登陆名printfn\nM;}whilel;voidInit_user char name
[30];MFD*newmfd,*temp=NULL,*temp1=NULL;printf”请输入用户名”;scanfn%sH,name;〃输入名字fflushstdin;printfn\nn;temp=mfd_link;iftemp!=NULL doifstrcmptemp-name,name==O{printff用户已存在,创立失败!\nn;getch;return;iftemp-link==NULLtemp1=temp;temp=temp-link;}whiletemp!=NULL;newmfd=MFD*mallocsizeofMFD;strcpynewmfd-name,name;newmfd-bst_pointer=UFD*mallocsizeofUFD;〃创立一个空的文件夹newmfd-bst_pointer-pre_folder=NULL;newmfd-bst_pointer-leftchild=NULL;strcpynewmfd-bst_pointer-name,nNULLn;newmfd-bst_pointer-rightchild=NULL;newmfd-link=NULL;iftemp1!=NULLtemp l-link=newmfd;〃插到队尾else mfd_link=newmfd;printf成功创立用户%s!n,name;getch;void Check_userint i=l;MFD*temp;ifmfd」ink==NULLprintfn目前还没有创立用户!”;getch;return;printf以创立的用户有\nn;temp=mfd_link;whiletemp!=NULL{printf用户%d:%s\n,,,i,temp-name;temp=temp-link;i++;printfu\nn;getch;return;int mainchars;whilelsystemnclsn;printfn-----------------------------------------------------------------\nn;printfn---------------------------文件系统---------------------------------------\nn;printfn-----------------------------------------------------------------\n\nu;printfn
1.登录\n;printfn
2.添加新用户\nn;printfn
3.查看已注册用户\n”;printfn
0.退出\n\n”;printfH请选择”;printf”;scanfn%cn,s;fflushstdin;ifs!=0s!=Ts!=2s!二3{printf输入错误,请重新输入”;getch;fflushstdin;continue;switchscase T:Log_in;break;case2:Init_user;break;case3:Check_user;break;case O:return1;default:break;}return0;
七、测试登录操作以下为对文件的六个基本操作无穷级文件、文件路径的显示,以及翻开一个不存在的文件的例如翻开普通文件后的情况,此时不能删除文件本系统未能实现级联删除,操作被制止关闭文件后删除操作成功逐个删除后“文件系统”文件夹也可以删除了
八、总结本次课程设计设计的知识比较广,需要较好的理解能力和编程能力在本次设计中,花费时间比较多的应该是数据构造的设计与更改了在开场时仅仅按照实验指导书上的MDF、UFD、AFD做了相应的数据构造,而且里面包含的数据比较少初衷是在以后的实现时需要再加进去但是,在以后加进去的时候发现有不少细节需要增加,例如创立一个文件,需要对里面的各个变量进展初始化,在构造体中增加变量的时候就忘记了其他地方的初始化,顾此失彼另外,在设计之初是想在MFD和UFD中增加一个BST链接以加快检索的,代码打了一半之后有觉得麻烦,代码过长而把它删除改变,变动比较大所以,经过这次教训,我觉得以后再设计程序之前就应该考虑到具体的数据构造,尽量想得全面一点,这样后面的修改就可以省不少时间,还有就是,尽量不要改数据构造以上是关于数据构造的设计了一个号的数据构造,本课程设计的实现就容易多了,但是某些操作还是需要取舍的例如在建设共享链的时候,本来是在UFD中再参加一个指针以指示共享文件的,但后来发现一个构造体如果吧太多不相关的变量都放在一起的话会变得很混乱,最后决定另建一个链构造RECo课程设计对编程能力也肯定是一个不错的锻炼在设计删除函数和操作函数时,原先我是设计为void型的,但是调试的时候发现删除根结点第一个文件的时候程序会出错后来断点检查发现传地址的函数中,其传递的地址不可以在子函数中free掉,这样它的主函数中的地址也会被发生改变的,后来想到了给函数返回一个新的地址总之,本次实验加深了对文件的存储构造的理解,同时还锻炼了C语言及其数据构造,是一个综合性的实验当本文件为普通文件时,为下级记录申请AFD file,folder为空同样,当本文件为文件夹时,为它申请相应的空间,AFD为空以此来到达无穷级别目录的存储struct UFDUFDparent;UFD*leftchild;UFD*rightchild;UFD bolder;〃作为文件夹时指向下一层,文件时为空UFD*pre_folder;〃指向上一层目录文件夹时用至UAFD*file;〃作文文件时文件的具体内容char name
[30];〃文件夹名字int length;〃作为文件时文件的长度,默认为0char rw;〃读写标志r orwchar share;char filefolder;〃指示此文件是文件或文件夹,f为文件,为文件夹〃共享标志y orn;
3.AFD,存放文件的内容的构造,比较简单,文件内容用一个字符数组存储,为顺序构造,最多可存放99个字符struct AFDcharafd_file
[100];int read;//读指针int write;〃写指针;
4.RECstruct REC//UFD的线性链,用于记录共享文件和已翻开文件UFDREC*link;;关键函数说明void Log_in;//登陆void Init_user;〃创立用户void Check_user;〃查看用户以上三个函数为开场时管理用户创立和登陆的函数开场时没有用户,需要创立后才可登陆创立用户即自动分配一个存放用户文件的UFD,此时的UFD为空,需要后续的创立文件以及文件夹的分配UFD*operationsUFD*fileBST;〃文件夹的操作调用用户登陆后即开场对该用户文件UFD的操作,同时,假设在文件夹中创立一个文件夹,它同样可以分配得到一个UFD,对用户文件的操作可以重复调用,以此来到达无穷级目录的操作在里层文件的操作和外层的是一样的,但假设要退回外层文件夹就需要逐层返回,不能立即跳到某一层某地址操作完毕后返回改变后的文件存储状态void fcreateUFD*fileBST;〃对文件夹的六个基本操作UFD*fdeleteUFD*fileBST;void fopenUFD*fileBST;void fcloseUFD*fileBST;void fread_writeUFD*fileBST,char f;〃读写操作按选择仁5为读6为写以上五个函数为对文件的六个基本操作,其中读文件和写文件局部代码一样,所以由一个函数完成在create五个函数中,分别对文件夹fileBST做了相应的处理,由于删除文件的函数可能会删除到头结点,所以需要一个返回值void insertBSTUFD*fileBST,UFD*newBST;〃在fileBST中插入新的结点newBST UFD*searchBSTUFD*fileBST,char name;〃在fileBST树中查找名字为name的结〃点并返回该结点,文件不存在那么返回空void BSTtraverseUFD^fileBST;〃遍历二叉树UFD^deleteBSTUFD^fileBST,char name
[30];〃删除name结点,返回删除后的结点由于该设计的存储构造用到了二叉排序树,所以把相关的操作写成函数,供基本操作的函数调用insert函数在fileBST中插入新的结点newBST;search函数在fileBST树中查找名字为name的结点并返回该结点,文件不存在那么返回空;还有trav6rse和delete函数对二叉排序树做了基本的操作void print_pathUFD*fileBST;//输出当前路径void print_open_flle;〃输出已翻开的文件为了在文件系统中使用户看出路径及一些相关的状态,设置了输出文件路径的函数,路径由每个文件的构造体中pre_folder记录上一层的文件夹名字,这样逐层输出即可到达目的每执行一次操作就输出一次已翻开的文件的具体情况,翻开的文件应及时关闭,否那么删除时会有删除失败提示UFD*check_sharechar name
[30];〃在共享链中检查是否有name文件,有那么//返回该UFD,没那么NULLvoid del_in_shareUFD*node;〃在共享链中删除node结点以上两个函数为对共享文件的处理函数,当翻开或读写文件时在本层文件中未找到相应的文件时,就用check_share函数在共享文件中查找,如果存在就返回该文件的UFD,不存在就返回NULL,而del_in_share函数是伴随着删除文件的函数出现的,目的是为了删除文件以后不会在共享链中再存在具体代码如下filesysterm.hstruct AFDcharafd_file
[100];int read;〃读指针int write;〃写指针);struct UFDUFDparent;UFD*leftchild;UFD*rightchild;UFD*folder;〃作为文件夹时指向下一层,文件时为空UFD*pre_folder;〃指向上一层目录(文件夹时用至U)AFD*file;〃作文文件时文件的具体内容char name
[30];〃文件(夹)名字int length;〃作为文件时文件的长度,默认为0char rw;〃读写标志1r orwchar share;〃共享标志y ornchar file_folder;〃指示此文件是文件或文件夹,f为文件,为文件夹;struct MFDchar name
[20];〃用户名UFD*bst_pointer;〃文件目录指针MFD*link;;//UFD的线性链,用于记录共享文件和已翻开文件struct RECUFD*file;REC*link;;〃登陆void Log_in;void Init_user;〃创立用户void Check_user;〃查看用户user不为空时为第一层〃UFD^operationsUFD*fileBST;//文件夹的操作调用,对文件夹的六个基本操作void fcreateUFD*fileBST;UFD*fdeleteUFD*fileBST;void fopenUFD*fileBST;void fcloseUFD*fileBST;void fread_writeUFD^fileBST,char f;〃代码有重复,合并读写操作按选择s=5为读6为写〃新文件插入到user文件树中void insertBSTUFD*fileBST,UFD*newBST;〃在fileBST树中查找名字为name的结点UFD*searchBSTUFD*fileBST,charname;并返回该结点〃文件不存在那么返回空〃遍历二叉树void BSTtraverseUFD*fileBST;〃删除成功返回1,失败返回0UFD*deleteBSTUFD*fileBST,charname
[30];〃输出当前路径void print_pathUFD*fileBST;〃输出已翻开的文件void print_open_file;〃在共享链中检查是否有name文件,有那么UFD^check_sharechar name
[30];返回UFD,没那么NULL voiddel_in_shareUFD〃在共享链中删除node结点*node;main.cpp#include iostream#includeconio.h〃用户链表#include,,filesystem.h,MFD*mfd」ink=NULL;〃当前操作用户〃当前操作文件夹MFD*pre_user;UFD*pre_opera_folder=NULL;〃记录当前文件深度(用于辅助pre_folder的初始化)int folder_depth=0;REC*share_file=NULL;REC*open_file=NULL;iffileBST-pre_folder!=NULLvoid print_pathUFD*fileBST〃输出路径{print_pathfileBST-pre_folder;printf,7%s,,fileBST-pre_folder-name;elseprintf,7%sn,pre_user-name;void print_open_file REC*temp;int i=5;temp=open_file;whiletemp!二NULL printf,%s\t%d\t\tn,temp-file-name,temp-file-length;iftemp-file-rw==,rprintfn只读\t;else printf可读写\t”;iftemp-file-share==y,printfn^\tn;elseprintf“否\t;fori=0;i5;i++iftemp-file-file-afd_file[i]!=\O!printfn%cn,temp-file-file-afd_file[i];else break;iftemp-file-file-afd_file[i]!=\0,i==5printfn..n;printfn\nn;temp=temp-link;}void BSTtraverseUFD*fileBST//遍历二叉树前序遍历UFD*left,*right;printf,,%s,,,fileBST-name;iffileBST-file_folder==D〃输出..以区分文件夹printfH..\tH;else printfn\tn;iffileBST-leftchild!=NULL〃递归left=fileBST-leftchild;BSTtraverseleft;iffileBST-rightchild!=NULL{right=fileBST-rightchild;B STtraverseright;}UFD*searchBSTUFD*fileBST,charname
[30]〃在fileBST树中查找名字为name的结点并返回该结点{〃文件不存在那么返回空int flag;flag=strcmpfileBST-name,name;ifflag==O return fileBST;〃查找成功else ifflag0iffileBST-leftchild==NULL returnNULL;〃查找失败elsesearchBSTfileBST-leftchild,name;〃递归调用elseiffileBST-rightchild==NULL returnNULL;else searchBST fileBST-rightchild,name;void insertBSTUFD*fileBST,UFD*newBST〃将结点newBST插入原二叉树fileBST中int flag;flag=strcmpfileBST-name,newBST-name;ifflag0iffileBST-leftchild==NULL〃插入fileBST-leftchild=newBST;newBST-parent=fileBST;elseinsertBSTfileBST-leftchild,newBST;〃递归调用else iffileBST-rightchild二二NULL〃插入fileBST-rightchild=newBST;newBST-parent=fileBST;elseinsertBSTfileBST-rightchild,newBST;〃递归调用/*flag=O的情况已在创立时排除*/UFD*deleteBSTUFD*fileBST,charname
[30]〃删除名字问name的文件结点UFD*parent_file=NULL,*del_file二NULL;UFD*move_file=NULL,^move_file_parent;del_file=searchBSTfileBST,name;ifdel_file==NULLprintf没有此文件,删除失败!\nn;getch;return fileBST;〃查找失败ifdel_file-file_folder==,o,strcmpdel_file-folder-name,nNULL,,!=0{printf注意,本系统未能实现级联删除,请先逐个删除文件!printf文件夹非空,删除失败!\iT;getch;returnfileBST;ifdel_file-share==y〃先在共享链中删除del_in_sharedel_file;parent_file=del_file-parent;ifdel_file-leftchild==NULLdel_file-rightchild==NULL〃被删除结点为子叶结点ifdel_file==fileBST〃只有一个结点strcpyfileBST-name,uNULLn;else ifparent_file-leftchild==del_file parent_file-leftchild=NULL;freedel_file;else parent_file-rightchild=NULL;freedel_file;elseifdel_file-leftchild=NULL||del_file-rightchild==NULL〃被删除结点没有做孩子或右孩子ifdel_file-leftchild=NULL〃没有左孩子ifparent_file==NULL〃删除的为根结点fileBST=del_file-rightchild;del_file-rightchild-parent=NULL;}elseifparent_file-leftchild==del_file〃右孩子接上parent_file-leftchild=del_file-rightchild;del_file-rightchild-parent=parent_file;}else//右孩子接上parent_file-rightchild=del_file-rightchild;del_file-rightchild-parent=parent_file;else〃没有右孩子ifparent_file==NULL〃删除的为根结点fileBST=del_file-leftchild;del_file-leftchild-parent=NULL;elseifparent_file-leftchild==del_file〃左孩子接上parent_file-leftchild=del_file-leftchild;del_file-leftchild-parent=parent_file;。