Advertisement
LucasCardoso

Cd ok?

Sep 22nd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <iostream>
  3.  
  4. #define endl '\n';
  5.  
  6. using namespace std;
  7.  
  8.  
  9. struct bst{
  10.     bst* left;
  11.     bst* right;
  12.     string value;
  13.     bool diretorio;
  14.     bst* arquivos;
  15.  
  16. };
  17.  
  18. struct bst_min{
  19.     bst* root;
  20.     string value;
  21. };
  22.  
  23. void visit(bst* root){
  24.     cout << root -> value << endl;
  25. }
  26.  
  27. bst* bst_search(bst* root, string v){
  28.     if(root == NULL){
  29.         return NULL;
  30.     } else if (v == root -> value){
  31.         return root;
  32.     } else if (v < root -> value){
  33.         return bst_search(root -> left, v);
  34.     } else{
  35.         return bst_search(root -> right, v);
  36.     }
  37. }
  38.  
  39. bst* bst_insert_directory(bst* root, string v){
  40.     if(root == NULL){
  41.         bst* n = new bst;
  42.         // bst* subfiles = new bst;
  43.         n -> value = v;
  44.         n -> left = NULL;
  45.         n -> right = NULL;
  46.         n -> diretorio = true;
  47.         // subfiles -> value = v;
  48.         // subfiles -> left = NULL;
  49.         // subfiles -> right = NULL;
  50.         // subfiles -> diretorio = true;
  51.         // n -> arquivos = subfiles;
  52.         n -> arquivos = NULL;
  53.         return n;
  54.     } else if(v == root -> value){
  55.         return NULL;
  56.     } else if(v < root -> value){
  57.         root -> left = bst_insert_directory(root -> left, v);
  58.         return root;
  59.     } else {
  60.         root -> right = bst_insert_directory(root -> right, v);
  61.         return root;
  62.     }
  63. }
  64.  
  65. bst* bst_insert_file(bst* root, string v){
  66.     if(root == NULL){
  67.         bst* n = new bst;
  68.         n -> value = v;
  69.         n -> left = NULL;
  70.         n -> right = NULL;
  71.         n -> diretorio = false;
  72.         n -> arquivos = NULL;
  73.         return n;
  74.     } else if(v == root -> value){
  75.         return NULL;
  76.     } else if(v < root -> value){
  77.         root -> left = bst_insert_file(root -> left, v);
  78.         return root;
  79.     } else {
  80.         root -> right = bst_insert_file(root -> right, v);
  81.         return root;
  82.     }
  83. }
  84.  
  85. bst_min* bst_delete_min(bst* root){
  86.     if(root -> left == NULL){
  87.         string m = root -> value;
  88.         bst* r = root -> right;
  89.         delete root;
  90.         bst_min* rm = new bst_min;
  91.         rm -> value = m;
  92.         rm -> root = r;
  93.         return rm;
  94.     } else {
  95.         bst_min* rm = bst_delete_min(root -> left);
  96.         root -> left = rm -> root;
  97.         rm -> root = root;
  98.         return rm;                
  99.     }
  100. }
  101.  
  102. bst* bst_delete(bst* root, string v){
  103.     if(root == NULL){
  104.         return NULL;
  105.     } else if(v < root -> value){
  106.         root -> left = bst_delete(root -> left, v);
  107.         return root;
  108.     } else if( v > root -> value){
  109.         root -> right = bst_delete(root -> right, v);
  110.         return root;
  111.     } else{
  112.         if(root -> left == NULL){
  113.             bst* r = root -> right;
  114.             delete root;
  115.             return r;
  116.         } else if(root -> right == NULL){
  117.             bst* l = root -> left;
  118.             delete root;
  119.             return l;
  120.         } else {
  121.             bst_min* rm = bst_delete_min(root -> right);
  122.             root -> right = rm -> root;
  123.             root -> value = rm -> value;
  124.             return root;  
  125.         }
  126.     }
  127. }
  128.  
  129. void preorder(bst* root){
  130.     if(root == NULL){
  131.         return;
  132.     }
  133.     visit(root);
  134.     preorder(root -> left);
  135.     preorder(root -> right);
  136. }
  137.  
  138. void inorder(bst* root){
  139.     if(root == NULL){
  140.         return;
  141.     }
  142.     inorder(root -> left);
  143.     visit(root);
  144.     inorder(root -> right);
  145. }
  146.  
  147. void posorder(bst* root){
  148.     if(root == NULL){
  149.         return;
  150.     }
  151.     posorder(root -> left);
  152.     posorder(root -> right);
  153.     visit(root);
  154. }
  155.  
  156. struct my_list{
  157.     bst* root;
  158.     my_list* next;
  159. };
  160.  
  161. my_list* my_list_insert(my_list* cur, bst* y){
  162.     my_list* n = new my_list;
  163.     n -> root = y;
  164.     n -> next = cur -> next;
  165.     cur -> next = n;
  166.     return cur;
  167. }
  168.  
  169. my_list* my_list_delete(my_list* cur){
  170.     my_list* p = cur -> next;
  171.     cur -> next = p -> next;
  172.     delete p;
  173.     return cur;
  174. }
  175.  
  176. void tree_preorder(bst* root, int iteracao){
  177.     for(int i = 0; i < iteracao; i++){
  178.         cout << "    ";
  179.     }
  180.  
  181.     if(root == NULL){
  182.         return;
  183.     }
  184.     visit(root);
  185.     if(root -> diretorio){
  186.         tree_preorder(root -> arquivos, iteracao++);
  187.     }
  188.     tree_preorder(root -> left, iteracao);
  189.     tree_preorder(root -> right, iteracao);
  190. }
  191.  
  192. void tree_inorder(bst* root, int iteracao){
  193.     for(int i = 0; i < iteracao; i++){
  194.         cout << "    ";
  195.     }
  196.  
  197.     if(root == NULL){
  198.         return;
  199.     }
  200.  
  201.     tree_inorder(root -> left, iteracao);
  202.     visit(root);
  203.     if(root -> diretorio){
  204.         tree_inorder(root -> arquivos, iteracao++);
  205.     }
  206.     tree_inorder(root -> right, iteracao);
  207. }
  208.  
  209. void tree_posorder(bst* root, int iteracao){
  210.     for(int i = 0; i < iteracao; i++){
  211.         cout << "    ";
  212.     }  
  213.  
  214.     if(root == NULL){
  215.         return;
  216.     }
  217.     tree_posorder(root -> left, iteracao);
  218.     tree_posorder(root -> right, iteracao);
  219.     visit(root);
  220.     if(root -> diretorio){
  221.         tree_posorder(root -> arquivos, iteracao++);
  222.     }
  223. }
  224.  
  225. struct my_stack{
  226.     my_list* top;
  227.  
  228.     my_stack(){
  229.         top = new my_list;
  230.     }
  231. };
  232.  
  233. my_stack* my_stack_push(my_stack* pilha, bst* v){
  234.     pilha -> top = my_list_insert(pilha -> top, v);
  235.  
  236.     return pilha;
  237. }
  238.  
  239. my_stack* my_stack_pop(my_stack* pilha){
  240.     pilha -> top = my_list_delete(pilha -> top);
  241.     return pilha;
  242. }
  243.  
  244. //int main(){
  245.     // my_stack* pilha = new my_stack;
  246.     // bst* a = new bst;
  247.     // a = bst_insert_file(a, "adsd");
  248.     // pilha = my_stack_push(pilha, a);
  249.  
  250.     // cout << a -> value;
  251.  
  252.  
  253.     // bst* root = NULL;
  254.  
  255.     // root = bst_insert_directory(root, "e");
  256.     // root = bst_insert_directory(root, "f");
  257.     // root = bst_insert_directory(root, "a");
  258.     // root = bst_insert_file(root, "d");
  259.     // root = bst_insert_file(root, "b");
  260.     // root = bst_insert_directory(root, "c");
  261.  
  262.     // cout << root -> value << endl;
  263.  
  264.     // my_stack* pilha = new my_stack;
  265.     // pilha = my_stack_push(pilha, root);
  266.    
  267.     // bst* root2 = bst_delete(root, "e");
  268.  
  269.     // cout << pilha -> top -> next -> root -> value << endl;
  270.  
  271.     // my_list* ad = new my_list;
  272.     // ad = my_list_insert(ad, root);
  273.  
  274.     // bst* root2 = NULL;
  275.     // root2 = bst_insert_directory(root2, "asdf");
  276.     // ad = my_list_insert(ad, root2);
  277.  
  278.     // //cout << ad -> next -> root -> value;
  279.  
  280.     // ad = my_list_delete(ad);
  281.     // //cout << ad -> next -> root -> value;      
  282.  
  283.     // root = bst_delete(root, "a");
  284.     // string print;
  285.     // if(bst_search(root, "a") == NULL){
  286.     //  print = "nulo";
  287.     // } else
  288.     // //cout << print << endl;
  289.  
  290.     //preorder(root);
  291.     //return 0;
  292. //}
  293.  
  294.  
  295. int main(){
  296.     //my_list* pilha = new my_list;
  297.     bst** buffer = new bst*[100];
  298.     int index = 0;
  299.     bst* diretorio = NULL;
  300.     bst* diretoriogeral = NULL;
  301.     diretoriogeral = bst_insert_directory(diretorio, "/");
  302.     diretorio = bst_insert_directory(diretorio, "/") -> arquivos;
  303.     buffer[index] = diretoriogeral;
  304.     // cout << diretoriogeral -> value << endl;
  305.     // cout << buffer[index] -> value << endl;
  306.    
  307.     index++;
  308.     //pilha = my_list_insert(pilha, diretorio);
  309.     //my_stack* pilha = new my_stack;
  310.     //pilha = my_stack_push(pilha, diretoriogeral);
  311.  
  312.     //cout << pilha -> top -> next-> root -> value << endl;
  313.     string command;
  314.     while(cin >> command){
  315.         //cout << "lixo" << endl;
  316.         if(command == "cd"){
  317.             string directory;
  318.             cin >> directory;
  319.             if(directory == ".."){
  320.                 if(buffer[index - 1] -> value =="/"){} else {
  321.                     diretorio = buffer[index - 2] -> arquivos;
  322.                     index--;
  323.                 }
  324.  
  325.                 //if(diretorio -> value == "/"){} else {
  326.                    
  327.                     //diretorio = pilha -> top -> next-> root;
  328.                     //pilha = my_stack_pop(pilha);
  329.                 //}
  330.  
  331.  
  332.             } else {
  333.                 bst* tochange = bst_search(diretorio,directory);
  334.                 //cout << tochange -> value << endl;
  335.  
  336.                 if(tochange == NULL){
  337.                     cout << "No such file or directory" << endl;
  338.                 } else {
  339.                     if(tochange -> diretorio){
  340.                         //pilha = my_stack_push(pilha, diretorio);
  341.                         //cout << pilha -> top -> next-> root -> value << endl;
  342.                         //cout << "aqui" << endl;
  343.                         buffer[index - 1] -> arquivos = diretorio;
  344.                         buffer[index] = tochange;
  345.                         index++;
  346.                         diretorio = tochange -> arquivos;
  347.                     } else {
  348.                         cout << "Not a directory" << endl;
  349.                     }
  350.                 }
  351.             }
  352.         } else if(command == "ls"){
  353.             inorder(diretorio);
  354.         } else if(command == "touch"){
  355.             string file;
  356.             cin >> file;
  357.  
  358.             bst* toinclude = bst_insert_file(diretorio,file);
  359.             if(toinclude == NULL){
  360.                 cout << "File exists" << endl;
  361.             } else {
  362.                 diretorio = toinclude;
  363.             }
  364.         } else if(command == "mkdir"){
  365.             string file;
  366.             cin >> file;
  367.  
  368.             bst* toinclude = bst_insert_directory(diretorio,file);
  369.             if(toinclude == NULL){
  370.                 cout << "File exists" << endl;
  371.             } else {
  372.                 diretorio = toinclude;
  373.             }
  374.         } else if(command == "pwd"){
  375.             cout << buffer[index - 1] -> value  << endl;
  376.         } else if(command == "tree"){
  377.             string arg;
  378.             cin >> arg;
  379.             if(arg == "--pre-order"){
  380.                 tree_preorder(diretorio, 0);
  381.             } else if(arg == "--in-order"){
  382.                 tree_inorder(diretorio, 0);
  383.             } else if(arg == "--post-order"){
  384.                 tree_posorder(diretorio,0);
  385.             } else {
  386.                 cout << "Illegal option" << endl;
  387.             }
  388.         } else if(command == "rm"){
  389.             string deletar;
  390.             cin >> deletar;
  391.             bst* todelete = bst_delete(diretorio, deletar);
  392.             if(todelete == NULL){
  393.                 cout << "No such file or directory" << endl;
  394.             } else {
  395.                 diretorio = todelete;
  396.             }
  397.         } else {
  398.             cout << "Command not found" << endl;
  399.         }
  400.     }
  401.  
  402.     return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement