202012-3 带配额的文件系统

1.题目

202012-3 带配额的文件系统

2.数据结构与算法

DS:tree
A:大模拟,按图索骥

3.源代码

#include <string>
#include <vector>
#include <iostream>
using namespace std;

typedef long long ll;

struct node{
   
    string name="root";//名称
    vector<struct node*> child;//孩子节点指针
    struct node* parent=NULL;//父节点指针
    ll ld=0,lr=0,sizec=0,sizeac=0,size=0;
    // ld:孩子文件配额,lr:后代文件配额,sizec:孩子文件大小,sizeac:后代文件大小,size:普通文件大小
    bool type=false;//文件类型,false:目录文件;true:普通文件。
};

node root;//根节点

//判断p结点及所有祖先结点,后代文件配额是否满足
bool panduan(node *p,ll bianhua){
   
    if(p==NULL) return true;
    if((p->lr==0 || p->sizeac+bianhua<=p->lr) && panduan(p->parent,bianhua)){
   //当前结点后代文件配额满足,且所有祖先结点后代文件配额均满足
        p->sizeac+=bianhua;return true;
    }
    else return false;
}

vector<string> v;//保存路径

//C操作
// C /A/B/1 1024
void opec(string s,ll size){
   
    string dir="";
    //处理字符串,不必考虑v为空的情况
    v.clear();//清空v
    //获取路径
    for(ll i=1;i<s.size();i++){
   
        if(s[i]=='/'){
   v.push_back(dir);dir="";continue;}
        dir+=s[i];
    }
    v.push_back(dir);

    node *p=&root;//当前结点指针
    ll len;//长度
    bool isp;//标记
    bool flag=true;//标记目录是否是第一个被创建的
    node *huisu;
    ll ii;
    //处理前面目录
    for(ll i=0;i<v.size()-1;i++){
   
        len=p->child.size();
        isp=true;
        for(ll j=0;j<len;j++){
   
            //找到该目录
            if(p->child[j]->name==v[i]){
   
                //该目录为普通文件,此次操作失败
                if(p->child[j]->type){
   cout<<"N\n";return;}
                //该目录已存在,进行下层目录查找
                else{
   
                    p=p->child[j];//修改当前查找结点的指针
            
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值