HDU1413(文件系统)

心得:
一道比较基础的数据结构题,没什么算法可言,关键是要熟练各种数据结构的各种操作,其次还要有耐心。
传送门: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;
}

猜你喜欢

转载自blog.csdn.net/tilmant/article/details/53860590