




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构指导老师:陈桂玲罗开华|193132班|201310018422015年1月5日题号:4 题目:文件目录管理与显示1.需求分析给出目录和文件信息,编程实现将其排列成一棵有一定缩进的树。 要求: (1)设计文件和目录信息树的存储结构。 (2)从文件或键盘输入目录和文件信息,输入格式采用绝对路径法,即: A AAA1 AAA1aa1.doc AAA1aa2.txt 创建时要检查同一路径下不能有同名的目录或文件名 (3)设计文件和目录信息树的输出格式(以凹入表的形式显示)。 (4)查找指定目录和文件。 (5)添加新目录或新文件。 (6)删除指定目录或文件,子目录能够被删除的前提是其为空,既不包含任何子目录 和文件;根目录不能删除。 (7)扩充目录或文件信息,如创建时间、读写权限、文件长度或子目录包含的子目录 和文件数等。 (8)对同一层次下的子目录或文件按创建时间有序输出。 (9)通配符的使用。如用“?”代表任意一个字符,用“*”表示任意多个多个任意字符。 扩展内容: 实现相对路径表示法。2.设计2.1设计思想(1)数据结构设计在存储结构方法上,采用二叉链表法,为简化对目录或文件的称呼,以下统称为 结点。 每个目录和文件都有基本信息,根据要求建立结构体(2)算法设计(1) 创建根目录 a. 申请结点,输入基本信息; b.所有指针置空; (2)结点创建 P 代表母结点 a.判断所给结点是否为目录。不是,则给出失败信息; b.查看是否在同一层有重名,若有,给出失败信息; c. 申请结点,完善基本信息; e. 根据母目录确定是否为孩子或孩子兄弟成员,建立链接关系; f.结点孩子指针,兄弟指针置空; q-firstchild=NULL; q-brother=NULL; (3)根据所给结点名称与同一层存在的结点名称比较,定位到所需结点; info*Compare(char*ch,info*p) /同级指针,根据文件名在同级目录里查找指定文件; a.判断是否为根结点; b. 回到该层次的第一个结点,即结点父亲的firstchild 指向结点; c.依次比较,确定位置,若不存在,返回NULL ; (4)绝对路径法提取目录名或文件名,定位指定结点 * a. 由该层内的应该用户给出的结点名称,提取字符段; b.根据该段字符在该层次内查找定位到存在的结点,若不存在,给出失败信 息 c.提取下一段字符,到S2 继续比较;直到结束符*; (5)树形展开目录 分析:对数据结构设计中图C 进行顺时针45 度旋转得到下图D Parent L1 Brother info Firstchild L2 Parent Parent Brother info Firstchild Brother info Firstchild L1 忽略指针L1 、L2 ,可以发现这是一颗二叉树;故图A 或图B 可以构成二叉树, 图形如下: A B AA1 c.txt AA2 aa1.doc 在这课二叉树中,左孩子与其双亲点在图A 或图B 中处于同一层, (6)展开目录下的所有结点 A B C txt D a.判断是否有下一层 b.输出结点孩子名称; c.循环输出结点孩子的兄弟; (7)删除指定目录或文件 后删 先删 以它作为AA1 A 的子树根结点 AA1 BB aa1.doc AA2 B c.txt (8)关于结点输出 a.输出结点名; b.如果为文件,输出文件类型 2.2设计表示(1)关系调用图略(2)函数接口规格说明(1) void NodeShow(info *q) 输出结点q的文件名和文件类型。(2) info * Compare(char *ch,info *p) 比较输入的字符串ch与地址p是否一致(3) void unfold(info * p) 展开目录p下的所有信息。(4) void Creat(info *p) 以p为根结点创建目录或文件。(5) void rootcreat(info *p) 创建树的根节点p,并把所有指针置为NULL。(6) info *locate(info *p) 查找位置。根据该层用户给出的结点名称,提取相应的字符段,根据该段字符在层次内进行查找,定位到存在的结点,如不存在,给出失败的提示(7)int Delete(info *p) 删除结点p。(8)void Traverser(info *p) 树形展开目录p下所有信息。(9)void Information(info *p) 输出文件或目录的详细信息。2.3详细设计2.3.1添加新文件或目录(1)结点创建:判断所给结点是否为目录。不是,则给出失败信息; if(p-cf) printf(Cant add the file in file!n);return;查看是否在同一层有重名,若有,给出失败信息; if(p-firstchild) w=Compare(q-name,p-firstchild);if(w) if(strcmp(q-filetype,w-filetype) printf(exist,cant addn);(2)创建根目录:判断添加的类型 if(q-cf)/输入1,添加文件printf(Input the filetype:);scanf(%s,q-filetype);printf(Input the size:);scanf(%d,&q-size);getchar(); if(!q-cf)/输入0,添加目录q-filetype0=0;q-size=0;(3)申请结点,完善基本信息;所有指针置空; q-time.year=00; q-time.month=00; q-time.date=date+; q-flag=0; q-parent=p; q-firstchild=NULL; q-brother=NULL; q-cenci=p-cenci+1; q-n=0; p-n+; if(!p-firstchild)p-firstchild=q;/如果p的第一个孩子为空,则此时的q即为p的firstchildelsep=p-firstchild;/如果p的第一个孩子不为空,则p指向firstchildwhile(p-brother)/如果p的孩子的兄弟不为空,则p指向brotherp=p-brother;p-brother=q;/如果p的孩子的兄弟为空,则此时的q即为p的brotherprintf(add sucessful!n); 2.3.2显示功能(1)展开目录下的所有信息。以凹入表的形式显示。先展开根结点信息,再展开firstchild的信息,最后展开brother的信息。void NodeShow(info *q)/输出文件名和文件类型if(q)printf(%s,q-name);/输出文件名if(q-cf)printf(.%s,q-filetype);/输出文件类型void Traverser(info *p)/树形展开目录int i;info *q=p;if(!p) return;for(i=0;icenci;i+)printf( );NodeShow(q);printf(n);Traverser(p-firstchild);/递归调用Traverser(p-brother); /递归调用(2)展开显示功能void unfold(info * p) NodeShow(p);/ 先展开根结点信息printf( contains:n);if(!p-firstchild)printf(No directory or filen);return;p=p-firstchild;/再令p指向firstchildif(p)printf(t);NodeShow(p); /再展开firstchild的信息printf(n);while(p-brother)p=p-brother; /再令p指向brotherprintf(t);NodeShow(p); /最后展开brother的信息printf(n);2.3.3查找目录或文件功能比较输入的字符串与地址是否一致。先比较parent,再比较firstchild,再比较brother。 while(d!=#&d!=.)if(d=)/根据该层用户给出的结点名称,提取相应的字符段,根据该段字符在层次内进行查找,定位到存在的结点,如不存在,给出失败的提示ci=0;scanf(%c,&d);i=0;p=Compare(c,p);if(!p)printf(path error!n);return NULL; p=p-firstchild;ci+=d;scanf(%c,&d);if(d=.)i=0;scanf(%c,&d);while(d!=#)/ 提取下一字符,返回,直到字符为#结束ti+=d;scanf(%c,&d);ti=0;if(d=#)ci=0;p=Compare(c,p);if(!p)printf(directory path error!n);return NULL;if(t0!=0&p-filetype0!=0)if(strcmp(t,p-filetype)printf(file path error!n);return NULL;return p;else if(t0=0&p-filetype0=0) return p;printf(ee path error!n);return NULL;2.3.4删除目录或文件功能遍历目录,查找所需的文件或目录,删除文件。void DELETE(info *p)info *q;q=p-parent;if(p-firstchild) Delete(p-firstchild);if(q-firstchild=p)q-firstchild=p-brother;free(p);elseq=q-firstchild;while(q-brother!=p&q-brother) q=q-brother;q-brother=p-brother;free(p);int Delete(info *p)if(p)Delete(p-brother);Delete(p-firstchild);free(p);return 0;3调试分析 主要面临的问题有以下几方面:从绝对路径中提取字符段 树形目录展开时缩进问题 其中第一个方面问题,发现调用库中函数不成功,于是通过对字符串复制、连接、比较几个功能练习一下解决了。 再说第二方面的问题,为了解决缩进问题,采用了几种方法,有的虽然有点那么回事,但总是同一层次的缩进量不一样,于是我想了个办法,决定在结点基本信息里添加一个数据,即记录结点所在的层次,根目录为0,往下依层次逐层加1,这样在DRL 遍历时,通过所在层次决定缩进量,即 缩进量 = 层次值 单位缩进量 其中,单位缩进量是常量,如:” ”,用两个空格表示,这样便解决 了同一层结点缩进量不一致的情况。对于这道题目,现在来看看的话,主要把握好以下几点:把题中树形结构转为二叉树结构,左孩子在原树中为其双亲结点的兄弟,右孩子在原树中为其双亲结点的第一个孩子会熟练掌握和运用二叉树解决问题。在现有条件下若不好解决问题,可以适当创造一些条件,尝试其他思维。4.用户手册本程序的运行环境为windows下的c语言编译器vs20125.测试数据及测试结果(1)添加目录(2)显示目录(3)添加失败(4)添加文件成功(5)展开目录6.源程序清单#include#include#include#includeint date=0;typedef struct creat_timeint year;int month;int date;creat_time;typedef struct infoint flag;int cf;char name20;char filetype10;creat_time time;struct info *parent,*firstchild,*brother;int n;int cenci;int size;info;/一个节点,包含当前目录信息,包括父节点,第一个孩子节点,兄弟节点等void NodeShow(info *q)/显示节点信息,即展开目录if(q)printf(%s,q-name);if(q-cf)printf(.%s,q-filetype);info * Compare(char *ch,info *p)/比较目录是否存在int i;if(!p) return NULL;if(!p-parent)/跟父节点比较i=strcmp(ch,p-name);if(!i) return p;return NULL;p=p-parent;p=p-firstchild;i=strcmp(ch,p-name);/跟第一个孩子节点比较if(!i) return p;/在目录里面,返回目录地址elsewhile(p-brother)/跟兄弟节点比较p=p-brother;if(!strcmp(ch,p-name) return p;return NULL;/不在目录里面,返回空void unfold(info * p)/展开目录NodeShow(p);printf( 包括:n);if(!p-firstchild)printf(没有此目录或文件n);return;p=p-firstchild;/第一个孩子节点if(p)printf(t);NodeShow(p);printf(n);while(p-brother)/兄弟节点p=p-brother;printf(t);NodeShow(p);printf(n);void Creat(info *p)/创建目录info *q=NULL;info *w=NULL;if(p-cf)printf(不能添加文件!n);return;q=(info *)malloc(sizeof(info);printf(0.Directoryt1.Filen);/创建目录还是文件scanf(%d,&q-cf);printf(输入名字:);scanf(%s,q-name);getchar();if(q-cf)/创建文件步骤printf(输入文件类型:);scanf(%s,q-filetype);printf(输入数量:);scanf(%d,&q-size);getchar();if(p-firstchild)w=Compare(q-name,p-firstchild);if(w)if(!strcmp(q-filetype,w-filetype)printf(已经存在,不能添加!n);return;if(!q-cf)/创建目录步骤q-filetype0=0;q-size=0;q-time.year=00;q-time.month=00;q-time.date=date+;q-flag=0;q-parent=p;q-firstchild=NULL;q-brother=NULL;q-cenci=p-cenci+1;q-n=0;p-n+;if(!p-firstchild)p-firstchild=q;/存地址,建立目录树形结构elsep=p-firstchild;while(p-brother)p=p-brother;p-brother=q;printf(添加成功!n);void rootcreat(info *p)/创建根目录int i=0;p-cenci=0;p-cf=0;p-n=0;p-time.year=00;p-time.month=00;p-time.date=date+;p-filetype0=0;strcpy(p-name,T);p-parent=NULL;p-firstchild=NULL;p-brother=NULL;info *locate(info *p)/定位目录位置,若目录有误则返回空int i=0;char d,c10,t10;t0=0;scanf(%c,&d);scanf(%c,&d);/接收输入的目录路径while(d!=*&d!=.)/目录路径不为空以及不包含.,循环查找当前目录以及其子目录是否存在所输入目录if(d=)ci=0;scanf(%c,&d);i=0;p=Compare(c,p);if(!p)printf(路径有误!n);return NULL; p=p-firstchild;/对子目录进行查找ci+=d;scanf(%c,&d);if(d=.)i=0;scanf(%c,&d);while(d!=*)ti+=d;scanf(%c,&d);ti=0;if(d=*)/路径结束标记ci=0;p=Compare(c,p);if(!p)printf(目录路径有误!n);return NULL;if(t0!=0&p-filetype0!=0)/路径名称合法if(strcmp(t,p-filetype)printf(文件路径有误!n);return NULL;return p;else if(t0=0&p-filetype0=0)return p;printf(路径有误!n);return NULL;int Delete(info *p)/删除目录if(p)Delete(p-brother);/删除兄弟节点Delete(p-firstchild);/删除第一个孩子节点free(p);/释放指针return 0;void DELETE(info *p)/删除p所指向的所有文件和目录info *q;q=p-parent;if(p-firstchild) Delete(p-firstchild);if(q-firstchild=p)q-firstchild=p-brother;free(p);elseq=q-firstchild;while(q-brother!=p&q-brother) q=q-brother;q-brother=p-brother;free(p);void Traverser(info *p)/递归显示节点所包含文件和目录信息int i;info *q=p;if(!p) return;for(i=0;icenci;i+)printf( );/缩进NodeShow(q);/显示节点信息printf(n);Traverser(p-firstchild);/显示第一个孩子节点Traverser(p-brother);/显示兄弟节点void Information(info *p)/显示文件信息printf(name:%sn,p-name);if(p-filetype0!=0)printf(文件类型:%sn,p-filetype);printf(大小:%dKn,p-size);else printf(菜单n);printf(创建时间:);printf(%d%d%dn,p-time.year,p-time.month,p-time.date);printf(包含的文件数量:%
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- focu-sky-课件教学课件
- family课件笔记教学课件
- 2.7我国的气候特征与要气象灾害 说课稿-浙教版八年级上册科学
- 高中信息技术:第一章 网络能为我们做什么 说课稿(教科版选修)
- 2024-2025学年高中信息技术 网络的数据通信、协议及组建说课稿
- 信号灯电工知识培训内容课件
- ERCP导丝课件教学课件
- 国外经典人格测试题大全及答案解析
- dw框架课件教学课件
- 2024-2025学年高中历史 学习与探究之二“个人在历史上的作用”讨论会(2)教学说课稿 人民版选修4
- 航空航天设备故障应急预案及流程
- 车库出租放物品合同协议
- 2025年共青团入团考试测试题库及答案
- 仿古建筑施工常见问题及应对策略
- 2025届上海市华师大二附中高考适应性考试英语试卷含解析
- 风物志模板范文
- 2025届四川省高三上学期12月第一次联考英语试题(含解析无听力音频有听力原文)
- 广西壮族自治区贵港市平南县2024-2025学年九年级上学期11月期中化学试题
- TCOSOCC 016-2024 信息技术应用创新 软件测试要求
- 病例报告表(CRF)模板
- 辽宁省名校联盟2024-2025学年高三上学期10月联考数学试卷
评论
0/150
提交评论