现在你要实现一个文件系统,支持以下操作
cd Directory Name
如果当前路径下有名为Directory_ Name的文件夹,则进入该文件夹所对应的路径,
否则输出“No such directory!"
ed ..
如果当前路径存在父路径,则返回父路径,
否则输出“No parent directory!"
touch File Name
如果当前目录下存在名为File_ Name的文件则输出"File already exists!"
否则创建这样一个文件。
rm File_ Name
如果当前目录下存在名为File_ Name的文件则删除它
否则输出“No such fle!"
mkdir Directory Name
如果在当前路径下存在名为Direetory_ Name 的文件夹,则输出"Directory already exists!"
否则创建这样一个文件夹(当前路径不变)
rmdir Directory_ Name
如果在当前路径下存在名为Directory_ Name的文件夹,则删除之
否则输出“No such directory!"
ls
列出当前路径下所有的文件和文件夹,每一项占一行,按创建的先后顺序给出。
采用以下形式输出
"Item_ Name”
Type为D (文件夹)或F (文件)
注意:同一路径下文件与文件夹可以同名,但同一路径下文件与文件、文件夹与文件夹不能
同名。
初始时当前路径处于根路径下,无父路径。
这道瞎搞题,前几天写动态开点写入魔了,差点写个动态开点
结果最后还是用一个普通的链表过了
真的没有任何技术含量,十分钟就打完了
代码:
//cd Name:进入一个文件夹
//cd ..:回到父节点
//touch name:创建一个文件
//rm Name:删除一个文件
//mkdir Name:创建一个文件夹
//rmdir Name:删除一个文件夹
//ls:按顺序输出其路径下的所有文件和文件夹
#include<bits/stdc++.h>
using namespace std;
int T;
char c1[20],c2[20];
struct Point
{
int kind;//0代表删除,1代表文件夹,2代表文件
char name[25];//名字
int nxt[105],sonnum;//儿子链表
int fa;
}a[205];
bool check_name(int x)
{
int len=strlen(c2+1);
for(register int i=1;i<=len;++i)
if(a[x].name[i]!=c2[i]) return 0;
return 1;
}
int main()
{
freopen("files.in","r",stdin);
freopen("files.out","w",stdout);
int now=1;
int maxid=1;
scanf("%d",&T);
while(T--)
{
scanf("%s",c1+1);
if(c1[1]!='l') scanf("%s",c2+1);
if(c1[1]=='c'&&c1[2]=='d'&&c2[1]!='.')//进入一个文件夹
{
for(register int i=1;i<=a[now].sonnum;++i)
{
int id=a[now].nxt[i];
if(check_name(id)&&a[id].kind)
{
now=id;
goto ed;
}
}
puts("No such directory!");
goto ed;
}
if(c1[1]=='c'&&c1[2]=='d'&&c2[1]=='.')//回到上一个文件夹
{
if(a[now].fa) {now=a[now].fa;goto ed;}
else {puts("No parent directory!");goto ed;}
}
if(c1[1]=='t')//创建一个文件
{
for(register int i=1;i<=a[now].sonnum;++i)
{
int id=a[now].nxt[i];
if(check_name(id)&&a[id].kind)
{
if(a[id].kind==2) {puts("File already exists!");goto ed;}
}
}
a[now].nxt[++a[now].sonnum]=++maxid;
a[maxid].fa=now;
strcpy(a[maxid].name+1,c2+1);
a[maxid].kind=2;
// puts("Crate!");
goto ed;
}
if(c1[1]=='r'&&c1[2]=='m'&&c1[3]!='d')//删除一个文件
{
for(register int i=1;i<=a[now].sonnum;++i)
{
int id=a[now].nxt[i];
if(check_name(id)&&a[id].kind==2)
{
a[id].kind=0;
goto ed;
}
}
puts("No such file!");
goto ed;
}
if(c1[1]=='m')//创建一个文件夹
{
for(register int i=1;i<=a[now].sonnum;++i)
{
int id=a[now].nxt[i];
if(check_name(id)&&a[id].kind)
{
if(a[id].kind==1) {puts("Directory already exists!");goto ed;}
}
}
a[now].nxt[++a[now].sonnum]=++maxid;
a[maxid].fa=now;
strcpy(a[maxid].name+1,c2+1);
a[maxid].kind=1;
// puts("create!");
goto ed;
}
if(c1[1]=='r'&&c1[2]=='m'&&c1[3]=='d')//删除一个文件夹
{
for(register int i=1;i<=a[now].sonnum;++i)
{
int id=a[now].nxt[i];
if(check_name(id)&&a[id].kind==1)
{
a[id].kind=0;
goto ed;
}
}
puts("No such directory!");
goto ed;
}
if(c1[1]=='l'&&c1[2]=='s')//输出所有文件和文件夹
{
for(register int i=1;i<=a[now].sonnum;++i)
{
int id=a[now].nxt[i];
if(a[id].kind)
{
printf("%s ",a[id].name+1);
printf("<%c>
",a[id].kind==1?'D':'F');
}
}
goto ed;
}
ed:;
}
return 0;
}