文件系统 HDU - 1413 

Ignatius做了一个文件系统,为了测试他的文件系统是否能正常工作,他打算对他的文件系统做一些测试.

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

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

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

以下是几个特殊说明:

1. 要从当前目录退回到上一级目录可以使用"CD .."命令来实现,我们约定根目录的上一级目录是其本身,任何一个目录下都不允许创建名为".."的子目录,如果有命令试图创建名为".."的子目录,则系统应反馈"directory already exist".
2. 要从当前目录直接退回到根目录可以使用"CD \"命令来实现,任何一个目录下都不允许创建名为"\"的子目录.
3. 为了方便编程,给出的任意一个 directoryname directoryname filename filename都只包括大写字母(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 <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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值