在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。

输入格式:
输入首先给出正整数N(≤10
​4
​​ ),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):

路径和名称中的字符仅包括英文字母(区分大小写);
符号“\”仅作为路径分隔符出现;
目录以符号“\”结束;
不存在重复的输入项目;
整个输入大小不超过2MB。
输出格式:
假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。

输入样例:
7
b
c
ab\cd
a\bc
ab\d
a\d\a
a\d\z
输出样例:
root
a
d
z
a
bc
ab
cd
d
c
b

看了大佬的代码:5-30 目录树 (30分)

自己写了点理解,自己刚开始下笔时最难的就是,在建立子与根的同时,还要判断字典顺序,建立了子与根的关系了,再排序。。。这样又会打乱整个布局,,,还有还要判断,打乱后的原目录位置进行插入,感觉特别复杂,,,心里实在没有逻辑的层次感。。。也怪自己心里总想着图和二叉树(比如3个分叉,4个分叉的树。。。。甚至不同数目分叉的树),心里总是想不出一个完美的模型来解决,,,然后,看了大佬的,才发现,其实无论几个分叉,,都是只有2个关系:
1:和自己同级的关系
1-1:和自己同类型
1-2:和自己不同类型
2:和自己不同级的关系
2-1:比自己大一级的关系:这个在其实也不算,对于比自己大一级的,自己其实就是大一级的子一级
2-2:比自己小一级的关系

总结就是:大佬这个结构完美的说明了所有关系,所以,,,建立模型好难!!!!
换句话就是,只有理清题目的逻辑层次,能划分且描述题目的里里外外,才能解决题目

struct node {char*Name;//先判断是不是目录,是目录才有File和Catalog,否则只可能有BrotherBool isCatalog;//指示本目录的子目录Node File;//指示本目录的子文件Node Catalog;//指示和本目录或文件平行的目录或文件Node Brother;
}

代码

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define True 1
#define False 0typedef int Bool;
typedef struct node* Node;
struct node {char*Name;//先判断是不是目录,是目录才有File和Catalog,否则只可能有BrotherBool isCatalog;//指示本目录的子目录Node File;//指示本目录的子文件Node Catalog;//指示和本目录或文件平行的目录或文件Node Brother;
} Head;void Print(Node, int);
void Read();
Node New(char*);
Node InsertCatalog(Node, char*);
Node InsertFile(Node, char*);int main() {int n;scanf("%d", &n);Head.Name = (char*) malloc(sizeof(char) * 5);strcpy(Head.Name, "root");Head.File = NULL;Head.Catalog = NULL;Head.Brother = NULL;Head.isCatalog = True;for (int i = 0; i < n; i++) {getchar();Read();}Print(&Head, 0);return 0;
}void Read() {char FileName[261];Node HTemp = &Head;scanf("%s", FileName);char words[261];//L记录的是目录(或文件名)名的第一个字符的起点位置int j, L = 0;for (int i = 0; i < strlen(FileName); i++) {//第一个'\'字符前的名字if (FileName[i] == '\\') {for (j = L; j < i; j++) {//获取名words[j - L] = FileName[j];}words[j - L] = '\0';//插入目录(有'\'的前面一定是目录名,没有就不是目录名,而是文件名)HTemp->Catalog = InsertCatalog(HTemp->Catalog, words);//一个'\'就是一个目录的结束,执行完以后还要再继续读取下一个目录,而下一个目录是建立在上一个目录//所以这里要进行跳跃HTemp = HTemp->Catalog;//上面我们知道,此刻我们到达了下一个要插入的目录(或文件)的上一级目录//但是,我们这个时候到达的是字典顺序排好的第一个目录,,,不一定是上面我们刚刚插入的目录//所以这里要加个循环来寻找到达的插入的目录while (strcmp(HTemp->Name, words))HTemp = HTemp->Brother;L = i + 1;}}//显然,如果L==strlen(FileName)那么目录结构输入时应该是:XXX\XXX\XXX\  最后一个一定是'\'字符,最后插入的是目录名//但如果L<strlen(FileName)那么目录结构输入时应该是:XXX\XXX\xxx 最后一个不是'\'字符,最后插入的是文件名if (L < strlen(FileName)) {for (j = L; j <= strlen(FileName); j++) {words[j - L] = FileName[j];}HTemp->File = InsertFile(HTemp->File, words);}
}Node InsertCatalog(Node Catalog, char*InsertCatalogName) {//如果文件目录不存在或者字典要插入的目录名字典顺序比当前第一个小//那就应该插在第一个位置if (!Catalog || strcmp(Catalog->Name, InsertCatalogName) > 0) {Node temp = New(InsertCatalogName);temp->Brother = Catalog;return temp;}//如果目录已经存在直接返回if (strcmp(Catalog->Name, InsertCatalogName) == 0)return Catalog;//如果不满足上面的条件,则进入与H目录同层的目录进行判断//显然,H的同层下(H层以上的目录不在范围内容)目录结构发生改变,则全局就将发视变化Catalog->Brother = InsertCatalog(Catalog->Brother, InsertCatalogName);return Catalog;
}
Node InsertFile(Node File, char*InsertFileName) {//同上InsertCatalogif (!File || strcmp(File->Name, InsertFileName) > 0) {Node Insert = New(InsertFileName);Insert->isCatalog = False;Insert->Brother = File;return Insert;}//这里我其实觉得也应该添加一个判断,毕竟也有可能出现重复文件名//    if (strcmp(File->Name, InsertFileName) == 0)//           return File;//但仔细一思考,该题是目录清单,清单所确定的目录下不可能出现同一文件,,,至于为啥可能出现同一文件夹名字呢?//这是因为目录清单每个条例只能确定一个文件路径或者文件夹路径,但同一文件夹下可能有多个文件或者多个目录,所以可能出现同一文件夹名字File->Brother = InsertFile(File->Brother, InsertFileName);return File;
}
Node New(char*Name) {Node newNode = (Node) malloc(sizeof(struct node));newNode->Name = (char*) malloc(sizeof(char) * (strlen(Name) + 1));strcpy(newNode->Name, Name);newNode->Brother = NULL;newNode->File = NULL;newNode->Catalog = NULL;//默认是在建目录newNode->isCatalog = True;return newNode;
}
void Print(Node H, int Space) {if (H) {for (int i = 0; i < Space; i++)printf(" ");//打印顺序//1-1 根目录名//    1-2 子目录名//         1-3 文件名//1-4 异根目录名//1-1printf("%s\n", H->Name);//1-2if (H->isCatalog == 1)Print(H->Catalog, Space + 2);//1-3Print(H->File, Space + 2);//1-4Print(H->Brother, Space);}
}

再次感谢大佬:5-30 目录树 (30分)

7-30 目录树 (30 分)相关推荐

  1. 【详细解析】基础实验4-2.6 目录树 (30 分)

    立志用最少的代码做最高效的表达 在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称.当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构.请编写程序实现目录 ...

  2. 7-9 目录树 (30分)

    在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称.当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构.请编写程序实现目录的树状结构的重建工作. 输入格式 ...

  3. Linux中定时清除指定目录中30分钟前生成的特定文件

    1.首先创建一个脚本文件,我们举例文件名称为clearBigtrc03.sh. cd /home vi clearBigtrc03.sh 2.在文件中输入清除指定目录中30分钟前生成的脚本. 假设需要 ...

  4. 荣耀30 Pro Geekbench跑分现身:麒麟990 5G SoC性能出众

    根据官方此前透露的消息,全新的荣耀30系列旗舰将于4月15日正式发布.随着发布时间的日益临近,关于该系列新机的外观和配置细节也得到了越来越多的爆料.现在有最新消息,继此前该机的相机配置曝光之后,近日有 ...

  5. 仿写百度百科的目录树

    一.首先来看一下需求(截图为百度百科"医保"词条): 1.点击右侧的目录树,左侧跳转到指定的锚点位置: 2.滚动鼠标,游标跟随一起滚动至响应链接位置 二.实现思路 1.针对第一个需 ...

  6. 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

    一. 简介 该章节,可以说是一个简单轻松的章节,只要你对Expression表达式树.EF的基本使用.泛型有所了解,那么本章节实质上就是一个非常简单的封装章节,便于我们快捷开发. PS:在该章节对于E ...

  7. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  8. 文件高阶操作复制查找处理目录树打包文件shutil

    文件高阶操作复制查找处理目录树打包文件shutil 1.概述 shutil模块包含了文件高级操作,比如复制文件.查找文件.处理目录树.打包文件. 2.复制文件 2.1.文件对文件复制copyfile ...

  9. qt可视化读取_生成_编辑_联动_保存目录树

    1.基于xml文件生成目录树: 2.目录树左右联动: 3.右键增删改节点: 4.根据目录树在指定根目录下递归生成选中目录,进入生成指定目录: 5.目录树勾选.全选.全不选: 6.保存目录编辑结果为xm ...

最新文章

  1. Seafile:用挂载盘客户端让企业在线编辑云端文件
  2. JavaScript采用append添加的元素错误
  3. Document is invalid: no grammar found. at (null:3:8)
  4. ExtJs Panel 滚动条设置
  5. 网管型光纤收发器功能介绍
  6. php中abs,php中的abs函数怎么用
  7. signature=efaf25d07c6ea03d7552906c0caee5a8,幼児の認知発達における関係把握の問題
  8. 如何用NANT+FxCop 并生成文档规范检测结果?
  9. office 2010 系列问题
  10. 二十一、常见股票和量化投资策略
  11. 男士黑色手表的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  12. 重磅!腾讯优图20篇入选CVPR 2021论文一览
  13. PHP的电子邮件列表替代方法:使用Mailgun的List API
  14. 基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题
  15. 如何有效的杜绝“羊毛党“的薅羊毛行为?
  16. 教师资格证面试 计算机应用,请问下,中职类教师资格证,科目是计算机应用。可..._教师招聘考试_帮考网...
  17. canvas画正方形、三角形以及虚线
  18. 阅文集团以人民币10.8亿元出售懒人听书股权给腾讯音乐
  19. js中深浅拷贝理解与方法
  20. 次世代游戏建模师一个月的工资有多少?

热门文章

  1. github如何删除项目中的文件
  2. java for嵌套循环_Java优化for循环嵌套的高效率方法
  3. 在国内企业做数据治理,建议您考个DAMA-CDGA/CDGP证书
  4. PCD文件的读取以及可视化
  5. 移动机器人运动模型(两轮、四轮、麦克纳姆轮和概率运动)
  6. 获取当当网商品详情教程
  7. [Error Code: 942, SQL State: 42000] ORA-00942: 表或视图不存在
  8. 删除列级完整性约束_列级完整性约束条件与表级完整性约束条件有什么不同
  9. 软件智能:aaas系统AI众生的“世”和“界” 之12 世界相涉身中贸迁
  10. github 网速问题