文件系统 HDU - 1413 

来源:互联网 发布:ubuntu 图形界面 编辑:程序博客网 时间:2024/05/29 11:55
Ignatius做了一个文件系统,为了测试他的文件系统是否能正常工作,他打算对他的文件系统做一些测试.

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

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

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

以下是几个特殊说明:

1. 要从当前目录退回到上一级目录可以使用"CD .."命令来实现,我们约定根目录的上一级目录是其本身,任何一个目录下都不允许创建名为".."的子目录,如果有命令试图创建名为".."的子目录,则系统应反馈"directory already exist".
2. 要从当前目录直接退回到根目录可以使用"CD \"命令来实现,任何一个目录下都不允许创建名为"\"的子目录.
3. 为了方便编程,给出的任意一个directorynamedirectorynamefilenamefilename都只包括大写字母(A-Z),并且长度都小于20.
4. 在同一个目录下允许存在同名的file和directory,但不允许出现同名的file或directory,在不同目录下则无此限制.
5. 刚开始的时候根目录下没有文件和子目录,当前目录就是根目录本身.
6. 如果一个操作是成功的,则应在当前文件系统的基础上执行相应的操作,以改变文件系统的状态.
Input
输入数据只有一组,该组测试数据包含若干行,每行代表一条文件操作命令,我保证每一条命令都是符合命令格式的.
处理到文件结束.
Output
对于每一条命令,请你给出系统的反馈信息,每个反馈信息占一行.
Sample Input
CD ACMMD ACMCD ACMCREATE ACMMD ACMCD ACMCD \RD ACMCD ACMRD ACMDELETE ACMCD ..RD ACM
Sample Output
no such directorysuccesssuccesssuccesssuccesssuccesssuccesscan not delete the directorysuccesssuccesssuccesssuccesssuccess
#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct fil {    char name[100];    fil *next;};struct dir {    char name[100];    dir *next;    //同级文件夹    dir *dirhead;    //子文件夹    dir *up;      //上级目录    fil *filhead;    //文件夹下文件};dir *Head,*NowHead;dir *searchdir(char *s) {    dir *p=NowHead->dirhead->next;    while(p) {        if(!strcmp(p->name,s))            return p;        p=p->next;    }    return NULL;}fil *searchfil(char *s) {    fil *p=NowHead->filhead->next;    while(p) {        if(!strcmp(p->name,s))            return p;        p=p->next;    }    return NULL;}void doCD() {     //进入文件夹    char s[100];    scanf("%s",s);    if(!strcmp(s,"\\")) {        NowHead=Head;        printf("success\n");        return ;    }    if(!strcmp(s,"..")){       NowHead=NowHead->up;       printf("success\n");       return ;    }    dir *p=searchdir(s);    if(!p) {        printf("no such directory\n");        return ;    }    NowHead = p;    printf("success\n");    return ;}void doMD() {     //建立文件夹    dir *p,*q;    char s[100];    scanf("%s",s);    if(!strcmp(s,"..")||!strcmp(s,"\\")) {        printf("directory already exist\n");        return ;    }    q=searchdir(s);    if(q) {        printf("directory already exist\n");        return ;    }    p = new dir;    strcpy(p->name,s);    p->filhead=new fil;    p->filhead->next=NULL;    p->dirhead=new dir;    p->dirhead->next=NULL;    p->up=NowHead;    p->next=NowHead->dirhead->next;    NowHead->dirhead->next=p;    printf("success\n");}void doRD() { //删除文件夹    char s[100];    scanf("%s",s);    dir *p,*q;    p=searchdir(s);    if(!p||p->dirhead->next) {        printf("can not delete the directory\n");        return ;    }    q=NowHead->dirhead;    while(q) {        if(q->next==p) {            q->next=p->next;            delete p;            printf("success\n");            return ;        }        q=q->next;    }}void doCREATE() {   //建立文件    char s[100];    scanf("%s",s);    fil *p=searchfil(s);    if(p) {        printf("file already exist\n");        return ;    }    p = new fil;    strcpy(p->name,s);    p->next=NowHead->filhead->next;    NowHead->filhead->next=p;    printf("success\n");    return ;}void doDELETE() { //删除文件    char s[100];    scanf("%s",s);    fil *p=searchfil(s),*q;    if(!p) {        printf("no such file\n");        return ;    }    q= NowHead->filhead;    while(q) {        if(q->next==p) {            q->next=p->next;            delete p;            printf("success\n");            return ;        }        q=q->next;    }}void Int(){    Head = new dir;    Head->dirhead = new dir;    Head->filhead= new fil;    Head->next=NULL;    Head->up=Head;    NowHead=Head;    Head->dirhead->next=NULL;    Head->filhead->next=NULL;}int main() {    char s[10];    Int();    while(~scanf("%s",s)) {        if(!strcmp(s,"CD"))            doCD();        else if(!strcmp(s,"MD"))            doMD();        else if(!strcmp(s,"RD"))            doRD();        else if(!strcmp(s,"CREATE"))            doCREATE();        else if(!strcmp(s,"DELETE"))            doDELETE();    }    return 0;}

0 0
原创粉丝点击