Advertisement
khisby

Sorting and Searching with linked list

May 29th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. struct data{
  7.     string nama;
  8.     int npm;
  9. };
  10.  
  11. struct node{
  12.     int index;
  13.     data data;
  14.     node *next;
  15. };
  16.  
  17. node *baru,*awal=NULL,*akhir=NULL,*bantu,*bantu2;
  18.  
  19. int indeks=-1;
  20.  
  21. void buatNode(string thisNama,int thisNpm){
  22.     indeks++;
  23.     baru = new node;
  24.     baru->next = NULL;
  25.     baru->index = indeks;
  26.     baru->data.nama = thisNama;
  27.     baru->data.npm = thisNpm;
  28.     if(awal==NULL){
  29.         awal=akhir=baru;
  30.     }else{
  31.         akhir->next = baru;
  32.         akhir=baru;
  33.     }
  34. }
  35.  
  36. void tambahData(){
  37.     string thisNama;
  38.     int thisNpm;
  39.     cout << "Masukkan nama :";
  40.     cin >> thisNama;
  41.     cout << "Masukkan npm :";
  42.     cin >> thisNpm;
  43.     buatNode(thisNama,thisNpm);
  44. }
  45.  
  46. void view(){
  47.     if(indeks!=-1){
  48.         cout << "Data : " << endl;
  49.         cout << "No. \tNPM \t-> \tNAMA \t-> \tINDEX NODE" << endl;
  50.         bantu = awal;
  51.         for(int i=0;i<=indeks;i++){
  52.             cout << i+1 << ". \t" << bantu->data.npm << "\t-> \t" << bantu->data.nama << "\t-> \t" << bantu->index << endl;
  53.             bantu=bantu->next;
  54.         }
  55.     }
  56. }
  57.  
  58. void urutkanMenaik(){
  59.     node *tmp;
  60.     bantu = awal;
  61.     for(int i=0;i<indeks;i++){
  62.         bantu=bantu2=awal;
  63.         while(bantu->next!=NULL){
  64.             if(bantu->data.npm>bantu->next->data.npm){
  65.                 tmp = bantu->next;
  66.                 bantu->next = bantu->next->next;
  67.                 tmp->next = bantu;
  68.                 if(bantu==awal){
  69.                     awal=bantu2=tmp;
  70.                 }else{
  71.                     bantu2->next=tmp;
  72.                 }
  73.                 bantu=tmp;
  74.             }
  75.             bantu2 = bantu;
  76.             bantu = bantu->next;
  77.         }
  78.     }
  79. }
  80.  
  81. void acak(){
  82.     node *tmp;
  83.     bantu = awal;
  84.     for(int i=0;i<indeks;i++){
  85.         bantu=bantu2=awal;
  86.         while(bantu->next!=NULL){
  87.             tmp = bantu->next;
  88.             bantu->next = bantu->next->next;
  89.             tmp->next = bantu;
  90.             if(bantu==awal){
  91.                 awal=bantu2=tmp;
  92.             }else{
  93.                 bantu2->next=tmp;
  94.             }
  95.             bantu=tmp;
  96.             bantu2 = bantu;
  97.             bantu = bantu->next;
  98.         }
  99.     }
  100. }
  101.  
  102. void urutkanMenurun(){
  103.     node *tmp;
  104.     bantu = awal;
  105.     for(int i=0;i<indeks;i++){
  106.         bantu=bantu2=awal;
  107.         while(bantu->next!=NULL){
  108.             if(bantu->data.npm<bantu->next->data.npm){
  109.                 tmp = bantu->next;
  110.                 bantu->next = bantu->next->next;
  111.                 tmp->next = bantu;
  112.                 if(bantu==awal){
  113.                     awal=bantu2=tmp;
  114.                 }else{
  115.                     bantu2->next=tmp;
  116.                 }
  117.                 bantu=tmp;
  118.             }
  119.             bantu2 = bantu;
  120.             bantu = bantu->next;
  121.         }
  122.     }
  123. }
  124.  
  125. void ulang(){
  126.     indeks = -1;
  127.     awal=akhir=NULL;
  128. }
  129.  
  130. bool cekUrutMenaik(){
  131.     if(indeks == -1 || indeks == 0){
  132.         return true;
  133.     }
  134.  
  135.     bantu = awal;
  136.     for(int i=0;i<indeks;i++){
  137.         if(bantu->data.npm > bantu->next->data.npm ){
  138.             return false;
  139.         }
  140.         bantu=bantu->next;
  141.     }
  142.     return true;
  143. }
  144.  
  145. bool cekUrutMenurun(){
  146.     if(indeks == -1 || indeks == 0){
  147.         return true;
  148.     }
  149.  
  150.     bantu = awal;
  151.     for(int i=0;i<indeks;i++){
  152.         if(bantu->data.npm < bantu->next->data.npm ){
  153.             return false;
  154.         }
  155.         bantu=bantu->next;
  156.     }
  157.     return true;
  158. }
  159.  
  160. node *cariTengah(node *awalNode,node *akhirNode){
  161.     if(awalNode == NULL){
  162.         return NULL;
  163.     }
  164.  
  165.     node *sekarang = awalNode;
  166.     node *depan = awalNode->next;
  167.  
  168.     while(depan!=akhirNode){
  169.         depan = depan->next;
  170.         if(depan!=akhirNode){
  171.             sekarang = sekarang->next;
  172.             depan = depan->next;
  173.         }
  174.     }
  175.     return sekarang;
  176. }
  177.  
  178. void cari(){
  179.     if(cekUrutMenaik() || cekUrutMenurun()){
  180.         bantu = awal;
  181.         bantu2 = NULL;
  182.         int cariNpm;
  183.         cout << "Masukkan npm yang mau di cari : ";
  184.         cin >> cariNpm;
  185.  
  186.         do{
  187.             node *tengah = cariTengah(bantu,bantu2);
  188.  
  189.             if(tengah == NULL){
  190.                 cout << "Data kosong" << endl;
  191.                 system("pause");
  192.                 break;
  193.             }
  194.  
  195.             if(tengah->data.npm == cariNpm){
  196.                 cout << "Data ditemukan pada index ke-" << tengah->index << endl;
  197.                 cout << "NPM \t: " << tengah->data.npm << endl << "Nama \t: " << tengah->data.nama << endl;
  198.                 system("pause");
  199.                 break;
  200.             }
  201.  
  202.             if(cekUrutMenaik() == true && cekUrutMenurun() == false){
  203.                 if(tengah->data.npm < cariNpm){
  204.                     bantu = tengah->next;
  205.                 }else{
  206.                     bantu2 = tengah;
  207.                 }
  208.             }else{
  209.                 if(tengah->data.npm > cariNpm){
  210.                     bantu = tengah->next;
  211.                 }else{
  212.                     bantu2 = tengah;
  213.                 }
  214.             }
  215.  
  216.  
  217.         }while(bantu2==NULL || bantu2->next != bantu);
  218.     }else{
  219.         cout << "Data belum urut.. Mohon pilih menu 2 atau 3 untuk mengurutkan..." << endl;
  220.         system("pause");
  221.     }
  222. }
  223.  
  224. void buatData(){
  225.     ulang();
  226.     int jum;
  227.     cout << "Masukkan jumlah data yang ingin di buat : ";
  228.     cin >> jum;
  229.  
  230.     string nama;
  231.     char huruf = 'a';
  232.     int npm = 1;
  233.     for(int i=1;i<=jum;i++){
  234.         nama = huruf;
  235.         buatNode(nama,npm);
  236.         huruf++;
  237.         npm++;
  238.     }
  239. }
  240.  
  241. int main()
  242. {
  243.     int menu;
  244.     do{
  245.         system("cls");
  246.         view();
  247.         cout << endl << endl;
  248.         cout << "Menu : " << endl;
  249.         cout << "1. Tambah Data" << endl;
  250.         cout << "2. Urutkan Menaik" << endl;
  251.         cout << "3. Urutkan Menurun" << endl;
  252.         cout << "4. Acak" << endl;
  253.         cout << "5. Ulang" << endl;
  254.         cout << "6. Cari" << endl;
  255.         cout << "7. Buat Data Otomatis" << endl;
  256.         cout << "8. Keluar" << endl;
  257.         cout << "Masukkan menu :";
  258.         cin >> menu;
  259.  
  260.         if(menu == 1){
  261.             tambahData();
  262.         }else if(menu == 2){
  263.             urutkanMenaik();
  264.         }else if(menu == 3){
  265.             urutkanMenurun();
  266.         }else if(menu == 4){
  267.             acak();
  268.         }else if(menu == 5){
  269.             ulang();
  270.         }else if(menu == 6){
  271.             cari();
  272.         }else if(menu == 7){
  273.             buatData();
  274.         }
  275.  
  276.     }while(menu != 8);
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement