Senarai berantai adalah struktur data dinamis yang menyimpan data secara berurutan dengan menggunakan pointer. Setiap node memiliki medan informasi dan link field yang menyimpan alamat node berikutnya. Operasi pada senarai berantai meliputi inisialisasi, penambahan node di ekor, penyisipan node berdasarkan urutan, penghapusan node tertentu, dan penghapusan seluruh isi senarai.
1. SENARAI BERANTAI ( LINKED LIST )
Cara lain untuk menyimpan sekumpulan data selain dengan menggunakan record
adalah dengan menggunakan bantuan tipe data pointer. Dalam hal ini, masing-masing data
dengan sebuah medan yang bertipe pointer perlu digunakan.
Salah satu struktur data dinamis yang paling sederhana adalah Senarai Berantai
(Linked List). Yaitu kumpulan komponen (node) yang disusun secara berurutan dengan
menggunakan bantuan pointer. Node ini terbagi menjadi dua bagian yaitu bagian medan
informasi, yang berisi informasi yang akan disimpan atau diolah dan bagian penyambung (link
field), yang berisi alamat simpul selanjutnya.
Operasi Pada Senarai Berantai :
Inisialisasi, yakni mengisi variabel senarai berantai.
Misalnya digunakan deklarasi sebagai berikut
type
TipeData = integer ;
TipeSenarai = ˆRecordSenarai ;
RecordSenarai = record
data : integer ;
next : TipeSenarai ;
end;
var
senaraiku : TipeSenarai ;
Contoh prosedur inisialisasi
procedure inisialisasi (var senarai : TipeSenarai ) ;
begin
senarai := NIL;
end;
Menambah simpul baru pada ekor.
Contoh prosedurnya
procedure tambahSimpul (baru : TipeData ; var senarai : TipeSenarai ) ;
var
pBaru, ekor: TipeSenarai;
begin
ekor := senarai;
if ekor <> NIL then
begin
new(pBaru);
pBaru^.data := baru;
pBaru^.next := nil;
while ekor^.next <> NIL do
ekor := ekor^.next ;
ekor^.next := pBaru;
end
else
begin
new(senarai) ;
senarai^.data := baru;
senarai^.next := nil;
end;
end;
Sewaktu menambah atau menghapus suatu simpul, pointer yang simpul tersebut
haruslah telah dipegang. Dalam one way-list biasanya yang perlu dipegang adalah pointer
sebelum simpul tersebut.
2. Ide penambahan simpul dalam prosedur tambahSimpul di atas adalah memeriksa ekor
apakah bernilai NIL. Jika tidak, berarti senarai yang akan ditambah simpulnya berada pada
keadaan inisialisasi (masih kosong), sedangkan jika ya, berarti senarai tersebut tidak lagi
kosong.
Jika senarai tersebut tidak kosong, maka dicari letak ekornya (dengan memeriksa apakah
simpul setelah simpul yang diamati bernilai NIL).
Setelah itu dibangun simpul baru dan digandengkan ke senarai. Sekarang ekor senarai
tersebut adalah simpul baru yang belum menunjuk apapun sedangkan jika tidak kosong,
maka cukup bangun sebuah simpul sebagai ekor. Setelah itu isi field data ekor dengan data
baru dan field next-nya dengan NIL.
Menyisipkan simpul baru.
Jika urutan data yang disimpan tidak dipermasalahkan maka prosedur tambahNode()
di atas sudah mencukupi untuk menyimpan data. Namun jika urutan data menjadi penting
(misalnya terurut ascending) maka prosedur penyisipan data pada lokasi yang tepat menjadi
diperlukan
Contoh prosedurnya
procedure sisipSimpul ( baru : TipeData ; var senarai : TipeSenarai ) ;
var p , pBaru : TipeSenarai ;
begin
if senarai = NIL then
begin
new(senarai) ;
senaraiˆ.data := baru ;
senaraiˆ.next := NIL;
end
else
begin
new(pBaru) ;
pBaruˆ.data := baru ;
pBaruˆ.next := NIL;
if baru < senaraiˆ.data then
begin
pBaruˆ.next := senarai ;
senarai := pBaru ;
end
else
begin
p := senarai ;
while (pˆ.next <> NIL) and (baru > pˆ.nextˆ.data ) do
p := pˆ.next ;
pBaruˆ.next := pBaru ;
end;
end;
end;
Dalam menyisipkan simpul baru ada tiga kemungkinan
i. Senarai dalam keadaan kosong —buat simpul baru
ii. Sisip di depan — arahkan ‘next’ simpul baru ke senarai lalu belokkan senarai ke simpul
baru.
iii. Sisip di tangah/belakang — dapatkan simpul yang tepat sebelum simpul baru akan
disisipkan, lalu arahkan ‘next’ simpul baru ke ‘next’ simpul tersebut kemudian arahkan ‘next’
simpul tersebut ke pointer baru.
Menghapus simpul yang berisi data tertentu
(a) Contoh prosedurnya
procedure hapusSimpul ( data : TipeData ; var senarai : TipeSenarai ) ;
var
p , q : TipeSenarai ;
d : TipeData ;
begin
if senarai <> NIL then
3. begin
p := senarai ;
if senaraiˆ.data = data then
begin
senarai := senaraiˆ.next ;
dispose (p);
end
else
begin
while (pˆ.next <> NIL) and (pˆ.nextˆ.data <> data ) do
p := pˆ.next ;
if pˆ.next <> NIL then
begin
q := pˆ.next ;
pˆ.next := qˆ.next ;
dispose (q) ;
end;
end;
end;
end;
Ada tiga kemungkinan dalam menghapus simpul
i. List kosong —tidak terjadi apa-apa.
ii. Hapus simpul di depan — pertama simpan senarai ke dalam pointer bantu lalu arahkan list
ke ‘next’ senarai dan dispose pointer bantu.
iii. Hapus simpul di tengah/belakang — mirip dengan hapus simpul di depan, hanya saja
pointer yang digunakan berasal dari simpul lain yang memiliki pointer ke simpul tersebut.
Menghapus seluruh isi senarai.
Dalam program yang baik, memori dibersihkan terlebih dahulu sebelum
program berhenti.
Contoh prosedurnya
procedure selesai (var senarai : TipeSenarai ) ;
var p : TipeSenarai ;
begin
while senarai <> NIL do
begin
p := senarai ;
senarai := senaraiˆ.next ;
dispose (p);
end;
end;