[20190924机房测试] 文件系统

现在你要实现一个文件系统,支持以下操作
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;
}
原文地址:https://www.cnblogs.com/tqr06/p/11580044.html