Selasa, 30 April 2013

Senarai (Linked List) Pascal

Praktikum Strukur Data

MODUL V

SENARAI (LINKED LIST)

Program Senarai Berantai :

Program Senarai_Berantai;

uses wincrt;

const garis ='---------------------------------------';

pesan ='Senarai Berantai Masih Kosong';

type simpul = ^data;

data   = record

nama : string;

alamat : string;

berikut : simpul;

end;

var

awal,akhir : simpul;

pilih : char;

cacah : integer;



function MENU : char;

var P : char;

begin

clrscr;

gotoxy(30,3); write('DAFTAR MENU PILIHAN');

gotoxy(20,8); write('A. MENAMBAH SIMPUL DI AWAL SENARAI');

gotoxy(20,9); write('B. MENAMBAH SIMPUL DI TENGAH SENARAI');

gotoxy(20,10); write('C. MENAMBAH SIMPUL DI AKHIR SENARAI');

gotoxy(20,11); write('D. MENGHAPUS SIMPUL PERTAMA');

gotoxy(20,12); write('E. MENGHAPUS SIMPUL DI TENGAH');

gotoxy(20,13); write('F. MENGHAPUS SIMPUL TERAKHIR');

gotoxy(20,14); write('G. MENCETAK ISI SENARAI');

gotoxy(20,15); write('H. SELESAI');

repeat

gotoxy(48,20); write('':10);

gotoxy(30,20); write('Pilih salah satu: ');

P := upcase(readkey);

until P in ['A'..'H'];

MENU := P;

end;



function SIMPUL_BARU : simpul;

var B : simpul;

begin

new(B);

with B^ do

begin

write('Nama  : '); readln(nama);

write('Alamat: '); readln(alamat);

berikut := nil;

end;

SIMPUL_BARU := B;

end;



procedure TAMBAH_AWAL (N : integer);

var

baru : simpul;

begin

if N <> 0 then

begin

writeln('MENAMBAH SIMPUL BARU DI AWAL SENARAI BERANTAI');

writeln(copy(garis,1,45));

end;

writeln;

baru := SIMPUL_BARU;

if awal=nil then

akhir:= baru

else

baru^.berikut := awal;

awal := baru;

end;



procedure TAMBAH_AKHIR (N : integer);

var

baru : simpul;

begin

if N <> 0 then

begin

writeln('MENAMBAH SIMPUL BARU DI AKHIR SENARAI BERANTAI');

writeln(copy(garis,1,46));

end;

writeln;

baru := SIMPUL_BARU;

if awal=nil then

awal := baru

else

akhir^.berikut := baru;

akhir := baru;

end;



procedure TAMBAH_TENGAH;

var baru,bantu : simpul;

posisi,i   : integer;

begin

writeln('MENAMBAH SIMPUL BARU DI TENGAH SENARAI BERANTAI');

writeln(garis); writeln;

writeln('SENARAI BERANTAI BERISI:',cacah:2,' SIMPUL');

repeat

gotoxy(52,5); write(' ');

gotoxy(1,5);  write('SIMPUL BARU AKAN DITEMPATKAN SEBAGAI SIMPUL NOMOR: ');

readln(posisi)

until posisi in [1..cacah+1];

if posisi=1 then TAMBAH_AWAL(0)

else if posisi=cacah+1 then TAMBAH_AKHIR(0)

else

begin

writeln;

baru := SIMPUL_BARU;

bantu:= awal;

for i:=1 to posisi-2 do

bantu := bantu^.berikut;

baru^.berikut := bantu^.berikut;

bantu^.berikut := baru;

end;

end;



procedure HAPUS_PERTAMA;

begin

if awal <> nil then

begin

awal := awal^.berikut;

writeln('SIMPUL PERTAMA TELAH TERHAPUS');

end

else

writeln(pesan);

writeln; writeln('TEKAN <ENTER> UNTUK KEMBALI KE MENU UTAMA');

repeat until keypressed

end;



procedure HAPUS_TERAKHIR;

var bantu : simpul;

H     : integer;

begin

if awal=nil then

begin

writeln(pesan);

H := 0;

end

else if awal=akhir then

begin

awal := nil;

akhir:= nil;

H := 1;

end

else

begin

bantu := awal;

while bantu^.berikut <> akhir do

bantu := bantu^.berikut;

akhir := bantu;

akhir^.berikut := nil;

H := 1;

end;

if H=1 then

writeln('SIMPUL TERAKHIR TELAH TERHAPUS'); writeln;

writeln('TEKAN <ENTER> UNTUK KEMBALI KE MENU UTAMA');

repeat until keypressed

end;



procedure HAPUS_TENGAH;

var posisi,i : integer;

bantu,bantu1 : simpul;

begin

if cacah=0 then

begin

writeln(pesan); writeln;

writeln('TEKAN <ENTER> UNTUK KEMBALI KE MENU UTAMA');

repeat until keypressed

end

else

begin

writeln('MENGHAPUS SIMPUL YANG ADA DI TENGAH');

writeln(copy(garis,1,35)); writeln;

writeln('SENARAI BERANTAI SEKARANG BERISI :',cacah:2,' SIMPUL');

repeat

gotoxy(37,5); write('':5);

gotoxy(1,5); write('Akan menghapus simpul nomor berapa: ');

readln(posisi);

until posisi in [1..cacah];

if posisi=1 then HAPUS_PERTAMA

else if posisi=cacah then HAPUS_TERAKHIR

else

begin

bantu := awal;

for i:=1 to posisi-2 do

bantu:= bantu^.berikut;

bantu1 := bantu^.berikut;

bantu^.berikut := bantu1^.berikut;

bantu1^.berikut := nil;

dispose(bantu1);

end;

end;

end;



procedure BACA_SENARAI;

var bantu : simpul;

i     : integer;

begin

i := 1;

writeln('MEMBACA ISI SENARAI BERANTAI');

writeln('TEKAN <ENTER> UNTUK KEMBALI KE MENU UTAMA');

writeln(copy(garis,1,42)); writeln;

bantu := awal;

if bantu=nil then

writeln(pesan)

else

while bantu <> nil do

begin

writeln('Simpul: ',i:2,'---> Nama  : ',bantu^.nama);

writeln('':15,'Alamat: ',bantu^.alamat);

bantu := bantu^.berikut;

inc(i);

end;

repeat until keypressed

end;



{PROGRAM UTAMA}

begin

cacah := 0;

awal := nil;

akhir := nil;

repeat

pilih := MENU;

clrscr;

case pilih of

'A' : TAMBAH_AWAL(1);

'B' : TAMBAH_TENGAH;

'C' : TAMBAH_AKHIR(1);

'D' : HAPUS_PERTAMA;

'E' : HAPUS_TENGAH;

'F' : HAPUS_TERAKHIR;

'G' : BACA_SENARAI;

end;

if pilih in ['A','B','C'] then inc(cacah)

else if (pilih in ['D','E','F']) and (cacah <> 0) then

dec(cacah)

until pilih='H'

end.

 Hasil :


Antrian (Queue) Pascal

Praktikum Strukur Data

MODUL IV

ANTRIAN (QUEUE)

Program SIMULASI PARKIR :


Program SIMULASI_PARKIR;

  uses wincrt;

  const Terus = 'Tekan sembarang tombol untuk terus';

  type Str10  = string[10];
       Antri  = ^simpul;
       Simpul = record
                  Info    : Str10;
                  Berikut : Antri
                end;

  var  Depan,                 
       Belakang    : Antri;   
       Pilih,                 
       P           : char;
       Keterangan  : string;
       No_Plat     : Str10;   


procedure INISIALISASI (var Front, Rear: Antri);

  begin
    new(Front);
    Front^.Info := chr(0);
    Front^.Berikut := Front;
    Rear := Front
  end;       


procedure MASUK (var Front, Rear : Antri;
                       No_Plat : Str10);
  var Baru : Antri;

  begin
    new(Baru);
    Baru^.Info := No_Plat;
    Baru^.Berikut := Front;
    Rear^.Berikut := Baru;
    Rear := Baru
  end;     

                                                           
procedure KELUAR
  (var Front, Rear : Antri;
                        NO_Plat : Str10);
  var Mobil, Bantu, TM : Antri;
      P                : char;
      Nomor            : integer;


function ADA_MOBIL
  (var Lok : Antri; D : Antri;
                         X : Str10) : boolean;
  var Ada : boolean;

  begin
    Ada := false;
    Lok := D^.Berikut;
    repeat
      if Lok^.Info = X then
         Ada := true
       else
         Lok := Lok^.Berikut
    until Ada or (Lok = D);
    ADA_MOBIL := Ada
  end;    

  begin     
    if not (ADA_MOBIL(Mobil, Front, No_Plat)) then
       begin
         gotoxy(40,9);
         writeln('MOBIL YANG DIMAKSUD TIDAK ADA');
         gotoxy(40,11);write(Terus);
         P := readkey
       end
    else
       if Mobil = Front^.Berikut then
       
          begin
            Front^.Berikut := Mobil^.Berikut;
            dispose(Mobil)
          end

       else
        
          begin
            Bantu := Front;
            clrscr;
            write ('Mobil yang dikeluarkan ');
            writeln('sementara:');
            write('------------------------');
            writeln('----------'); writeln;
            Nomor := 1;
            repeat
              Bantu := Bantu^.Berikut;
              write('Mobil ke', Nomor:3);
              write(',    Nomor Plat: ');
              writeln(Bantu^.Info);
              inc(Nomor);
            until Bantu^.Berikut^.Info = No_Plat;
            writeln; write(Terus);
            P := readkey;
            Bantu^.Berikut := Mobil^.Berikut;
            dispose(Mobil)
          end
  end;


procedure BACA_MOBIL (Front : Antri);
  var Bantu : Antri;
      Nomor : integer;
      P     : char;

  begin
    Bantu := Front^.Berikut;
    if Bantu = Front then
      
       begin
         gotoxy(1,4);
         write('TEMPAT PARKIR KOSONG'); writeln
       end
    else
      
       begin
         Nomor := 1;
         repeat
           write('Mobil ke',Nomor:3,',   Nomor');
           writeln(' Plat: ',Bantu^.Info);
           Bantu := Bantu^.Berikut;
           inc(Nomor)
         until Bantu = Front
       end
  end;      
  begin
    
     INISIALISASI(Depan,Belakang);

    
     repeat
       clrscr; writeln('SIMULASI TEMPAT PARKIR');
      
       write('---------------------------------');
       writeln('-------------');
       writeln; writeln('    M : Mobil Masuk');
       writeln('    K : Mobil Keluar');
       writeln('    C : Cetak Data Mobil');
       writeln('    S : Selesai');
       writeln; writeln('    PILIH SALAH SATU: ');

    
       repeat
         gotoxy(23,10); writeln('    ');
         gotoxy(23,10); Pilih := upcase(readkey);
       until Pilih in ['M','K','S','C'];

     
       case Pilih of
        'M' : Keterangan := 'MOBIL  MASUK';
        'K' : Keterangan := 'MOBIL KELUAR';
        'C' : begin
                clrscr;
                   write('Data Mobil di ');
                   writeln('Tempat Parkir');
                   write('--------------');
                   writeln('-------------'); writeln;
                BACA_MOBIL(Depan); writeln;
                   write('Tekan sembarang tombol ');
                   write('untuk kembali ke menu');
                P := readkey;
              end;
        'S' : begin
                clrscr;
                   writeln('SIMULASI SELESAI');
                   writeln('----------------')
              end

       end;
       if Pilih in ['M','K'] then
          begin
            gotoxy(40,5); writeln(Keterangan);
            gotoxy(40,6); writeln('------------');
               gotoxy(40,7);
               write('Nomor plat mobil: ');
                          readln(No_Plat);
               if Pilih = 'M' then
                  MASUK(Depan, Belakang,No_Plat)
               else
                  KELUAR(Depan,Belakang,No_Plat)
          end
     until Pilih = 'S'
  end.

 

 Hasil :