Linked list merupakan struktur data yang
memiliki kelebihan dalam efisiensi memori dan kecepatan dalam menyisipkan data.
Linked list berguna
untuk menyimpan beberapa data dalam memori. Komponen dasar dari suatu list
disebut sebagai node. Sebuah node terdiri dari dua buah bagian. Bagian pertama
adalah bagian yang memuat informasi data, bagian kedua adalah bagian yang
menunjukkan alamat data berikutnya atau disebut juga dengan bagian penunjuk.
Linked
List dengan Pointer
Pascal
menyediakan prosedur standar untuk membuat dan menghapus sebuah variabel
dinamis, yaitu new dan dispose. Jika P telah dideklarasikan
sebagai sebuah variabel pointer bertipe node, maka pernyataan new(P) akan
menciptakan sebuah variabel dinamis baru bertipe node dan menandai lokasinya
dengan pointer P. Sedangkan pernyataan dispose(P) akan mengembalikan ruang yang
digunakan pada lokasi yang ditunjuk P ke sistem komputer, pointer P menjadi
tidak terdefinisikan lagi.
Deklarasi Linked List
dengan Pointer
type
tipeinfo = record
nim : string;
nilai : integer;
end;
tipeptr = ^tipenode;
tipelist = tipeptr;
tipenode = record
info : tipeinfo;
next : tipeptr;
end;
var list : tipelist;
elemen-elemen
list berupa record yang memuat field berisi informasi data serta sebuah field
bertipe pointer yang berisi alamat elemen berikutnya.
Operasi pada Linked
List
1.
Membuat
List
Prosedur
ini berupa prosedur untuk membuat list pertama kali, yaitu mengalokasikan
pointer untuk head. Nilai awal dari list adalah kosong (nill).
Procedure
inisialisasi (var list : tipelist);
Begin
New(list);
List := nill;
End;
2.
Mengetahui
Panjang List (Jumlah Elemen)
Mengetahui
panjang list dilakukan dengan menghitung seluruh node. Caranya adalah
mengunjungi setiap node dan menaikkan nilai counter hingga dijumpai node
terakhir. Contoh fungsinya adalah :
Function
size (list : tipelist) : integer;
Var
i : integer;
Begin
i:=0;
while list <> nil do
begin
i:=i+1;
list := list^.next;
end;
size := i;
end;
3.
Menyisipkan
Node Baru
Menyisipkan
node baru pada list dilakukan dengan cara mencari lokasi tempat node baru akan
disisipkan, kemudian menyisipkan node baru tersebut. Hal ini dapat dilakukan
menggunakan bantuan sebuah pointer untuk mencari sebuah node yang akan
tersambung langsung dengan node baru. Kemudian, node baru dapat disisipkan pada
lokasi sebelum atau sesudah node tersebut. Sebagai contoh, prosedur berikut
adalah untuk menyisipkan node baru sebelum node :
Procedure
sisipnode (var list : lipelist; IB :
tipeinfo);
Var NB, ptr :
tipeptr;
Ketemu : Boolean;
Begin
New(NB);
NB^.info := IB;
NB^.next := nil;
If list = nil then list
:= NB
Else
If
IB.nim <= list^.info.nim then
Begin
NB^.next :=
list;
List := NB;
End
Else
Begin
Ketemu := false;
Ptr := list;
While (ptr^.next <> nil) and not (ketemu) do
Begin
If
ptr^.next^.info.nim >= IB.nim then
Ketemu
:= true;
Else ptr := ptr^.next;
End;
NB^.next :=
ptr^.next;
Ptr^.next := NB;
End;
End;
4.
Mengetahui
Nilai Informasi pada Suatu Node dalam List
Mengganti
nilai informasi hanya akan mengganti info pada suatu node tanpa menghapus node
tersebut. Hal ini dapat dilakukan dengan mencari node yang sesuai dengan nilai
yang akan diganti, selanjutnya mengganti nilai lama dengan nilai yang baru.
Berikut
ini contoh prosedur untuk mengganti nilai pada suatu list :
a. Mengganti
nilai mahasiswa berdasarkan nomor mahasiswa,
b. Mengganti
semua node yang mempunyai nilai tertentu (nilai lama) dengan nilai yang baru.
Procedure
gantinode1 (var list : tipelist;
kunciganti : string; nilaibaru : integer);
Var ptr : tipeptr;
Begin
New(ptr);
Ptr := list;
While
(ptr <> nil) and
(ptr^.info.nim <> kunciganti) do
Ptr := ptr^.next;
If
ptr <> nil then
Ptr^>info.nilai := nilaibaru;
End;
Procedure
gantinode2 (var list : tipelist;
nlama, nbaru : integer);
Var ptr : tipeptr;
Begin
New(ptr);
Ptr := list;
While
(ptr <> nil) do
Begin
If ptr^.info.nilai :=
nlama then
Ptr^.info,nilai :=
nbaru;
Ptr := ptr^.next;
End;
End;
5.
Menghapus
Node dari Suatu List
Menghapus
node adalah menghapus sebuah elemen dari list. Hal ini dapat dilakukan dengan
mencari/menandai node yang akan dihapus, kemudian mengarahkan pointer pada node
sebelumnya kea rah sesudah node yang akan dihapus dan kemudian menghapus node
yang dimaksud.
Procedure
hapusnode (var list : tipelist;
kuncihapus : string);
Var
ptr1, ptr2 : tipeptr;
Begin
New(ptr1);
New(ptr2);
Ptr1 := nil;
Ptr2 := nil;
While
(ptr2^.info.nim <> kuncihapus) do
Begin
Ptr1 := ptr2;
Ptr2 :=
ptr2^.next;
End;
If
ptr1 = nil then
List := list^.next
Else
Ptr1^.next := ptr2^.next
Dispose(ptr2);
End;
*****
program linked_list;
uses crt;
const
NULL=0;
type
tipeptr=^simpul;
simpul=record
nim:string[12];
nama:string[50];
next:tipeptr;
end;
var
pertama:tipeptr;
lg : char;
plh : char;
label 7;
procedure MENAMBAH;
var
Pbaru:tipeptr;
begin
repeat
new(Pbaru);
writeln('Tambah Data ');
writeln('--------------------------------');
write('Nama : '); readln(Pbaru^.nama);
write('Nim : ');
readln(Pbaru^.nim);
Pbaru^.next:=pertama;
pertama:=Pbaru;
write('Apakah ingin menambah data lagi (Y/T) :');readln(lg);
writeln;
clrscr;
until upcase(lg)
<> 'Y';
end;
procedure daftar;
begin
writeln(' DAFTAR DATA ');
writeln('___________________________________');
writeln(' NAMA |
NIM ');
writeln('___________________________________');
end;
procedure MENAMPILKAN(pertama:tipeptr);
var
Pbaru:tipeptr;
begin
Pbaru:=pertama;
while Pbaru
<> nil do
begin
writeln(Pbaru^.nama:10, Pbaru^.nim:22);
Pbaru:=Pbaru^.next;
end;
writeln('___________________________________');
end;
Procedure MENGHAPUS;
var
Pbaru:tipeptr;
begin
writeln('List pertama di hapus');
if pertama
= nil then
writeln('Senarai
telah kosong')
else if pertama<>nil then
begin
Pbaru:=pertama;
pertama:= pertama^.next;
dispose(Pbaru)
end;
end;
begin
7: clrscr;
writeln('----MENU LINKED LIST----');
writeln('========================');
writeln(' 1. INPUT DATA ');
writeln(' 2. HAPUS DATA ');
writeln(' 3. LIHAT DATA ');
writeln(' 4. KELUAR ');
writeln('========================');
write('Pilih
Menu ke : '); readln(plh);
case plh of
'1' : begin
clrscr;
pertama := nil;
MENAMBAH;
goto 7;
end;
'2' : begin
clrscr;
MENGHAPUS;
goto 7;
end;
'3' : Begin
clrscr;
daftar;
MENAMPILKAN(pertama);
writeln;
write('Tekan Enter untuk mengakhiri !');readln;
goto 7;
end;
'4' : exit;
end;
readkey;
end.
Tidak ada komentar:
Posting Komentar