Tuesday, 1 March 2016

MAKLAH TENTANG DOUBLE LINKET LIST DAN SINGLE LINGKED LIST

BAB I
PENDAHULUAN
A.      Latar Belakang
Struktur data adalah cara menyimpan atau merepresentasikan data di dalam komputer agar bisa dipakai secara efisien Sedangkan data adalah representasi dari fakta dunia nyata.  Fakta atau keterangan tentang kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk tulisan, suara, gambar, sinyal atau symbol.  Secara garis besar type data dapat dikategorikan menjadi :
1. Type data sederhana
a. Type data sederhana tunggal, misalnya Integer, real, boolean dan karakter
b. Type data sederhana majemuk, misalnya String
2. Struktur Data, meliputi
a. Struktur data sederhana, misalnya array dan record
b. Struktur data majemuk, yang terdiri dari Linier : Stack, Queue, serta List dan Multilist Non Linier : Pohon Biner dan Graph
Pemakaian struktur data yang tepat di dalam proses pemrograman akan menghasilkan algoritma yang lebih jelas dan tepat, sehingga menjadikan program secara keseluruhan lebih efisien dan sederhana. 

B.       Rumusan Masalah
Permasalahan yang akan dibahas dalam penelitian ini adalah bagaimana membuat  suatu program menggunakan single linked list dan double linked list pada C++.




BAB II 
PEMBAHASAN
A.    Pengertian Linked List
Linked List adalah salah satu bentuk struktur data, berisi kumpulan data  (node) yang
tersusun secara sekuensial, saling sambung menyambung, dinamis dan terbatas.
 - Linked List sering disebut juga Senarai Berantai
- Linked List saling terhubung dengan bantuan variabel pointer
- Masing-masing data dalam Linked List disebut dengan node (simpul) yang menempati alokasi memori secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field.
Single Linked List adalah sebuah LINKED LIST yang menggunakan sebuah variabel pointer saja untuk menyimpan banyak data dengan metode LINKED LIST, suatu daftar isi yang saling berhubungan.
Ilustrasi single LINKED LIST:
Pada gambar di atas, data terletak pada sebuah lokasi dalam sebuah memory, tempat yang disediakan memory untuk menyimpan data disebut node ? simpul, setiap node memiliki pointer ( penunjuk ) yang menunjuk ke node berikutnya sehingga terbentuk suatu untaian yang disebut SINGLE LINKED LIST.
Bila dalam SINGLE LINKED LIST pointer hanya dapat bergerak ke satu arah saja, maju / mundur, kanan / kiri, sehingga pencarian datanya juga hanya satu arah saja.
Ada 2 Tipe Single Linked List yaitu
1.      Single Linked List Circular
2.      Single Linked List Non Circular
A.      SINGLE LINKED LIST CIRCULAR
Single Linked List Circular adalah Single Linked List yang pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa node, maka pointer next pada node terakhir akan menunjuk ke node terdepannya.
Pengertian:
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar
Ilustrasi Single Linked List Circular
- Setiap node pada linked list mempunyai field yang berisi pointer ke node   berikutnya, dan juga memiliki field yang berisi data
- Pada akhir linked list, node terakhir akan menunjuk ke node terdepan  sehingga linked list tersebut berputar. Node terakhir akan menunjuk lagi  ke head.
a)      Penambahan Data
Penambahan data di depan. Penambahan node baru akan dikaitan di node 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.
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.
b)     Menampilkan Data
Function untuk menampilkan isi single linked list
void tampil(){ TNode *b;
b = head;
if(isEmpty()==0)
{
do
{
cout<data<<" ";
b=b->next;
}
while(b!=head);
cout<<<"Masih kosong\n";
}

-          Function di atas digunakan untuk menampilkan semua isi list, di mana linked list ditelusuri satu-persatu dari awal node sampai akhir node. Penelusuran ini dilakukan dengan menggunakan suatu variabel node bantu, karena pada prinsipnya variabel node head yang menjadi tanda awal list tidak boleh berubah/berganti posisi.
-          Penelusuran dilakukan terus sampai node terakhir ditemukan menunjuk ke head lagi. Jika belum sama dengan head, maka node bantu akan berpindah ke node selanjutnya dan membaca isi datanya dengan menggunakan field next sehingga dapat saling berkait.
-          Jika head masih NULL berarti data masih kosong!

c)      Penghapusan Data
Function untuk menghapus data terdepan
void hapusDepan ()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head; d = head->data;
if(head->next != head){
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
head = head->next;
delete hapus;
bantu->next = head;
}else{
head=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}

-          Function di atas akan menghapus data teratas (pertama) yang ditunjuk oleh head  pada linked list
-           Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus ditampung dahulu pada variabel hapus dan barulah kemudian menghapus variabel hapus dengan menggunakan perintah delete.
-          Sebelum data terdepan dihapus, head harus ditunjukkan ke data sesudahnya  terlebih dahulu sehingga data setelah head lama akan menjadi head baru (data terdepan yang baru).
-           Jika head masih NULL maka berarti data masih kosong!

d)     Single Linked List Menggunakan Head Dan Tail
-          Dibutuhkan dua buah variabel pointer: head dan tail
-          Head akan selalu menunjuk pada node pertama, sedangkan tail akan selalu menunjuk pada node terakhir.
Inisialisasi LinkedList

TNode *head, *tail;
Fungsi Inisialisasi LinkedList
void init(){
head = NULL;
tail = NULL;
}

Function untuk mengetahui kosong tidaknya LinkedList
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
e)      Penambahan Data
Pengkaitan node baru ke linked list di depan
Penambahan data baru di depan akan selalu menjadi head.
void insertDepan
(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else {
baru->next = head;
head = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}

Penambahan Data di belakang Pada penambahan data di belakang, data akan selalu dikaitkan dengan tail, karena tail terletak di node paling belakang. Setelah dikaitkan dengan node baru, maka node baru tersebut akan menjadi tail.
Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus menggunakan perulangan pointer bantu.

Function untuk menampilkan isi linked list:
void tampil(){ TNode *b;
b = head; if(isEmpty()==0)
{
do
{ cout<data<<" ";
b=b->next;
}
while(b!=tail->next);
cout<<<"Masih kosong\n";
}

Pada prinsipnya sama dengan function tampil sebelumnya.
Function untuk menghapus data di depan
void hapusDepan(){ TNode *hapus;
if (isEmpty()==0){ int d;
hapus = head;
d = head->data;
if(head != tail){
hapus = head;
head = head->next;
tail->next = head;
delete hapus;
}else{
head=NULL;
tail=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}

-           Function di atas akan menghapus data terdepan (pertama) yang ditunjuk oleh head pada linked list
-           Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada head, kemudian dilakukan pergeseran ke node berikutnya sehingga data setelah head menjadi head baru, kemudian menghapus variabel hapus dengan menggunakan perintah delete.
-           Jika tail masih NULL maka berarti data masih kosong!

Function untuk menghapus data di belakang:
Dengan menggunakan Single Linked List ber-Head dan Tail, pengahapusan data di belakang akan mudah dilakukan, tidak seperti pada Single Linked List hanya ber-Head saja.

void hapusBelakang(){ TNode *hapus,*bantu;
if (isEmpty()==0){ int d;
if(head == tail){ d = tail->data;
head = NULL;
tail = NULL;
}
else
{
bantu = head;
while(bantu->next != tail){
bantu = bantu->next;
}
hapus = tail;
tail = bantu;
d = hapus->data;
tail->next = head;
delete hapus;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}

-          Function di atas akan menghapus data terbelakang (terakhir) yang ditunjuk oleh tail pada linked list
-          Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada tail, kemudian dibutuhkan pointer bantu untuk membantu pergeseran dari head ke node berikutnya sampai sebelum tail, sehingga tail dapat ditunjukkan ke bantu tersebut, dan bantu tersebut akan menjadi tail yang baru. Setelah itu hapus variabel hapus dengan menggunakan perintah delete.
-          Jika tail masih NULL maka berarti data masih kosong!



Function untuk menghapus semua elemen LinkedList
void clear(){ TNode *bantu,*hapus;
if(isEmpty() == 0){ bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
}

-          Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang list, dan menggunakan pointer hapus yang digunakan untuk menunjuk node-node yang akan dihapus.
-          Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus akan didelete.

2.  Single Linked List Non Circular
Pengertian:
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Linked List : artinya node-node tersebut saling terhubung satu sama lain.
Ilustrasi Linked List
-          Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data.
-          Pada akhir linked list, node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list

Contoh program single linked list
# include<stdio.h>
# include<stdlib.h>
# include<conio.h>
# include<iostream.h>
# include<ctype.h>
# include<string.h>
struct simpul
{                      
            int angka;
            struct simpul*berikut;
} ;
struct simpul *awal=NULL;
int bil;
void tambah_list_didepan(int info);
void isi_list();
void tampil_list();
void hapus_list();
void main ()
{
            clrscr();
            isi_list();
            clrscr();
            tampil_list();
            hapus_list();
            getch();
}
void tambah_list_didepan(int info)
{
            struct simpul *baru;
            baru=(struct simpul *)malloc(sizeof(struct simpul));
            baru->angka=info;
            baru->berikut=awal;
            awal=baru;
}
void isi_list()
{
            char jawab;
            do
            {
            clrscr();
            cout<<"\ninput bilangan :";
            cin>>bil;
            tambah_list_didepan(bil);
            cout<<"\ntambah data Y/T :"  ;
            cin>>jawab;
            }
            while (toupper(jawab)!='T');
}
void tampil_list()
{
            struct simpul* baca;
            int i;
            baca=awal;
            i=1;
            while(baca!=NULL)
            {
                        cout<<"\nbilangan ke-"<<i<<"yang dibaca :"<<baca->angka;
                        i++;
                        baca=baca->berikut;
            }
}
void hapus_list()
{
            struct simpul*hapus;
            hapus=awal;
            while(hapus!=NULL)
            {
                        awal=hapus->berikut;
                        free(hapus);
                        hapus=awal;
            }
}

















DOUBLE LINKED LIST

Tidak jauh berbeda dengan materi sebelumnya yakni Single Linked List. Materi ini hanya menambahkan satu pointer (yang nantinya dapat dikembangkan dengan banyak pointer). Bila kita lihat lagi penggambaran dari Single Linked List :

data
pointer next



Sedangkan pada materi yang ada sekarang, kita akan menambahkan satu lagi pointernya. Sehingga bila kita lihat ilustrasinya :

data

pointer prev







pointer next
























Untuk setiap pembuatan node yang baru kita mempergunakan keyword

Sama seperti Single Linked List, kita juga membagi materi ini dalam dua jenis, yakni :

a.       Non Circular
b.      Circular

Dimana tiap-tiap juga akan terdiri dari linked list yang terdiri dari Head saja dan Head dengan Tail.

a.      Non Circular

1.      Dengan Head
-          Menggunakan 1 pointer head
-          Head selalu menunjuk node pertama
Sebelumnya kita harus mendeklarasikan dulu pointer head :

TNode *head;

Setelah kita mendeklarasikan pointer head, kita belum bisa secara langsung mendeklarasikan node yang dituju. Sehingga pointer head harus dibuat bernilai null terlebih dahulu :

head = NULL;
untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat mengetahuinya dengan mengecek nilai dari pointer Head-nya.
int isEmpty() { if(head==NULL) return 1; else return 0;
}

Penggambaran :
head






Setelah dibuat node baru dan jika diketahui head==NULL :

head      baru




Bila kita membuat node baru lagi maka :
                                Baru                                       head
                                                                                                       

head






baru                             head




head




1.      Dengan Head dan tail
-   Menggunakan 2 pointer, head dan tail.
-   Head selalu menunjuk node pertama dan tail selalu menunjuk node terakhir
Sebelumnya kita harus mendeklarasikan dulu pointer head :

TNode *head, *tail;
Setelah kita mendeklarasikan pointer head, kita belum bisa secara langsung mendeklarasikan node yang dituju. Sehingga pointer head harus dibuat bernilai null terlebih dahulu :


untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat mengetahuinya dengan mengecek nilai dari pointer Tail-nya.
int isEmpty() { if(tail==NULL) return 1; else return 0;
}


Penggambaran :

head    tail




Setelah dibuat node baru dan jika diketahui tail==NULL :

Head tai baru

Bila kita membuat node baru lagi maka :

baru                      head   tail





head                              tail





                   Baru                           head                              tail



                       Head                                                               tail







B.     Non Circular dengan Head, head & tail

1.      Dengan Head
-          Menggunakan 1 pointer head
-          Head selalu menunjuk node pertama
Sebelumnya kita harus mendeklarasikan dulu pointer head :

TNode *head;

Setelah kita mendeklarasikan pointer head, kita belum bisa secara langsung mendeklarasikan node yang dituju. Sehingga pointer head harus dibuat bernilai null terlebih dahulu :

head = NULL;

untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat mengetahuinya dengan mengecek nilai dari pointer Head-nya.
int isEmpty() { if(head==NULL) return 1; else return 0;
}


Contoh program :

·         Penambahan di depan

void tambahdata (int databaru){
TNode *baru,*bantu;

//pointer bantu digunakan untuk menunjuk node terakhir (head->prev) baru = new TNode;

baru -> data = databaru; baru -> next = baru; baru
ead;

}
printf(”data masuk”);

}

Penggambaran :
head


Setelah dibuat node baru dan jika diketahui head==NULL : head baru


Bila kita membuat node baru lagi maka :

baru                    head       bantu




baru                    head       bantu


baru                    head       bantu






                     head             bantu






                    head              bantu




1.      Dengan Head dan tail
-   Menggunakan 2 pointer, head dan tail.
-   Head selalu menunjuk node pertama dan tail selalu menunjuk node terakhir
Sebelumnya kita harus mendeklarasikan dulu pointer head :

TNode *head, *tail;

Setelah kita mendeklarasikan pointer head, kita belum bisa secara langsung mendeklarasikan node yang dituju. Sehingga pointer head harus dibuat bernilai null terlebih dahulu :


untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat mengetahuinya dengan mengecek nilai dari pointer Tail-nya.
int isEmpty() { if(tail==NULL) return 1; else return 0;



    Penggambaran
.

                                                   
Setelah dibuat node baru dan jika diketahui tail==NULL :

                                                                  
Bila kita membuat node baru lagi maka :






                                                                                                                       
                                    Head       bantu
                                                                                       

                                           Head       bantu



Load disqus comments

0 comments