心得:
一道比较基础的数据结构题,没什么算法可言,关键是要熟练各种数据结构的各种操作,其次还要有耐心。
传送门:HDU1413
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct directory //一个文件系统的主要组成部分:目录和文件
{
char directory_Name[99]; //目录名
char file_Name[99][99]; //文件名,因为一个目录下可包含多个文件,故用二维数组
int directory_Num; //目录名的数量
int file_Num; //文件名的数量
directory *pre; //前驱
directory *next[99]; //后继
}*dir;
char output[6][99] //对应输出的各种情况
{
"success"
,"no such directory"
,"directory already exist"
,"can not delete the directory"
,"file already exist"
,"no such file"
};
int main()
{
dir=new directory;
directory *root=dir; //根节点
strcpy(dir->directory_Name,"\\"); //初始化
dir->directory_Num=dir->file_Num=0; //初始化
dir->pre=dir; //初始化
int flag,tag; //用于标记
char cmd[9],str[29]; //cmd:对文件操作的命令 str:目录名或文件名
while(~scanf("%s%s",cmd,str))
{
if(!strcmp(cmd,"CD"))
{
flag=1; //先假设找不到
if(dir->directory_Num) //目录不为空
{
for(int i=0;i<dir->directory_Num; i++) //遍历寻找与输入同名的目录名(不知道有没有更高效的办法~)
if(!strcmp(dir->next[i]->directory_Name,str))
{
flag=0;
dir=dir->next[i]; //实现进入目录的操作
break;
}
}
if(!strcmp(str,"..")) //实现返回上一级目录的功能
{
dir=dir->pre;
flag=0;
}
if(!strcmp(str,"\\")) //第一个'\'是转义字符
{
dir=root; //返回到根目录
flag=0;
}
printf("%s\n",output[flag]);
}
else if(!strcmp(cmd,"MD"))
{
flag=0;
if(dir->directory_Num)
{
for(int i=0; i<dir->directory_Num; i++)
if(!strcmp(dir->next[i]->directory_Name,str))
{
flag=2; //与之前的目录重名则创建失败
break;
}
}
if(strcmp(str,"..")==0||strcmp(str,"\\")==0)
flag=2; //不允许创建..或\\目录
printf("%s\n",output[flag]);
if(!flag) //数据结构中“增”的操作
{
directory *another=new directory;
strcpy(another->directory_Name,str);
another->file_Num=another->directory_Num=0;
another->pre=dir;
dir->next[dir->directory_Num]=another;
(dir->directory_Num)++;
}
}
else if(!strcmp(cmd,"RD"))
{
flag=0;
if(dir->directory_Num)
{
for(int i=0; i<dir->directory_Num; i++)
{
if(!strcmp(dir->next[i]->directory_Name,str)) //找到了要删除的目录
{
if(dir->next[i]->directory_Num||dir->next[i]->file_Num)
{
flag=3; //目录下还有文件或目录则不能删除
break;
}
else
{
tag=i;
break;
}
}
if(i==dir->directory_Num)
flag=3;
}
}
else
flag=3;
printf("%s\n",output[flag]);
if(!flag) //“删”操作
{
for(; tag<dir->directory_Num; tag++)
{
dir->next[tag]=dir->next[tag+1];
}
(dir->directory_Num)--;
}
}
else if(!strcmp(cmd,"CREATE")) //文件的“增”
{
flag=0;
if(dir->file_Num)
{
for(int i=0; i<dir->file_Num; i++)
if(!strcmp(dir->file_Name[i],str))
{
flag=4;
break;
}
}
printf("%s\n",output[flag]);
if(!flag)
{
strcpy(dir->file_Name[dir->file_Num],str);
(dir->file_Num)++;
}
}
else //文件的“删”
{
flag=5;
if(dir->file_Num)
{
for(int i=0; i<dir->file_Num; i++)
{
if(!(strcmp(dir->file_Name[i],str)))
{
flag=0;
tag=i;
break;
}
}
}
printf("%s\n",output[flag]);
if(!flag)
{
for(; tag<dir->file_Num; tag++)
strcpy(dir->file_Name[tag],dir->file_Name[tag+1]);
(dir->file_Num)--;
}
}
}
return 0;
}