Rabu, 30 April 2014

LINKED LIST


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:

Domo-kun Staring