7-30 目录树(30 分)
在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。
输入格式:
输入首先给出正整数N(≤10?4??),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):
- 路径和名称中的字符仅包括英文字母(区分大小写);
- 符号“\”仅作为路径分隔符出现;
- 目录以符号“\”结束;
- 不存在重复的输入项目;
- 整个输入大小不超过2MB。
输出格式:
假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。
输入样例:
7
b
cab\cd
a\bc
ab\d
a\d\a
a\d\z
输出样例:
root a d z a bc ab cd d c b
思路:记得数据结构课的时候确实讲过数的创建,但是一直没有自己动手实现过,今个儿这个要点时间。首先学了下字符串按照指定符号分割,然后百度了下输的创建,所以先待续~
#include<stdio.h> #include<string> #include<queue> #include<sstream> #include<algorithm> #include<iostream> using namespace std; typedef struct treenode{ char name[260]; struct treenode *firstchild; //第一个儿子 struct treenode *nextsibling; //下一个兄弟 }Treenode, *Treep; int main() { int n; cin >> n; Treep tree = new Treenode; strcpy(tree->name , "root"); tree->firstchild = NULL; tree->nextsibling = NULL; char s[260]; const char *sep = "\\"; //按\分割的字符 char *p; while (n--){ getchar(); gets(s); p = strtok(s, sep); Treep temp = tree; while (temp) { if (strcmp(temp->name, p)) temp = temp->firstchild; else temp = temp->nextsibling; } temp = new Treenode; strcpy(temp->name, p); temp->firstchild = NULL; temp->nextsibling = NULL; while (p){ //printf("%s\n", p); Treep cnt = new Treenode; strcpy(cnt->name, p); p = strtok(NULL, sep); } } return 0; }