【模拟】【文件目录】【七中联考】


Solution
就是一个很麻烦的模拟。
不过,模拟的过程,真的让人心情愉悦。
虽然还有一个点W了。不知道为什么。
但是这就是编程的乐趣。让无序的东西编程有序,让所有的操作变得可行,模拟一个简单的电脑中的菜单~。

注意一点的是:可以用map来完成映射。但是需要每一个目录都用一个map来映射属于该节点的儿子。
否则就不能访问在两个文件中名字的相同的子文件中的地址。

所以不如之间O(N )扫描来查找。
大致的过程都在代码里了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
using namespace std;
int cnt,Q,now_data;
string a,b;
struct Document{        //文件夹 
    vector <int> son;   //保存当前文件夹里面的子目录地址。
    int father;         //保存当前文件夹父目录的地址。 
    string name;        //当前文件夹的名字。 
    bool flag;          //flag =1 表示为 文件 0表示为文件夹  2表示被删除 
}document[1001];
void Init_system()
{
    cin>>Q;
    now_data=0;document[0].father=-1;
    for (int i=0;i<=1000;i++)
    document[i].flag=-1;
}
int find_name(int &now_data,string name,int flag) //flag=1 查找文件 否则查找文件夹 
{
    if(flag==1) 
    {
        for (int i=0;i<document[now_data].son.size();i++)
        {
            int new_data=document[now_data].son[i];
            if((document[new_data].name==name)&&(document[new_data].flag==1)) 
            return new_data;

        }
        return -1;
    }
    if(flag==0) 
    {
        for (int i=0;i<document[now_data].son.size();i++)
        {
            int new_data=document[now_data].son[i];
            if((document[new_data].name==name)&&(document[new_data].flag==0)) 
            return new_data;

        }
        return -1;
    }

}
void Build_Document(int &now_data,string name)//创建文件夹 
{
    int iter=find_name(now_data,name,0);
    if(iter!=-1) 
        cout<<"Directory already exists!"<<endl; 
    else
    {
        document[now_data].son.push_back(++cnt);
        document[cnt].father=now_data;
        document[cnt].name=name;
        document[cnt].flag=0;
    }

} 
void Build_File(int &now_data,string name)//创建文件 
{
    int iter = find_name(now_data,name,1);
    if(iter!=-1) 
        cout<<"File already exists!"<<endl; 
    else
    {
        document[now_data].son.push_back(++cnt);
        document[cnt].father=now_data;
        document[cnt].name=name;
        document[cnt].flag=1;
    }

} 
void Enter_SD(int &now_data,string name)  //进入子目录 
{
    int iter = find_name(now_data,name,0); //注意子目录的必须是一个文件夹才可以进入 
    if(iter!=-1)
        now_data=iter; 
    else 
        cout<<"No such directory!"<<endl; 
}
void Enter_FD(int &now_data)  //进入父目录
{
    if(document[now_data].father!=-1)
        now_data=document[now_data].father;
    else
        cout<<"No parent directory!"<<endl; 
}   
void Delete_File(int &now_data,string name)//删除文件 
{
    int iter = find_name(now_data,name,1);
    if(iter!=-1)
        document[iter].flag=2; //2表示该地址的文件已经删除 
    else
        cout<<"No such file!"<<endl; 
}
void Delete_Document(int &now_data ,string name)//删除文件夹 
{
    int iter = find_name(now_data,name,0);
    if(iter!=-1)
        document[iter].flag=2; //2表示该地址的文件已经删除 
    else
        cout<<"No such directory!"<<endl; 
}
void Print(int &now_data)      //输出当前子目录的所有文件 
{
    for (int i=0;i<document[now_data].son.size();i++)
    {
        int v=document[now_data].son[i];
        string name=document[v].name;
        int iter=document[v].flag; 
        if(iter != 2){         //判断是否删除 
            if( iter == 0) cout<<name<<" <D>"<<endl; 
            if( iter == 1) cout<<name<<" <F>"<<endl; 
        } 
    }
    cout<<endl;
}
int main()
{
    freopen("nacumegu.in","r",stdin);
        //freopen("nacumegu.out","w",stdout); 
    Init_system();
    while(Q--)
    {
        cin>>a; if(a!="ls")         cin>>b;
        if(a=="cd"&&b!="..")        Enter_SD(now_data,b);
        else if(a=="cd"&&b=="..")   Enter_FD(now_data);
        else if(a=="touch")         Build_File(now_data,b); 
        else if(a=="rm")            Delete_File(now_data,b);
        else if(a=="mkdir")         Build_Document(now_data,b);
        else if(a=="rmdir")         Delete_Document(now_data,b);
        else if(a=="ls")                Print(now_data);
    }
    return 0;
}        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值