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
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 :
pointer next
Sedangkan pada materi yang ada
sekarang, kita akan menambahkan satu lagi pointernya. Sehingga bila kita lihat
ilustrasinya :
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
:
Setelah dibuat node baru dan jika
diketahui head==NULL :
head baru
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 :
Bila kita membuat node baru lagi
maka :
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 :
0 comments