HDU 1413 文件系统 (数据结构)

心得:
一道比较基础的数据结构题,没什么算法可言,关键是要熟练各种数据结构的各种操作,其次还要有耐心。
传送门
Problem Description
Ignatius做了一个文件系统,为了测试他的文件系统是否能正常工作,他打算对他的文件系统做一些测试.

刚开始的时候文件系统里只有一个根目录.Ignatius将输入一系列合法的文件操作命令,请你给出文件系统应该给出的相应提示信息.

Ignatius的文件系统的文件操作命令包括:

  1. CD [directory name] : 进入当前目录下名为[directory name]的子目录,如果成功,系统应提示"success",否则提示"no such directory".
  2. MD [directory name] : 在当前目录下建立名为[directory name]的子目录,如果当前目录下已经存在名为[directory name]的子目录,则提示"directory already exist",否则提示"success".
  3. RD [directory name] : 删除当前目录下名为[directory name]的子目录,如果当前目录下不存在名为[directory name]的子目录,或者名为[directory name]的子目录下还有文件或子目录,则提示"can not delete the directory",否则提示"success".
  4. CREATE [file name] : 在当前目录下创建名为[file name]的文件,如果当前目录下已经存在名为[file name]的文件,则提示"file already exist",否则提示"success".
  5. DELETE [file name] : 删除当前目录下名为[file name]的文件,如果当前目录下不存在名为[file name]的文件,则提示"no such file",否则提示"success".

以下是几个特殊说明:

  1. 要从当前目录退回到上一级目录可以使用"CD …“命令来实现,我们约定根目录的上一级目录是其本身,任何一个目录下都不允许创建名为”…“的子目录,如果有命令试图创建名为”…“的子目录,则系统应反馈"directory already exist”.
  2. 要从当前目录直接退回到根目录可以使用"CD “命令来实现,任何一个目录下都不允许创建名为”"的子目录.
  3. 为了方便编程,给出的任意一个[directory name]和[file name]都只包括大写字母(A-Z),并且长度都小于20.
  4. 在同一个目录下允许存在同名的file和directory,但不允许出现同名的file或directory,在不同目录下则无此限制.
  5. 刚开始的时候根目录下没有文件和子目录,当前目录就是根目录本身.
  6. 如果一个操作是成功的,则应在当前文件系统的基础上执行相应的操作,以改变文件系统的状态.

Input
输入数据只有一组,该组测试数据包含若干行,每行代表一条文件操作命令,我保证每一条命令都是符合命令格式的.
处理到文件结束.

Output
对于每一条命令,请你给出系统的反馈信息,每个反馈信息占一行.

Sample Input
CD ACM
MD ACM
CD ACM
CREATE ACM
MD ACM
CD ACM
CD
RD ACM
CD ACM
RD ACM
DELETE ACM
CD …
RD ACM

Sample Output
no such directory
success
success
success
success
success
success
can not delete the directory
success
success
success
success
success

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值