SHARE
TWEET

Kejuaraan (Multi LinkedList)

jzh4n May 25th, 2020 (edited) 1,179 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3.  
  4. template <typename T>
  5. struct LinkedList {
  6.     struct Node {
  7.         T data;
  8.         Node *next;
  9.         Node *prev;
  10.  
  11.         Node(): next {nullptr}, prev {nullptr}{}
  12.     };
  13.  
  14.     Node *head;
  15.     Node *tail;
  16.  
  17.     LinkedList(): head {nullptr}, tail {nullptr}{}
  18.  
  19.     void pushBack(T node) {
  20.         if(head == nullptr) {
  21.             head = new Node;
  22.             head->data = node;
  23.             tail = head;
  24.         } else {
  25.             Node *new_node = new Node;
  26.             new_node->data = node;
  27.             tail->next = new_node;
  28.             new_node->prev = tail;
  29.             tail = new_node;
  30.         }
  31.     }
  32.  
  33.     void pushFront(T node) {
  34.         if(head == nullptr) {
  35.             head = new Node;
  36.             head->data = node;
  37.             tail = head;
  38.         } else {
  39.             Node *new_node = new Node;
  40.             new_node->data = node;
  41.             head->prev = new_node;
  42.             new_node->next = head;
  43.             head = new_node;
  44.         }
  45.     }
  46.  
  47.     void popBack() {
  48.         if(head == nullptr) return;
  49.  
  50.         Node *temp = tail;
  51.         tail = tail->prev;
  52.  
  53.         delete temp;
  54.  
  55.         if(tail == nullptr)
  56.             head = nullptr;
  57.     }
  58.  
  59.     void popFront() {
  60.         if(head == nullptr) return;
  61.  
  62.         Node *temp = head;
  63.         head = head->next;
  64.  
  65.         delete temp;
  66.  
  67.         if(head == nullptr)
  68.             tail = nullptr;
  69.     }
  70.  
  71.     void remove(T node) {
  72.         Node *temp = head;
  73.         bool flag = false;
  74.  
  75.         for(; temp != nullptr; temp = temp->next)
  76.             if(temp->data == node) {
  77.                 flag = true;
  78.  
  79.                 break;
  80.             }
  81.  
  82.         if(flag) {
  83.             if(temp->prev != nullptr)
  84.                 temp->prev->next = temp->next;
  85.  
  86.             if(temp->next != nullptr)
  87.                 temp->next->prev = temp->prev;
  88.  
  89.             if(temp == head)
  90.                 head = temp->next;
  91.  
  92.             if(temp == tail)
  93.                 tail = temp->prev;
  94.  
  95.             delete temp;
  96.         }
  97.     }
  98.  
  99.     bool isInList(T node) {
  100.         for(Node *temp = head; temp != nullptr; temp = temp->next)
  101.             if(temp->data == node) return true;
  102.  
  103.         return false;
  104.     }
  105.  
  106.     Node *getNode(T node) {
  107.         for(Node *temp = head; temp != nullptr; temp = temp->next)
  108.             if(temp->data == node) return temp;
  109.  
  110.         return nullptr;
  111.     }
  112. };
  113.  
  114. struct Peserta;
  115.  
  116. struct Kejuaraan {
  117.     std::string nama;
  118.     std::string jenis;
  119.  
  120.     void setPeserta(LinkedList<Peserta>::Node *node) {
  121.         if(!peserta.isInList(node))
  122.             peserta.pushBack(node);
  123.     }
  124.  
  125.     bool operator==(Kejuaraan k) {
  126.         if(k.nama == nama and k.jenis == jenis)
  127.             return true;
  128.        
  129.         return false;
  130.     }
  131.  
  132. //private:
  133.     LinkedList<LinkedList<Peserta>::Node *> peserta;
  134. };
  135.  
  136. struct Peserta {
  137.     std::string nama;
  138.     int umur;
  139.     std::string alamat;
  140.  
  141.     void setKejuaraan(LinkedList<Kejuaraan>::Node *node) {
  142.         if(!kejuaraan.isInList(node))
  143.             kejuaraan.pushBack(node);
  144.     }
  145.  
  146.     bool operator==(Peserta p) {
  147.         if(p.nama == nama and p.alamat == alamat and p.umur == umur)
  148.             return true;
  149.        
  150.         return false;
  151.     }
  152.  
  153. //private:
  154.     LinkedList<LinkedList<Kejuaraan>::Node *> kejuaraan;
  155. };
  156.  
  157. void removeKejuaraanNode(Kejuaraan k, LinkedList<Kejuaraan> &daftar_kejuaraan, LinkedList<Peserta> &daftar_peserta) {
  158.     auto remove_target = daftar_kejuaraan.getNode(k);
  159.    
  160.     // menghapus data kejuaraan yang ada di setiap peserta
  161.     if(remove_target != nullptr)
  162.         for(auto temp = daftar_peserta.head; temp != nullptr; temp = temp->next)
  163.             temp->data.kejuaraan.remove(remove_target);
  164.  
  165.     daftar_kejuaraan.remove(k);
  166. }
  167.  
  168. void removePesertaNode(Peserta p, LinkedList<Kejuaraan> &daftar_kejuaraan, LinkedList<Peserta> &daftar_peserta) {
  169.     auto remove_target = daftar_peserta.getNode(p);
  170.  
  171.     // menghapus data peserta yang ada di setiap kejuaraan
  172.     if(remove_target != nullptr)
  173.         for(auto temp = daftar_kejuaraan.head; temp != nullptr; temp = temp->next)
  174.             temp->data.peserta.remove(remove_target);
  175.  
  176.     daftar_peserta.remove(p);
  177. }
  178.  
  179. int main() {
  180.     LinkedList<Peserta> daftar_peserta;
  181.     LinkedList<Kejuaraan> daftar_kejuaraan;
  182.  
  183.     Peserta peserta[] = {
  184.         {"David", 30, "XYZ"},
  185.         {"Laura", 25, "ABC"},
  186.         {"Jessica", 26, "DEF"},
  187.         {"Agus", 35, "GHI"}
  188.     };
  189.     Kejuaraan kejuaraan[] = {
  190.         {"Lari", "Jarak Pendek"},
  191.         {"Bulu Tangkis", "Ganda Putri"},
  192.         {"Bulu Tangkis", "Ganda Putri"},
  193.         {"Lompat", "Lompat Tinggi"}
  194.     };
  195.  
  196.     for(int i = 0; i < 4; ++i) {
  197.         // Peserta peserta;
  198.         // Kejuaraan kejuaraan;
  199.  
  200.         // std::cout << "Nama: ";
  201.         // std::getline(std::cin, peserta.nama);
  202.  
  203.         // std::cout << "Umur: ";
  204.         // std::cin >> peserta.umur;
  205.  
  206.         // fflush(stdin);
  207.  
  208.         // std::cout << "Alamat: ";
  209.         // std::getline(std::cin, peserta.alamat);
  210.  
  211.         // std::cout << "Nama kejuaraan: ";
  212.         // std::getline(std::cin, kejuaraan.nama);
  213.  
  214.         // std::cout << "Jenis kejuaraan: ";
  215.         // std::getline(std::cin, kejuaraan.jenis);
  216.  
  217.         daftar_peserta.pushBack(peserta[i]);
  218.  
  219.         if(!daftar_kejuaraan.isInList(kejuaraan[i]))
  220.             daftar_kejuaraan.pushBack(kejuaraan[i]);
  221.  
  222.         auto kejuaraan_node = daftar_kejuaraan.getNode(kejuaraan[i]);
  223.         auto peserta_node = daftar_peserta.getNode(peserta[i]);
  224.  
  225.         peserta_node->data.setKejuaraan(kejuaraan_node);
  226.         kejuaraan_node->data.setPeserta(peserta_node);
  227.     }
  228.  
  229.     std::cout << "########################\n\n";
  230.  
  231.     removeKejuaraanNode((Kejuaraan){"Bulu Tangkis", "Ganda Putri"}, daftar_kejuaraan, daftar_peserta);
  232.  
  233.     for(auto temp = daftar_peserta.head; temp != nullptr; temp = temp->next) {
  234.         std::cout << temp->data.nama << "\n";
  235.  
  236.         for(auto temp2 = temp->data.kejuaraan.head; temp2 != nullptr; temp2 = temp2->next;)
  237.             std::cout << "\t" << temp2->data->data.nama << "\n";
  238.     }
  239.  
  240.     return 0;
  241. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top