HDU1413(文件系统)

来源:互联网 发布:网络架构师 工作职责 编辑:程序博客网 时间:2024/05/16 05:13

心得:
一道比较裸的数据结构题,没什么算法可言,关键是要熟练各种数据结构的各种操作,其次还要有耐心。
传送门:HDU1413

#include <iostream>#include <cstring>#include <cstdio>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,"\\"))   //呃....不是很清楚为什么是\\而不是\,参考的别人AC代码            {                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;}
0 0
原创粉丝点击