Kamis, 28 November 2019

SINGLE & DOUBLE LINKED LIST




1.      Tujuan
Mahasiswa mampu menjelaskan pengertian queue dan dequeue
·        Mahasiswa dapat melakukan perancangan aplikasi menggunakan struktur Linked List (Senarai Berkait)
·        Mahasiswa mampu melakukan analisis pada algoritma Single & Double Linked List yang dibuat
·        Mahasiswa mampu mengimplementasikan algoritma Single & Double Linked List pada sebuah aplikasi secara tepat dan efisien
2.      Tujuan Instruksional Khusus
·        Mahasiswa dapat menjelaskan mengenai Single & Double Linked List
·        Mahasiswa dapat membuat dan mendeklarasikan Abstraksi Tipe Data Single & Double Linked List
·        Mahasiswa mampu menerapkan operasi Single Linked List Non Circular & Single Linked List Circular
·        Mahasiswa mampu menerapkan Double Linked List Non Circular & Double Linked List Circular
3.      Dasar Teori
Pengertian Linked List
Salah satu bentuk struktur data yang berisi kumpulan data yang tersusun secara sekuensial, saling bersambungan, dinamis dan terbatas adalah senarai berkait (linked list). Suatu senarai berkait (linked list) adalah suatu simpul (node) yang dikaitkan dengan simpul yang lain dalam suatu urutan tertentu. Suatu simpul dapat berbentuk suatu struktur atau class. Simpul harus mempunyai satu atau lebih elemen struktur atau class yang berisi data. Secara teori, linked list adalah sejumlah node yang dihubungkan secara linier dengan bantuan pointer. Senarai berkait lebih efisien di dalam melaksanakan penyisipan-penyisipan dan penghapusan-penghapusan. Senarai berkait juga menggunakan alokasi penyimpanan secara dinamis, yang merupakan penyimpanan yang dialokasikan pada runtime. Karena di dalam banyak aplikasi, ukuran dari data itu tidak diketahui pada saat kompile, hal ini bisa merupakan suatu atribut yang baik juga. Setiap node akan berbentuk struct dan memiliki satu buah field bertipe struct yang sama, yang berfungsi sebagai pointer. Dalam menghubungkan setiap node, kita dapat menggunakan cara first-create-first-access ataupun first-create lastaccess. Yang berbeda dengan deklarasi struct sebelumnya adalah satu field bernama next, yang bertipe struct tnode. Hal ini sekilas dapat membingungkan. Namun, satu hal yang jelas, variabel next ini akan menghubungkan kita denga node di sebelah kita, yang juga bertipe struct tnode. Hal inilah yang menyebabkan next harus bertipe struct tnode.
Bentuk Umum :
infotype à sebuah tipe terdefinisi yang menyimpan informasi sebuah elemen list
next à address dari elemen berikutnya (suksesor) .
Jika L adalah list, dan P adalah address, maka alamat elemen pertama list L dapat diacu dengan notasi : first (L)
Sebelum digunakan harus dideklarasikan terlebih dahulu :
#define First(L) (L)
Elemen yang diacu oleh P dapat dikonsultasi informasinya dengan notasi :
info(P)deklarasi #define info(P) P->info
next(P)deklarasi #define next(P) P->next
Beberapa Definisi :
1.      List l adalah list kosong, jika First(L) = Nil
2.      Elemen terakhir dikenali, dengan salah satu cara adalah karena Next(Last) = Nil
Nil adalah pengganti Null, perubahan ini dituliskan dengan #define Nil Null
Operasi-operasi Linked List
§  Insert
Istilah Insert berarti menambahkan sebuah simpul baru ke dalam suatu linked list.
§  IsEmpty
Fungsi ini menentukan apakah linked list kosong atau tidak.
§  Find First
Fungsi ini mencari elemen pertama dari linked list.
§  Find Next
Fungsi ini mencari elemen sesudah elemen yang ditunjuk now.
§  Retrieve
Fungsi ini mengambil elemen yang ditunjuk oleh now. Elemen tersebut lalu dikembalikan oleh fungsi.
§  Update
Fungsi ini mengubah elemen yang ditunjuk oleh now dengan isi dari sesuatu.
§  Delete Now
Fungsi ini menghapus elemen yang ditunjuk oleh now. Jika yang dihapus adalah elemen pertama dari linked list (head), head akan berpindah ke elemen berikutnya.
§  Delete Head
Fungsi ini menghapus elemen yang ditunjuk head. Head berpindah ke elemen sesudahnya.
§  Clear
Fungsi ini menghapus linked list yang sudah ada. Fungsi ini wajib dilakukan bila anda ingin mengakhiri program yang menggunakan linked list. Jika anda melakukannya, data-data yang dialokasikan ke memori pada program sebelumnya akan tetap tertinggal di dalam memori.



a.      Single Linked List (Senarai berkait tunggal)
Single linked list adalah apabila hanya ada satu pointer yang menghubungkan setiap node (satu arah “next”).
§  Single Linked List non Circular
Pembuatan struct bernama tnode berisi 2 field, yaitu field data bertipe integer dan field next yang bertipe pointer dari tnode. Deklarasi node dengan struct:
Asumsikan kita memiliki sejumlah node yang selalu menoleh ke sebelah dalam arah yang sama. Atau, sebagai alat bantu, kita bisa mengasumsikan beberapa orang yang bermain kereta api. Yang belakang akan memegang yang depan, dan semuanya menghadap arah yang sama. Setiap pemain adalah node. Dan tangan pemain yang digunakan untuk memegang bahu pemain depan adalah variabel next. Sampai di sini, kita baru saja mendeklarasikan tipe data dasar sebuah node. Selanjutnya, kita akan mendeklarasikan beberapa variabel pointer bertipe struct tnode. Beberapa variabel tersebut akan kita gunakan sebagai awal dari linked list, node aktif dalam linked list, dan node sementara yang akan digunakan dalam pembuatan node di linked list. Berikan nilai awal NULL kepada mereka. Deklarasi node untuk beberapa keperluan, seperti berikut ini:
struct tnode *head=NULL, *curr=NULL, *node=NULL;
Dengan demikian, sampai saat ini, telah dimiliki tiga node. Satu sebagai kepala (head), satu sebagai node aktif dalam linked list (curr) dan satu lagi node sementara (node). Untuk mempermudah pengingatan, ingatlah gambar anak panah yang mengarah ke kanan. Head akan berada pada pangkal anak panah, dan node node berikutnya akan berbaris ke arah bagian anak panah yang tajam.
Apabila diperhatikan, setiap node memiliki petunjuk untuk node sebelahnya. Node terakhir akan diberikan nilai NULL. Dengan demikian, setiap node kebagian jatah.
int i;
for (i=0; i<5; i++)
{
node = (struct tnode *)
malloc (sizeof(struct tnode));
node -> data = i;
if (head == NULL)
{
head = node;
curr = node;
}else
{
curr -> next = node;
curr = node;
}
}
curr -> next = NULL;
Berikut adalah penjelasan kode-kode pembuatan singly linked list tersebut. Pertama-tama, akan dibuat perulangan dari 0 sampai 4, yang dimaksudkan untuk membuat lima buah node yang masing-masing field data nya berisikan nilai dari 0 sampai 4. Pembuatan node dilakukan dengan fungsi malloc()

for (i=0; i<5; i++)
{
node = (struct tnode *)
malloc (sizeof(struct tnode));
node -> data = i
...
... }
Setelah itu, perlu dibuat node dan penghubung. Pertama-tama, akan diuji apakah head bernilai NULL. Kondisi head bernilai NULL hanya terjadi apabila belum dimiliki satu node pun. Dengan demikian, node tersebut akan dijadikan sebagai head. Node aktif (curr), juga kita dapat dari node tersebut. Kalau head tidak bernilai NULL alias telah dimiliki satu atau lebih node, yang pertama dilakukan adalah menghubungkan pointer next dari node aktif (curr) ke node yang baru saja dibuat. Dengan demikian, baru saja dibuat penghubung antara rantai lama dengan mata rantai baru. Atau, dalam permainan kereta api, pemain paling depan dalam barisan lama akan menempelkan tangannya pada bahu pemain yang baru bergabung. Node aktif (curr) kemudian dipindahkan ke node yang baru dibuat.

§  Single Linked List Circular
Hampir sama dengan single linked list non circular, bahwa dibutuhkan sebuah kait untuk menghubungkan node-node data yang ada, dimana pada node terakhir atau tail yang semula menunjukkan NULL diganti dengan menunjuk ke kepala atau head. Dimana inisialisasi senarai berkait tunggal sirkular menggunakan struc adalah sebagai berikut: Deklarasi Single Linked List Circular:

Menambah node dan membuat tail dari single linked list circular
Deklarasi penambahan node baru:



Menyisipkan Node baru
Deklarasi menyisipkan node baru menggunakan sintak berikut:
Void main()
{
node = new tnode;
node->next = head->next;
head->next = node;
}

Menghapus Node dari Single Linked List Circular
Deklarasi menghapus node dari single linked list circular, menggunakan sintaks berikut:
Void main()
{
hapus = new tnode;
if( head != tail)
{
hapus = head;
head = head->next;
tail->next = head;
delete hapus;
}else
{
head = NULL;
tail = NULL;
}
}

b.      Double Linked List (Senarai berkait ganda)
Double Linked List adalah elemen-elemen yang dihubungkan dengan dua pointer dalam satu elemen dan list dapat melintas baik di depan atau belakang. Elemen double linked list terdiri dari tiga bagian :
1.      Bagian data informasi
2.      Pointer next yang menunjuk ke elemen berikutnya
3.      Pointer prev yang menunjuk ke elemen sebelumnya

§  Double Linked List non Circular
Setiap node pada linked list mempunyai field yang berisi data dan pointer ke node berikutnya dan ke node sebelumnya. Untuk pembentukan node baru, mulanya pointer next dan prev akan menunjuk ke nilai NULL. Selanjutnya, pointer prev akan menunjuk ke node sebelumnya, dan pointer next akan menunjuk ke node selanjutnya pada list.

Deklarasi node dibuat dari struct berikut ini :
typedef struct TNode{
int data;
Tnode *next;
Tnode *prev;
};

Double Linked List Non Circular dengan HEAD membutuhkan satu buah variabel pointer, yaitu: head. Head akan selalu menunjuk pada node pertama.
Function untuk mengetahui kosong tidaknya DLLNC
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}



Penambahan data di depan
Penambahan node baru akan dikaitkan di ode paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan pada head nya. Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan. Untuk menghubungkan node terakhir dengan node terdepan dibutuhkan pointer bantu.
Fungsi Menambah Di Depan
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
head->prev = NULL;
}
else {
baru->next = head;
head->prev = baru;
head = baru;
}
cout<<”Data masuk\n”;
}

Penambahan data di belakang
Penambahan data dilakukan di belakang, namun pada saat pertama kali data langsung ditunjuk pada head-nya. Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Untuk mengetahui data terbelakang perlu digunakan perulangan.

Fungsi penambahan Node ke belakang :
Void insertBelakang (int databaru){
Tnode *baru, *bantu;
Baru = new Tnode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
head->prev = NULL;
}
else{
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next
}
bantu->next = baru;
baru->prev = bantu;
}
Cout<<”Data masuk\n”;
}

Ilustrasi Penambahan Node di Belakang

4.      Latihan Praktikum
Latihan
Algoritma dan Struktur Data
Nama Program : Single Linked List Non Circular
Syntax :
#include <iostream>
#include <conio.h>
#include <iomanip> //setw()
#include <stdlib.h>
using namespace std;

struct node
{
   int data;
   node* next; //untuk menghubungkan dengan node lain, tipe data dibuat sama seperti aturan penggunaan pointer
};

node* head;
node* tail;
node* curr;
node* entry;
node* del;

void inisialisasi()
{
   head = NULL;
   tail = NULL;
}

void input(int dt)
{
   entry = (node* )malloc(sizeof(node)); //alokasi memori
   entry->data = dt;
   entry->next = NULL;
   if(head==NULL)
   {
      head = entry;
      tail = head;
   }
   else
   {
      tail->next = entry;
      tail = entry;
   }
}

void hapus()
{
   int simpan;
   if(head==NULL)
   {
      cout<<"\nlinked list kosong, penghapusan tidak bisa dilakukan"<<endl;
   }
   else
   {
      simpan = head->data;
      cout<<"\ndata yang dihapus adalah"<<simpan<<endl;
      //hapus depan
      del = head;
      head = head->next;
      delete del;
   }
}

void cetak()
{
   curr = head;
   if(head == NULL)
      cout<<"\ntidak ada data dalam linked list"<<endl;
   else
   {
      cout<<"\nData yang ada dalam linked list adalah"<<endl;
      cout<<setw(6);
      while(curr!=NULL)
      {
         cout<<curr->data<<"->";
         curr = curr->next;
      }
      cout<<endl;
   }
}

void menu()
{
   char pilih, ulang;
   int data;

   do
   {
      system("cls");
      cout<<"SINGLE LINKED LIST NON CIRCULAR"<<endl;
      cout<<"-------------------------------"<<endl;
      cout<<"Menu : "<<endl;
      cout<<"1. Input data"<<endl;
      cout<<"2. Hapus data"<<endl;
      cout<<"3. Cetak data"<<endl;
      cout<<"4. Exit"<<endl;
      cout<<"Masukkan pilihan Anda : ";
      cin>>pilih;
      switch(pilih)
      {
      case '1' :
         cout<<"\nMasukkan data : ";
         cin>>data;
         input(data);
         break;
      case '2' :
         hapus();
         break;
      case '3' :
         cetak();
         break;
      case '4' :
         exit(0);
         break;
      default :
         cout<<"\nPilih ulang"<<endl;
      }
      cout<<"Kembali ke menu?(y/n)";
      cin>>ulang;
   }while (ulang=='y' || ulang=='Y');
}

int main()
{
   inisialisasi();
   menu();

   return EXIT_SUCCESS;
}

Tampilan Output :
 
Penjelasan Program :
Program diatas merupakan program Single Linked List yang digunakan untuk menginput data, menghapus data, mencetak data, dan exit. Pengguna akan diminta untuk memilih menu sesuai yang diinginkan. Jika pilih 1 maka untuk menginpukan data, lalu jika pilih 2 maka untuk menghapus data, jika pilih 3 maka untuk mencetak data dan jika pilih 4 maka exit. Program selesai.

Tugas Praktikum
Algoritma dan Struktur Data
Nama Program : Troubleshoot Linked List
Syntax :
#include <stdio.h>
#include <stdlib.h>

//denisikan struct
struct SNode{
   int data;
   struct SNode *next;
   struct SNode *before;
};

struct SNode *n_awal,      //node awal dari linked list
   *n_tampil,              //node bantu untuk tampilkan data
   *n_bantu;               //node bantu untuk insert node baru
  
   int iterasi;
  
   //inisialisasi linked list
   void inisialisasi(){
      n_awal = NULL;
   }
  
   //tampilkan linked list
   void tampil_list(){
      n_tampil = n_awal;
     
      while(n_tampil!=NULL){
         printf("%d ,", n_tampil->data);
         n_tampil = n_tampil->next;
      }
      printf("\n");
   }
  
   //method untuk insert node baru
   void insert_node(int data){
     
      //node baru yang akan di insert
      struct SNode *n_insert;
      n_insert = (struct SNode*)malloc(sizeof(struct SNode));
      n_insert->data = iterasi;
      n_insert->next = NULL;
      n_insert->before = NULL;
     
      //kondisi linked list masih kosong
      if(n_awal == NULL){
         n_awal = n_insert;
      }else{
         n_bantu = n_awal;
        
         //cari node terakhir
         while(n_bantu->next != NULL){
               n_bantu = n_bantu->next;
         }
        
         //hubungkan node terakhir dengan node baru
         if(n_bantu->next==NULL)
         {
               n_bantu->next = n_insert;
               n_insert->before = n_bantu;
         }
      }
   }
   int main(int argc, char *argv[])
   {
      inisialisasi();
      for(iterasi = 11; iterasi<=15; iterasi++)
      {
         insert_node(iterasi);
      }
     
      tampil_list();
     
      system("PAUSE");
      return 0;
   }







Tampilan Output :

 
Penjelasan Program :
program diatas adalah program setelah dilakukan troubleshot dan ditemukan kesalah pada program yaitu : pertama pada while(n_tampil !== NULL) pada tanda == itu adalah operator untuk tes kesetaraan dan mengembalikan boolean dan tanda tersebut error karena tidak cocok, seharusnya adalah = tanda sama dengan hanya satu yang bermakna operator penugasan dan bila dijalankan akan hilang error nya karena cocok dengan fungsi sebelumnya. Kedua adalah n_tampil = n_tampil->before; syntax tersebut salah karena ada before yang seharusnya next agar dapat menampilkan sampai nilai maximum yang telah dideklarasikan.


Tugas Rumah
Algoritma dan Struktur Data
Nama Program : Program Linked List Wahana Jatim Park Malang
Syntax :
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>

using namespace std;


struct Node
{
   int data;
   Node *next;
};
Node *head, *tail;


void menu();
void LinkedList();
void penutup();
void inisialisasi();
void insertData();
void removeData();
void bersih();
void tampil();

void line()
{
    for(int i=0; i<25; i++)
    cout<<"__";
    cout<<endl;
}


int main()
{
   char MENU;
   int ulangMetode = 1;

   do
   {
      system("cls");
      system("color A0");
      line();
      line();
      printf("   ===  ===   ======   ====       ===  =======  \n");
      printf("   ===  ===  ===  ===  === ==  == ===  ===     \n");
      printf("   ========  ===  ===  ===  ===   ===  =======  \n");
      printf("   ===  ===  ===  ===  ===        ===  ===     \n");
      printf("   ===  ===   =====    ===        ===  ======= \n");
      line();
      line();
      printf("1. pendaftaran permainan Wahana Jatim Park Malang \n");
      printf("2. EXIT \n");
      printf("=====================================\n");

      printf(">> Masukkan Pilihan : ");
      MENU = getche();
      printf("\n");
      getch();

      switch(MENU)
      {
         case '1' :
            LinkedList();
            break;
         case '2' :
            penutup();
            break;
         default :
         {
            puts("\nKode yang dimasukkan salah\n");
            puts("Press any key untuk kembali");
            getch();
         }
         break;
      }
   }
   while(ulangMetode == 1);
}


void menu()
{
system("cls");
system("color 57");
printf("\n\n");
printf("   Pendaftaran Antrian Wahana Jatim Park Malang           \n");
printf("=========================================\n");
printf(" 1. masukan antrian penumpang     \n");
printf(" 2. mulai masuk permainan         \n");
printf(" 3. memberangkatkan semua antrian \n");
printf(" 4. menampilkan semua antrian     \n");
printf(" 5. kembali ke menu utama         \n");
printf(" 6. keluar                        \n");
printf("=========================================\n");

}


void LinkedList()
{
char pilihMenu;
int ulang = 1;

do
{
menu();
printf(">> Pilihan Anda  : ");
pilihMenu = getche();
printf("\n");
switch(pilihMenu)
{
case '1' :
insertData();
break;
case '2' :
removeData();
break;
case '3' :
bersih();
break;
case '4' :
tampil();
break;
case '5' :
main();
break;
case '6' :
penutup();
break;
default :
{
puts("Input Menu Salah!\n");
puts("Press any key untuk kembali");
getch();
}
break;
}
}
while(ulang == 1);
}


void inisialisasi()
{
head = NULL;
tail = NULL;
}


void insertData()
{
   int angka;
   Node *nodeBaru;
   nodeBaru = new Node;
   cout<<"Masukkan Nomor Karcis : ";
   cin>>angka;
   nodeBaru->data = angka;
   nodeBaru->next = NULL;
   if(tail == NULL)
   {
      head = tail = nodeBaru;
      tail->next = NULL;
   }
   else
   {
      tail->next = nodeBaru;
      tail = nodeBaru;
   }
   printf("Data %i masuk!\n\n", angka);
   puts("Press any key untuk kembali");
   getch();
   system("cls");
}


void removeData()
{
   int elDel;
   Node *del, *prevTail;
   del = new Node;
   if(tail != NULL)
   {
      del = tail;
      elDel = del->data;
      if(tail == head)
      {
         inisialisasi();
      }
      else
      {
         prevTail = head;
         while(prevTail->next != tail)
         prevTail = prevTail->next;
         tail = prevTail;
         tail->next = NULL;
      }
      delete del;
      printf("antrian %i masuk ke permainan wahana jatim park\n\n", elDel);
   }
   else
   {
      puts("antrian Kosong! Tidak ada antrian yang dapat bermain!\n");
   }
   puts("Press any key untuk kembali");
   getch();
   system("cls");
}


void bersih()
{
   Node *clear, *point;
   if(tail != NULL)
   {
      point = head;
      while(point != NULL)
      {
         clear = point;
         point = point->next;
         delete clear;
      }
      inisialisasi();
      puts("Semua antrian masuk dalam permainan wahana jatim park\n");
   }
   else
   puts("antrian Masih Kosong!\n");
   puts("Press any key untuk kembali");
   getch();
   system("cls");
}


void tampil()
{
   Node *see;
   see = head;
   if(tail != NULL)
   {
      puts("Daftar Data Antrian permainan wahana jatim park :");
      puts("");
      while(see != NULL)
      {
         printf("%i ", see->data);
         see = see->next;
      }
      puts("\n");
   }
   else
   puts("antrian kosong!\n");
   puts("Press any key untuk kembali");
   getch();
   system("cls");
}


void penutup()
{
   printf("\n\n\tTERIMA KASIH\n\n");
   exit(0);
}
     

Tampilan Output :
 


Penjelasan Program :
Program diatas digunakan untuk mendaftar permainan di wahana jatim park malang. Tampilan pertama merupakan home, dimana ada 2 pilihan yaitu 1 pendaftaran permainan wahana jatim park malang untuk mendaftar permainan, dan yang ke-2 exit untuk keluar. Jika pilih menu 1 maka akan muncul beberapa pilihan yaitu  no 1 untuk memasukkan antrian, no 2 maka untuk memulai masuk permainan, no 3 untuk memberangkatkan semua antrian, no 4 untuk menampilkan semua antrian dan no 5 untuk kembali ke home. Dan terakir no 6 untuk mengakhiri program tersebut. Program diatas memiliki banyak sekali pilihan karena memang kebutuhan maka dari itu saya menggunakan system cls agar tampilan tidak menumpuk-numpuk.


KESIMPULAN
1.      Pada struktur data linked list ini terdapat 2 macam, yaitu single linked list (senarai berkait tunggal), double linked list (senarai berkait ganda.
2.      Single linked list yaitu bila stuctur data sebuah node berikutnya dalam sebuah senarai maka senarai tersebut dinamakan senarai tunggal, senarai tunggal tiap-tiap node yang berdiri atas dua elemen yaitu data integer dan elemen rujukan ke node berikutnya
3.      Double linked list memiliki 2 pointer penunjuk yaitu next dan prev
4.      Dalam  linked list dapat menambah node baru. Di tengah ,depan , dan belakang
5.      Dapat menghapus sebuah node dari  linked list circular

SINGLE & DOUBLE LINKED LIST

1.       Tujuan Mahasiswa mampu menjelaskan pengertian queue dan dequeue ·         Mahasiswa dapat melakukan perancangan aplikas...