Tugas pertemuan 11, aplikasi tree dalam pembuatan folder

 Nama : Fakhrian Elanta

NRP : 5025251019

Kelas : Struktur Data D

Pada program ini akan membuat beberapa sistem sehingga bisa melakukan operasi pada folder. Beberapa poin yang diterapkan dalam kode ini adalah : 

1. Pembuatan Folder

2. Melihat Folder

3. Mencari Folder

4. Menghitung Jumlah Folder

5. Menghapus Folder

6. Melakukan traversal preorder dan postorder

#include <bits/stdc++.h>
using namespace std;

class Node{
    public:
        string name;
        Node* parent;
        vector<Node*> children;

        Node(string folderName, Node* p = NULL){
            name = folderName;
            parent = p;
        }
};

class FolderTree{
    private:
        Node* root;

    public:
        FolderTree(){
            root = new Node("root");
        }

        Node* getRoot(){
            return root;
        }

        void addFolder(Node* parent, string name){
            Node* newFolder = new Node(name, parent);

            parent->children.push_back(newFolder);

            cout << "Folder '" << name << "' berhasil ditambahkan ke '" << parent->name << "'\n";
        }

        void printTree(Node* node, int level = 0){
            if(!node) return;

            for(int i = 0; i < level; i++){
                cout << "|  ";
            }

            if(level > 0) cout << "|--";
           
            cout << node->name << "\n";

            for(Node* child : node->children){
                printTree(child, level + 1);
            }
        }

        void preOrder(Node* node){
            if(!node) return;

            cout << node->name << "\n";

            for(Node* child : node->children){
                preOrder(child);
            }
        }

        void postOrder(Node* node){
            if(!node) return;

            for(Node* child : node->children){
                postOrder(child);
            }

            cout << node->name << "\n";
        }

        Node* search(Node* node, string name){
            if(!node) return NULL;

            if(node->name == name) return node;

            for(Node* child : node->children){
                Node* res = search(child, name);

                if(res) return res;
            }

            return NULL;
        }

        int countFolder(Node* node){
            if(!node) return 0;

            int tol = 1;

            for(Node* child : node->children){
                tol += countFolder(child);
            }

            return tol;
        }

        void showPath(Node* node){
            if(!node) return;

            vector<string> path;

            Node* curr = node;

            while(curr){
                path.push_back(curr->name);
                curr = curr->parent;
            }

            cout << "Path: ";

            for(int i = path.size() - 1; i >= 0; i--){
                cout << path[i];

                if(i != 0) cout << "/";
            }

            cout << "\n";
        }

        void deleteSubtree(Node* node){
            if(!node) return;

            for(Node* child : node->children){
                deleteSubtree(child);
            }

            delete node;
        }

        void deleteFolder(string name){
            Node* t = search(root, name);

            if(!t){
                cout << "Folder tidak ditemukan!\n";
                return;
            }

            if(t == root){
                cout << "root tidak dapat dihapus!\n";
                return;
            }

            Node* p = t->parent;

            for(auto it = p->children.begin(); it != p->children.end(); it++){
                if(*it == t){
                    p->children.erase(it);
                    break;
                }
            }

            deleteSubtree(t);

            cout << "Folder berhasil dihapus!\n";
        }
};

void menu(){
    cout << "\n========== FILE EXPLORER ==========\n";
    cout << "1. Tambah Folder\n";
    cout << "2. Tampilkan Struktur Folder\n";
    cout << "3. Cari Folder\n";
    cout << "4. Hitung Total Folder\n";
    cout << "5. Hapus Folder\n";
    cout << "6. Preorder Traversal\n";
    cout << "7. Postorder Traversal\n";
    cout << "0. Keluar\n";
    cout << "===================================\n";
    cout << "Pilihan : ";
}

int main(){
    FolderTree tree;
    Node* root = tree.getRoot();

    while(true){
        menu();
        int pilih;
        cin >> pilih;

        if(pilih == 1){
            string folder, name;

            cout << "Nama folder parent: ";
            cin >> folder;

            Node* parent = tree.search(root, folder);

            if(!parent){
                cout << "Folder parent tidak ditemukan!\n";
                continue;
            }

            cout << "Nama folder baru: ";
            cin >> name;

            tree.addFolder(parent, name);
        }
        else if(pilih == 2){
            cout << "\n===== STRUKTUR FOLDER =====\n";
            tree.printTree(root);
        }
        else if(pilih == 3){
            string folder;

            cout << "Nama folder yang dicari: ";
            cin >> folder;

            Node* f = tree.search(root, folder);

            if(f){
                cout << "Folder ditemukan!\n";
                tree.showPath(f);
            }
            else cout << "Folder tidak ditemukan!\n";
        }
        else if(pilih == 4){
            cout << "Total folder: " << tree.countFolder(root) << "\n";
        }
        else if(pilih == 5){
            string folder;

            cout << "Nama folder yang ingin dihapus: ";
            cin >> folder;

            tree.deleteFolder(folder);
        }
        else if(pilih == 6){
            cout << "\n===== PREORDER =====\n";
            tree.preOrder(root);
        }
        else if(pilih == 7){
            cout << "\n===== POSTORDER =====\n";
            tree.postOrder(root);
        }
        else if(pilih == 0){
            cout << "Program selesai\n";
            break;
        }
        else cout << "Pilihan tidak valid!\n";
    }

    return 0;
}

Menambah folder

Menampilkan folder
Mencari Folder
Menghitung jumlah folder

Menghapus folder
Preorder traversal
postorder traversal
source code : github













Komentar

Postingan populer dari blog ini

overviewc++

Stack