LAPORAN PRAKTIKUM ALGORITMA DAN STRUKTUR (10)

LAPORAN PRAKTIKUM
ALGORITMA DAN STRUKTUR DATA I
SENARAI BERANTAI/ LINKED LIST
Modul V

Disusun Oleh :
Syukur Jaya Mendrofa
201501072

Dosen Pengampu :
Oskar Ika Adi Nugroho S.T., MT

JURUSAN SISTEM INFORMASI
SEKOLAH TINGGI ILMU KOMPUTER (STIKOM)
“YOS SUDARSO”
PURWOKERTO
2016
BAB I
TEORI DASAR

SEJARAH SINGKAT LINK LIST

Dikembangkan tahun 1955-1956 oleh Allen Newell, Cliff Shaw dan Herbert Simon di
RAND Corporation sebagai struktur data utama untuk bahasa Information Processing
Language (IPL). IPL dibuat untuk mengembangkan program artificial intelligence, seperti
pembuatan Chess Solver.
Victor Yngve di Massachusetts Institute of Technology (MIT) juga menggunakan
linked list pada natural language processing dan machine transitions pada bahasa
pemrograman COMMIT.
PENGERTIAN LINK LIST
Linked list (list bertaut) adalah salah satu struktur data dasar yang sangat fundamental
dalam bidang ilmu komputer. Dengan menggunakan linked list maka programmer dapat
menimpan datanya kapanpun dibutuhkan. Linked list mirip dangan array, kecuali pada linked
list data yang ingin disimpan dapat dialokasikan secara dinamis pada saat pengoperasian
program (run-time).
Pada array, apabila programmer ingin menyimpan data, programmer diharuskan untuk
mendefinisikan besar array terlebih dahulu, seringkali programmer mengalokasikan array
yang sangat besar(misal 100). Hal ini tidak efektif karena seringkali yang dipakai tidak
sebesar itu. Dan apabila programmer ingin menyimpan data lebih dari seratus data, maka hal
itu tidak dapat dimungkinkan karena sifat array yang besarnya statik. Linked list adalah salah
satu struktur data yang mampu menutupi kelemahan tersebut.
Secara umum linked list tersusun atas sejumlah bagian-bagian data yang lebih kecil

yang terhubung (biasanya melalui pointer). Linked list dapat divisualisasikan seperti kereta,
bagian kepala linked list adalah mesin kereta, data yang disimpan adalah gerbong, dan
pengait antar gerbong adalah pointer.
Programmer membaca data menyerupai kondektur yang ingin memeriksa karcis
penumpang. Programmer menyusuri linked list melalui kepalanya, dan kemudian berlanjut ke
gerbong (data) berikutnya, dan seterusnya sampai gerbong terakhir (biasanya ditandai dengan
pointer menunjukkan alamat kosong (NULL)). Penyusuran data dilakukan secara satu persatu
sehingga penyusuran data bekerja dengan keefektifan On. Dibandingkan array, ini merupakan
kelemahan terbesar linked list. Pada array, apabilan programmer ingin mengakses data ke-n
(index n), maka programmer dapat langsung mengaksesnya. Sedangkan dengan linked list
programmer harus menyusuri data sebanyak n terlebih dahulu.

JENIS-JENIS LINKED LIST


Singly linked list



Double linked list




Circular Linked List

Linked list (one way list) adalah suatu kumpulan elemen data (yang disebut sebagai node)
dimana urutannya ditentukan oleh suatu pointer.
Setiap elemen (node) dari suatu linked list terdiri atas dua bagian, yaitu :
o INFO, berisi informasi tentang elemen data yang bersangkutan.
o NEXT (link field/next pointer field), berisi alamat dari elemen (node) selanjutnya
yang dituju.
Berikut ini sebuah contoh linked list yang terdiri atas 4 node :
start

info

next

info


next

info

next

info

next
null

node ke-1

node ke-2

node ke-3

node ke-4

Pada node ke-4 field NEXT-nya berisi NULL, artinya node ke-4 tsb. adalah node terakhir.

Node-node dalam linked list tidak harus selalu digambarkan paralel seperti pada gambar
diatas. Linked list pada contoh diatas dapat pula digambarkan seperti berikut ini :
info

info

next

next
null
info

next
info

next

CATATAN :
Ada dua hal yang menjadi kerugian dengan representasi suatu data dengan linked list ini,
yaitu

a. Diperlukan ruang tambahan untuk menyatakan/tempat field pointer.
b. Diperlukan waktu yang lebih banyak untuk mencari suatu node dalam linked list.
Sedangkan keuntungannya adalah :
a. Jenis data yang berbeda dapat di-link.
b. Operasi REMOVE atau INSERT hanya dilakukan dengan mengubah pointer-nya Saja.

OPERASI DASAR PADA LINKED LIST.

Ada beberapa aturan yang didefinisikan pada operasi didalam linked list, yaitu :
Jika P adalah suatu variabel pointer, maka nilainya adalah alamat atau lokasi dari variabel lain
yang dituju.
Operasi yang didefinisikan pada suatu variabel pointer adalah :
1. Test apakah sama dengan NULL.
2. Test untuk kesamaan dengan variabel pointer lain.
3. Menetapkan sama dengan NULL.
4. Menetapkan menuju ke node lain.
Notasi yang didefinisikan sehubungan dengan operasi diatas adalah :
1. NODE(P), artinya node yang ditunjuk oleh pointer P.
2. INFO(P), artinya nilai INFO dari node yang ditunjuk pointer P.
3. NEXT(P), artinya hubungan (link) selanjutnya dari node yang ditunjuk oleh

pointer P.
Sebagai contoh, perhatikan linked list dibawah ini :
info
start

info

next

next
info

B

A

next

C


node ke-2
node ke-1

node ke-3

P

info

next

D

null

node ke-4

NODE(P) = node yang ditunjuk oleh P yaitu node pertama.
INFO(P) = A
NEXT(P) = node ke-dua

INFO(NEXT(NEXT(P))) = C
MENGHAPUS SUATU NODE DARI LINKED LIST (REMOVE).
Untuk menghapus node dalam linked list digunakan procedure FREENODE.
Jika Q adalah suatu variabel pointer, maka FREENODE(Q) akan menyebabkan node yang
ditunjuk oleh variabel pointer Q dihapus dari linked list.
Perhatikan linked list berikut :
langkah ke-1 :
Q := Next(P)
info

next

info

P

next

info


Q

next

info

next
...

langkah ke-2 :

Next(P) := Next(Q)
info

next

info

next


info

P

next

info

next

Q

langkah ke-3 :
Freenode(Q)
procedure Freenode(Q)
1. Next(Q) := Avail
Q

info

next

Avail

info

next

next

info
...

next
null

P

2. Info(Q) := Null
3. Avail := Q
Q

next

Avail

next

info

next

info
...

next
null

MENYISIPKAN SUATU NODE KE DALAM LINKED LIST
Untuk menyisipkan node dalam linked list digunakan procedure GETNODE.
Jika NEW adalah suatu variabel pointer, maka GETNODE(NEW) akan menyebabkan node
yang ditunjuk oleh variabel pointer NEW disisipkan ke dalam linked list.
procedure Getnode(NEW)
if Avail = Null

then out-of-free-space


else

Avail



begin
Getnode := Avail;
info

next

info

next

info

next

info

next

...

null

Avail := Next(Avail);
Getnode

info

next

info

next

info

next

info
...

next
null

Avail



Next(Getnode) : = Null;
end;
Getnode

info

next

info

Avail

next

info

next

null

Algoritma menyisipkan sebuah Node :
1. Getnode(NEW);
2. Info(NEW) := Name;
NEW

info

next

Name

next

info

null

next

info

next

...

P

Q

3. Q := Next(P)
4. Next(P) := NEW
NEW

info

next

Name

next

info

null

next

info
...

P

info
...

Q

next

next
null

5. Next(NEW) := Q
NEW

info

next

Name

next

info

next

P

info

next

Q

Logika Linked List pada Array
1. Jika tidak menggunakan logika linked list (pada umumnya dalam meng-input data
digunalan cara sequential)
Awal
1
2
3
4

Insert E

A
C

1
2
3
4

Delete
E
1
A
2
3
4
F

Delete
C
1
A
2
3
E
4

A
C
E

Insert
F
1
A
2
3
E
4
F

Insert G
(overflo
w)
1
A
2
3
4
F

2. Jika menggunakan logika Linked List

1
2
3
4

Keadaan awal
Info
Nex
t
A
2
C
0
4
0

1
2
3
4

Insert F
Info
Ne
xt
A
3
F
0
E
2
0

1
2
3
4

Insert E
Info
Nex
t
A
2
C
3
E
0
0

1
2
3
4

Delete E
Info
Ne
xt
A
2
F
0
4
0

1
2
3
4

Delete C
Info
Nex
t
A
3
4
E
0
0
Insert G
Info

1
2
3
4

A
F
G

Ne
xt
2
3
0

Circular Linked List
first

info

next

info

next

info

next

info

next

info

next

...

Head Nodes
Head

info

next

info

next

info

next
...

Circular Linked List dengan Head Node
Head

info

next

Circular Linked List dengan Head Node kosong
Algoritma penyisipan node yang berisi variabel Name pada head dalam Linked List





Ambil node baru pada free storage kemudian node tersebut ditunjuk oleh pointer
NEW
Isikan Info dengan Name pada node baru tsb.
Next dari node baru tsb. menunjuk ke node yang ditunjuk oleh pointer Head
Pindahkan pointer Head menunjuk ke node yang baru.

Doubly Linked List
Head

prior info next
...

Tiap node memiliki pointer yang menunjuk ke node sesudahnya dan pointer yang menunjuk
ke node sebelumnya.
Node Sesudahnya : Next(Node)
Node sebelumnya : Prior(Node)
Next(Prior(P)) = P dan P = Prior(next(P))

Double Linked List Kosong :
prior

head
next

prior head next

Prior(Head) = Head
Next(Head) = Head

Procedure menghapus sebuah node pada Double Linked List
1. Set pointer P
prior info next

P

2. Ubah pointer pada node Next predecessor P ke node Successor P

prior info next

P

3. Ubah pointer pada node dari prior Successor P ke node Predeccssor P

prior info next

P

4. bebaskan node yang ditunjuk pointer P
Penyisipan sebuah Node pada Doubly Linked List



Ambil sebuah node baru dan isikan datanya
Set pointer dari Next node baru menunjuk ke Successor P dan pointer Proirnya ke P

P

NEW

IN
AVAIL




Ubah pointer Next P menunjuk ke node baru
Ubah pointer Prior dari Successor P menunjuk ke node baru
P

NEW

IN
AVAIL

BAB II
ANALISA PROGRAM
PROGRAM 1
#include
#include //file header ini tidak berfungsi (bisa dihapus)
using namespace std;
class Simpul
{
public:
int iData; //item data
double dData; //item data
//pointer ke Simpul berikutnya
Simpul* pBrktnya;
Simpul(int id, double dd) : //konstruktor
iData(id), dData(dd),pBrktnya(NULL)
{}
void tampilSimpul() //menampilkan Simpul
{
cout pBrktnya; //bergerak ke simpul berikutnya (untuk memproses pSkrg)
Kemudian Fungsi utama pada program ini :
int main()
{ //menciptakan senarai berantai baru
SenaraiBerantai senaraiBerantai; variabel senaraiBerantai bertipe SenaraiBerantai.
senaraiBerantai.sisipPertama(22, 2.99); //menyisipkan empat item
senaraiBerantai.sisipPertama(44, 4.99);
senaraiBerantai.sisipPertama(66, 6.99);
senaraiBerantai.sisipPertama(88, 8.99);
tanda titik (.) merupakan sebuah operator yang berfungsi untuk mengakses anggota
(operator akses anggota public dari luar kelas).
senaraiBerantai.tampilSenarai(); //menampilkan senaraiBerantai dengan mengakses
fungsi tampiSenarai ( ).
while (!senaraiBerantai.apaKosong()) //sampai kosong, senaraiBerantai fungsi bool
apaKosong() tidak true.
{

//membaca simpul pertama

Simpul* pTemp = senaraiBerantai.bacaPertama();//menampilkan kuncinya. pTemp sebuah
pointer
bertipe
simpul,
didalam
pTemp
menyimpan
nilai
fungsi
senaraiBerantai.bacaPertama();
cout pBrktnya; //mengubah simpul pertama
else //sebaliknya,
pSblmnya->pBrktnya = pSkrg->pBrktnya;
delete pSkrg; //menghapus simpul
return true; //penghapusan berhasil
}
void tampilSenarai()
{
cout tampilSimpul(); //menampilkan data
//bergerak ke simpul berikutnya
pSkrg = pSkrg->pBrktnya;
}
cout pBrktnya = pSkrg->pBrktnya;
delete pSkrg; //menghapus simpul
return true; //penghapusan berhasil
void tampilSenarai()
cout tampilSimpul(); //menampilkan data
//bergerak ke simpul berikutnya
pSkrg = pSkrg->pBrktnya;
Beberapa operasi dasar pada program ini adalah sebagai berikut :
1. Pencarian senarai untuk menentukan apakah item tertentu berada di dalam senarai.
2. Penghapusan sebuah item dari senarai berantai
Kedua operasi ini memerlukan penjelajahan senarai berantai, yaitu jika diberikan sebuah
pointer yang menunjuk ke simpul pertama pada senarai berantai, maka harus melangkah
melalui simpul-simpul senarai berantai.
PROGRAM 3
#include
#include //file header ini tidak berfungsi (bisa dihapus)
using namespace std;
class Simpul
{
public:
double dData; //item data
//ptr ke simpul berikutnya dalam senarai
Simpul* pBrktnya;
Simpul(double d) : dData(d), pBrktnya(NULL) //konstruktor
{}
void tampilSimpul() //menampilkan simpul
{
cout pBrktnya = pPertama;
pPertama = pSimpulBaru;
}
//menyisipkan di akhir senarai
void sisipAkhir(double dd)
{ //menciptakan simpul baru
Simpul* pSimpulBaru = new Simpul(dd);
if( apaKosong() ) //jika senarai kosong,
pPertama = pSimpulBaru;
else
pAkhir->pBrktnya = pSimpulBaru;
pAkhir = pSimpulBaru;
}
void hapusPertama() //menghapus simpul pertama
{ //(diasumsikan tak-kosong)
Simpul* pTemp = pPertama; //mengingat simpul pertama
//jika hanya ada satu simpul
if(pPertama->pBrktnya == NULL)
pAkhir = NULL; //NULL pBrktnya;
delete pTemp; //menghapus
}
void tampilSenarai()
{
cout tampilSimpul(); //menampilkan data
pSkrg = pSkrg->pBrktnya; //ke simpul brktnya
}
cout pBrktnya = pSimpulBaru;
pAkhir = pSimpulBaru;
void hapusPertama() //menghapus simpul pertama
Simpul* pTemp = pPertama; //mengingat simpul pertama
//jika hanya ada satu simpul
if(pPertama->pBrktnya == NULL)
pAkhir = NULL; //NULL pBrktnya;
delete pTemp; //menghapus
void tampilSenarai()

cout tampilSimpul(); //menampilkan data
pSkrg = pSkrg->pBrktnya; //ke simpul brktnya
Kemudian fungsi utama dalam program ini :
SenaraiBerantaiGanda senarai; //menciptakan senarai baru (variabel baru bertipe
SenaraiBerantaiGanda)
senarai.sisipPertama(22); //menyisipkan di depan
senarai.sisipPertama(44);
senarai.sisipPertama(66);
senarai.sisipAkhir(11); //menyisipkan di belakang
senarai.sisipAkhir(33);
senarai.sisipAkhir(55);
senarai.tampilSenarai(); //menampilkan senarai
cout