#include #include #include #include #include using namespace std; const int FILEE = 0, DIR = 1; char createRes[2][30] = { "file already exist", "directory already exist" }; char delRes[2][30] = { "no such file", "can not delete the directory" }; struct F { int head, next, type, fa; string name; F() { } F(int h, int n, int t, int f, string s) : head(h), next(n), type(t), fa(f), name(s) { } }; int tot, cur; vector V; void cd(const char *com) { int i = 1; if (!strcmp(com, "\\")) { cur = 0; } else if (!strcmp(com, "..")) { cur = V[cur].fa; } else { for (i = V[cur].head; i > 0; i = V[i].next) { if (V[i].type == DIR && !strcmp(V[i].name.c_str(), com)) { cur = i; break; } } } puts(i ? "success" : "no such directory"); } void create(const char *com, int type) { int i = 1; if (!strcmp(com, "\\")) { } else if (!strcmp(com, "..")) { } else { for (i = V[cur].head; i > 0; i = V[i].next) { if (V[i].type == type && !strcmp(V[i].name.c_str(), com)) { break; } } if (!i) { V.push_back(F(0, V[cur].head, type, cur, com)); V[cur].head = tot++; } } puts(i ? createRes[type] : "success"); } void del(const char *com, int type) { int i = 0; if (!strcmp(com, "\\")) { } else if (!strcmp(com, "..")) { } else { int *p = &V[cur].head; for (i = V[cur].head; i > 0; i = V[i].next) { if (V[i].type == type && !strcmp(V[i].name.c_str(), com)) { if (type == DIR && V[i].head) continue; *p = V[i].next; break; } p = &V[i].next; } } puts(i ? "success" : delRes[type]); } int main() { char op[9], com[30]; V.push_back(F(0, 0, DIR, 0, "\\")); ++tot; while (scanf("%s%s", op, com) != EOF) { switch (op[0]) { case 'C': if (op[1] == 'D') { cd(com); } else { create(com, FILEE); } break; case 'M': create(com, DIR); break; case 'D': del(com, FILEE); break; case 'R': del(com, DIR); break; } } return 0; }