随性而为 发布于四月 10, 2020 分享 发布于四月 10, 2020 这个题的意思是输入 mkdir 就真的在目录下创建文件,还是只是模拟,只在程序中意思意思创建啊 随性而为在路上看到一个蘑菇,捡起时被一个从天而降的木桶击中脑袋,花费了医药费 -4节操 链接到点评
随性而为 发布于四月 10, 2020 分享 发布于四月 10, 2020 2 分钟前, Mr.K 018 说道: 模拟,不真建文件 也不会有操作系统API供使用的(盯 小心思被发现了 随性而为和寒幼藏在半夜盗取清禾的传国玉玺时,无意中挖出了清禾祖传的3DS,卖出手后获得了奖励6节操 链接到点评
随性而为 发布于四月 10, 2020 分享 发布于四月 10, 2020 刚刚, 乱跑的泰兰德 说道: 准备直接import os os.system()来做吗哈哈哈哈哈哈哈 我还没那么厉害,关于操作系统的api我目前只知道c语言的fopen(),fclose() 我目前只知道c语言,数据结构,html5、c++(现在在学),java(现在在学) 随性而为在诱导萌新女装时被路过的随便拦下,被批评教育并收取学费-3节操 链接到点评
随性而为 发布于四月 10, 2020 分享 发布于四月 10, 2020 刚刚, Mr.K 018 说道: 没错,这就是本题的全部算法 也正因为如此,本期算法po上来是不够的~ 欸,这就秒杀了吗 链接到点评
随性而为 发布于四月 11, 2020 分享 发布于四月 11, 2020 (已修改) #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct tree { int flag; /*1代表目录(文件夹)。2代表文件*/ char name[20]; struct tree *parent; struct tree *child; struct tree *brother; }tree,*list; int checkdir(char dir[]) /*先进行初次判断(绝对路径,相对路径,格式等等,当然还不太完善)*/ { int n=1; if(dir[strlen(dir)-1]=='/'&&strlen(dir)-1!=0)/* '/'能通过而'/new/'不能 */ n=0; if(dir[0]=='/'&&(strstr(dir,"../")!=NULL||strstr(dir,"./")!=NULL))/* 绝对路径下任何地方都不能有'./''../' */ n=0; if(dir[0]!='/'&&((strstr(dir,"../")-dir!=0&&strstr(&dir[3],"../")!=NULL)||(strstr(dir,"./")-dir!=0&&strstr(&dir[2],"./")!=NULL)))/* 相对路径除刚开始不能有'./''../' */ n=0; if(n==0) { printf("error:invalid name,such as '/../new','/new/'"); return 0; } return 1; } /* 下面的exist函数几乎是任何一个操作都要做的,用来看路径中的文件是否存在,如果存在则一步步获取当前文件夹,不存在则看 makeornot,为0时对ls和rm有效 ,提示错误终止命令,为1时代表新建目录,为2时代表新建文件,新建文件(目录)统一用make执行*/ int exist(int makeornot,char dir[],list *now,tree* root) { int i,j=0,a[20],flag=0; tree* cache; tree* temp; if(dir[0]='/')/*绝对路径的情况*/ { cache=root->child; *now=root; for(i=1;dir[i]!='\0';i++) { if(dir[i]!='/') a[j++]=dir[i]; if(dir[i]=='/') { a[j]='\0'; for(;cache;cache=cache->brother) if(strcmp(a,cache->name)==0) { *now=cache; cache=cache->child; flag=1; break; } if(flag==0&&(*now)->flag==2) printf("error:file can't be created");/*判断路径中的每一层,文件是不能存放目录和文件的*/ if(flag==0&&(*now)->flag==1) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(1,dir,now,temp,root,a); cache=NULL; } } flag=0; j=0; } } a[j]='\0'; for(;cache;cache=cache->brother) if(strcmp(a,cache->name)==0) { (*now)=cache; cache=cache->child; //j=0; flag=1; break; } if(flag==0) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(makeornot,dir,now,temp,root,a);/*倒数第一层文论是文件还是目录都可以新建*/ } } return 1; } else/*相对路径的情况*/ { cache=(*now)->child; //*now=(*now); for(i=0;dir[i]!='\0';i++) { if(dir[i]!='/') a[j++]=dir[i]; if(dir[i]=='/') { a[j]='\0'; for(;cache;cache=cache->brother) { if(strcmp(a,"..")==0) { cache=(*now); *now=(*now)->parent; } if(strcmp(a,cache->name)==0) { (*now)=cache; cache=cache->child; flag=1; break; } } if(flag==0&&(*now)->flag==2) printf("error:file can't be created"); if(flag==0&&(*now)->flag==1) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(1,dir,now,temp,root,a); cache=NULL; } } flag=0; j=0; } } a[j]='\0'; for(;cache;cache=cache->brother) if(strcmp(a,cache->name)==0) { (*now)=cache; cache=cache->child; flag=1; break; } if(flag==0) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(makeornot,dir,now,temp,root,a); } } return 1; } } int rmorls(char dir[],tree* now,tree* root,int option)/* 递归操作,option为1时ls,为2时rm */ { if(now==NULL) return; rmorls(dir,now->brother,root,option); rmorls(dir,now->child,root,option); if(option==1) printf("%s/t",now->name); if(option==2) free(now); } int make(int option,char dir[],list *now,tree* temp,tree* root,char a[]) { /*现有文件和已存文件的连接*/ tree *newnode,*p1,*p2; newnode=(tree*)malloc(sizeof(tree)); newnode->brother=NULL; newnode->child=NULL; newnode->parent=(*now); newnode->flag=option; strcpy(newnode->name,a); /*判断新建文件(目录)是否是父目录第一个孩子*/ if((*now)->child==NULL) { (*now)->child=newnode; }else { for(p1=(*now)->child;p1->brother;p1=p1->brother); p1->brother=newnode; } (*now)=temp=newnode; } int cd(char dir[],list *now,tree* root)/*转到路径指定目录,事实上大部分工作被exist函数做了*/ { tree *temp; temp=*now; if(exist(0,dir,now,root)==0) /*如果路径不存在,则当前目录回到没有输入命令前的工作目录*/ *now=temp; /*没有输出*/ } int ls(char dir[],list *now,tree* root)/*因为ls与rm都是对路径递归,只是每次的操作不同,故将其递归部分结合成一个函数lsorrm()*/ { tree *temp; temp=*now; if(exist(0,dir,now,root)==0) { *now=temp; }else { printf("%s:",(*now)->name); rmorls(dir,(*now)->child,root,1); } } int rm(char dir[],list *now,tree* root)/*删除后停留在当前目录*/ { tree *temp,*a,*p1,*p2; temp=*now; if(exist(0,dir,now,root)==0) { *now=temp; }else { rmorls(dir,(*now)->child,root,2); a=(*now)->parent; p1=a->child; if(p1==*now) { p1->parent->child=p1->brother; } else { for(;p2;p2=p1,p1=p1->brother) { if(p2==*now) p1->brother=p2->brother; } } free(*now); *now=a->child; /*因为是删除,连接方式一定会改变,以上步骤就是改变过程*/ } } int main()/*没什么解释的,就是将输入转化为参数,调用对应的函数*/ { tree *root,*now,*temp; root=(tree*)malloc(sizeof(tree)); root->parent=root->child=root->brother=NULL; now=temp=root; int choose; char ope[10]; char dir[100]; while(1) { scanf("%s %s",ope,dir); if(!strcmp(ope,"mkdir")) choose=1; else if(!strcmp(ope,"touch")) choose=2; else if(!strcmp(ope,"cd")) choose=3; else if(!strcmp(ope,"ls")) choose=4; else if(!strcmp(ope,"rm")) choose=5; if(checkdir(dir)==1) { switch(choose) { case 1:exist(1,dir,&now,root);break; case 2:exist(2,dir,&now,root);break; case 3:cd(dir,&now,root);break; case 4:ls(dir,&now,root);break; case 5:rm(dir,&now,root);break; }; } } } 码了一天多终于套完了所有的娃,还没有测试,怕没有达到预期的结果而心跳骤停,再者我软件也缺失debug,要发现问题也是工程量巨大,既然不是正规的,就权当伪代码吧(虽然程序本身并没有语法错误),不过大致框架和思路就是这样,要有一些小问题也不用调整太多,讲真这是我至今为止写过的最长的代码了,也多亏了这道题,我对地址有了更深一步的了解,解决了从上学期以来的一些困惑 ps:这真的是给大一学生做的么,太魔鬼了 修正了些小错误 四月 11, 2020,由随性而为修改 注释 NianRuoshui 20.00节操 恰糖 yhz012 10.00节操 是C党,辛苦了 Mr.K 018 25.00节操 糖~ 链接到点评
随性而为 发布于四月 11, 2020 分享 发布于四月 11, 2020 3 分钟前, Mr.K 018 说道: 这个啊,这个是当初ACM队选拔总结赛里面的一道题,确实是给大一同学做的 我之所以能这么肯定是因为我当时面对的就是这种题 woc,有压轴题内味了,感觉这道题是真的……很少人能当场做出来吧,你们当时学过数据结构么…… 链接到点评
推荐贴