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
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