Modul Struktur Data(teori)

MODUL STRUKTUR DATA

ADI PRATOMO NIP.19750925 200912 1 002

KEMENTERIAN PENDIDIKAN NASIONAL POLITEKNIK NEGERI BANJARMASIN JURUSAN ADMINISTRASI BISNIS BANJARMASIN

2010

BAB I JENIS-JENIS DATA

Suatu koleksi/ kelompok data yang dapat dikarakterisasikan oleh organisasi serta operasi yang didefinisikan terhadapnya.

Data di kategorikan menjadi :

1. Tipe data tunggal (data primitif) : Integer, Real, Boolean dan Karakter

2. Tipe data majemuk (data campuran)

: String (Untai)

Struktur data di kategorikan menjadi :

1. Struktur Data sederhana : Array dan Record

2. Struktur Data majemuk

: Linier dan Non Linier

1.1 TIPE DATA TUNGGAL

1.1.1 INTEGER

Suatu integer adalah anggota dari himpunan bilangan : ( ....., -(n+1), -n, ....., -2, -1, 0, 1, 2, ....., n, n+1, ..... ) Operasi-operasi dasar yang ada dalam integer antara lain :

 Penjumlahan  Pengurangan  Perkalian  Pembagian  Perpangkatan, dsb

Masing-masing operator pada operasi di atas, yang bekerja terhadap sepasang integer (operand) disebut sebagai "binary operator". Sedangkan operator yang hanya bekerja terhadap satu operand saja disebut sebagai "unary operator". Contoh dari unary operator adalah operator negasi. Operator ini berfungsi untuk mengubah tanda suatu operand.

1.1.2 REAL

Data numerik yang bukan termasuk integer, digolongkan dalam jenis data real. Jenis data ini ditulis menggunakan titik desimal (atau koma desimal). Bilangan real dimasukkan ke dalam memori komputer memakai sistem floating point, merupakan versi yang disebut Scientific Notation. Disini penyajiannya terdiri atas dua bagian, yaitu : mantissa (pecahan) & eksponen. Contoh :

6 Di dalam sistem desimal, bilangan 123000 = 0.123 * 10 . Disini 0.123 adalah mantissa (pecahan), sedangkan 6 adalah eksponennya.

Secara umum suatu bilangan real X dituliskan M * RE

1.1.3 BOOLEAN

Jenis data ini disebut juga jenis data "logical". Elemen dari jenis data ini mempunyai nilai salah satu dari "true" atau "false". Operator-operator yang dikenal pada jenis data ini terdiri atas:

1. Operator Logika, yaitu : NOT, AND dan OR.  Operator OR akan menghasilkan nilai "true", jika salah satu atau

kedua operand bernilai "true".  Operator AND akan menghasilkan nilai "true", jika kedua operand bernilai "true".  Sedangkan operator NOT akan menghasilkan nilai "true", jika operand bernilai "false", dan sebaliknya.  Operator NOT merupakan "precedence" dari operator AND dan OR.

Dalam suatu ekspresi yang tidak menggunakan tanda kurung, operator NOT harus dievaluasi sebelum operator AND dan OR.

2. Operator Relasional, yaitu : >, <, >=, <=, <> dan =.

1.1.4 KARAKTER

Jenis data karakter merupakan elemen dari suatu himpunan simbol aksara yang terdiri atas bilangan, abjad dan simbol-simbol khusus

1.1.5 STRING

Jenis data string merupakan jenis data campuran, karena elemen- elemennya dibentuk dari karakter-karakter di atas. String adalah barisan hingga simbol yang diambil dari himpunan karakter. Karakter yang digunakan untuk membentuk suatu string disebut sebagai alphabet. Dalam penulisannya, suatu string berada dalam tanda "aphosthrope". Contoh :

Misal, diberikan himpunan alphabet A = { C, D, 1 } String-string yang dapat dibentuk dari alphabet di atas antara lain adalah : 'CD1', 'CDD', 'DDC', 'CDC1', ...dsb, termasuk "null string" atau "empty string".

Himpunan yang anggotanya adalah semua string yang dapat dibentuk dari suatu himpunan alphabet disebut sebagai "vocabulary". Suatu vocabulary V yang

dihasilkan dari himpunan alphabet A dinotasikan dengan VA atau A*. Jika suatu string dibentuk dari alphabet {0,1}, maka string yang terbentuk disebut dengan "Bit String". Secara umum, suatu string S yang dibentuk dari himpunan alphabet A, dituliskan S = 'a 1 a 2 ..... a N ' , di mana setiap karakter a i anggota A untuk, 1  i  N.

Dalam suatu string terdapat beberapa operasi utama, yaitu :

Nilai dari operasi ini adalah suatu integer yang menunjukkan panjang dari suatu string. Panjang dari string didefinisikan sebagai banyaknya karakter, atau dapat ditulis : S = N atau Length (S) = N.

Contoh :

a. Jika diberikan string S = 'a 1 a 2 ..... a N '. Maka LENGTH(S) = N.

b. Jika diberikan string S = 'ABCD13AB', maka LENGTH(S) = 8.

1.1.5.2 CONCATENATION

Operasi ini bekerja terhadap dua string dan hasilnya merupakan resultan dari kedua string tersebut. Operasi ini hampir sama dengan operasi gabungan. Jika S 1 dan S 2 masing-masing adalah suatu string, maka bentuk operasi concatenation

dinotasikan dengna : CONCAT(S 1 ,S 2 ).

Contoh :

Misal S 1 = 'a 1 a 2 ..... a N ' dan S 2 = 'b 1 b 2 ..... b M ' Maka CONCAT(S 1 ,S 2 )='a 1 a 2 ..... a N b 1 b 2 ..... b M '

Panjang dari string yang baru (resultan) merupakan jumlah panjang dari masing- masing string atau :

LENGTH(CONCAT(S 1 ,S 2 )) = LENGTH(S 1 ) + LENGTH(S 2 )

1.1.5.3 SUBSTRING

Operasi ini adalah operasi membentuk string baru, yang merupakan bagian dari string yang diketahui. Notasinya adalah : SUBSTR(S,i,j) di mana :

S = string yang diketahui.

i dan j adalah integer

i = posisi awal substring, 0  i  LENGTH(S) j = banyak karakter yang diambil, 0  j  LENGTH(S) dan 0  i+j-1 LENGTH(S) Contoh :

Diberikan S = 'a 1 a 2 ..... a N ' ; i = 2 ; j = 4. Maka SUBSTR(S,i,j) = SUBSTR(S,2,4) = 'a 2 a 3 a 4 a 5 '

Catatan :

1. LENGTH(SUBSTR(S,i,j)) = j

2. SUBSTR(CONCAT(S 1 ,S 2 ),1,LENGTH(S 1 )) = S 1

3. SUBSTR(CONCAT (S 1 ,S 2 ),LENGTH(S 1 )+1,LENGTH(S 2 )) = S 2

1.1.5.4 INSERT

Operasi ini adalah untuk menyisipkan suatu string ke dalam string lain. Bentuk umumnya adalah : INSERT(S 1 ,S 2 ,i). S 1 dan S 2 masing-masing adalah

suatu string dan i adalah posisi awal S 2 pada S 1 .

Contoh : Misalkan:

S 1 = 'a 1 a 2 ..... a N ' S 2 = 'b 1 b 2 ..... b M '

INSERT(S 1 ,S 2 ,3) = 'a 1 a 2 b 1 b 2 ..... b M a 3 a 4 ..... a N '

1.1.5.5 DELETE

Operasi ini digunakan untuk menghapuskan sebagian karakter dalam suatu string. Bentuk umumnya adalah : DELETE(S,i,j) Maksudnya adalah menghapuskan sebagian karakter dalam string S, mulai dari posisi i dengan panjang j. Contoh :

Diberikan string S = 'a 1 a 2 ..... a N '

DELETE(S,3,4) = 'a 1 a 2 a 7 a 8 ..... a N '

Catatan :

INSERT(S 1 ,S 2 ,i) = CONCAT(CONCAT (SUBSTR(S 1 ,1,i-1),S 2 ), SUBSTR(S 1 ,i,LENGTH(S 1 )-(i-1))) DELETE(S,i,j)=CONCAT(SUBSTR(S,1,i-1),SUBSTR(S,i+j,LENGTH(S)-(i+j-

1))) di mana :

1  i  LENGTH(S 1 )

0  i  LENGTH(S 1 )

0  i+j-1  LENGTH(S 1 ) Untuk i,j integer.

1.2 DEKLARASI DATA DALAM BAHASA PEMROGRAMAN

 PASCAL Var

Count : integer; Switch : boolean; Betha : char; Alamat : packed array[1..25] of char;

1.3 PEMETAAN KE STORAGE

1.3.1 INTEGER

Bentuk mapping ke storage dari integer dapat dilakukan dengan beberapa cara, yaitu :

1. Skema Sign dan Magnitude

2. Skema One's Complement

3. Skema Two's Complement

a. Skema Sign and Magnitude

Cara ini merupakan bentuk konvensional yang digunakan manusia untuk menyatakan suatu bilangan dalam bentuk biner. Di sini representasi bilangan positif dan negatif hanya dibedakan dengan tanda saja. Biasanya tanda positif atau negatif ditunjukkan oleh digit terdepan dari bentuk binernya, untuk representasi dengan jumlah digit tertentu. Contoh :

+ 7 à + 111 à representasi dengan 4 digit : 0111 - 7 à - 111 à representasi dengan 4 digit : 1111

Dengan cara ini kita akan mendapatkan kesulitan dalam menentukan tanda pada saat melakukan operasi terhadap dua bilangan yang berbeda tandanya.

b. Skema Two's Complement dan One's Complement

Kedua skema ini merupakan cara yang digunakan untuk mengatasi kesulitan yang telah disebutkan di atas. Diberikan bilangan integer non negatif X, X' dan R. Didefinisikan bahwa X' adalah komplemen dari X relatif terhadap R, Kedua skema ini merupakan cara yang digunakan untuk mengatasi kesulitan yang telah disebutkan di atas. Diberikan bilangan integer non negatif X, X' dan R. Didefinisikan bahwa X' adalah komplemen dari X relatif terhadap R,

Skema Two's Complement menggunakan R = 2N. Skema One's Complement menggunakan R = 2N - 1.

Contoh : Misal diberikan integer = 7, akan dicari bentuk binernya dengan skema Two's Complement untuk representasi 4 digit.

X = 7 ; R = 24 ; à X + X' = R

X' = R - X = 24 - 7

= 16 - 7 = 9 à dalam biner = 1001

1.3.2 KARAKTER

Saat ini banyak sekali skema yang digunakan untuk merepresentasikan karakter dalam storage. Pada umumnya skema yang paling banyak digunakan adalah :

1. Extended Binary Coded Decimal Interchange Code (EBCDIC)

2. American Standard Code for Information Interchange (ASCII)

Pada skema EBCDIC digunakan kode 8 bit untuk menyatakan sebuah karakter. Jika dihitung, kemungkinan kombinasi seluruhnya adalah : 28. Sedangkan skema

ASCII menggunakan kode 7 bit untuk menyatakan suatu karakter. Skema ini mempunyai jumlah kemungkinan kombinasi yang lebih sedikit jika dibandingkan dengan skema EBCDIC. Selain dua skema tersebut di atas ada sebuah skema yang disebut dengan kode Huffman. Pada cara ini, jumlah bit yang digunakan tergantung dari frekuensi penggunaan suatu karakter.

1.3.3 STRING

Untuk mengetahui bentuk mapping pada storage dari suatu string, perlu diketahui beberapa hal yang menyangkut ruang untuk string yang bersangkutan, antara lain :

- letak posisi awal (start) dan posisi akhir (terminal) - suatu pointer yang menunjukkan lokasi pada storage

Ada tiga cara yang umum digunakan untuk mapping suatu string ke dalam storage. Misal diberikan dua string, yaitu : S 1 = 'ABCDEFG' dan S 2 = 'BCD'

a. Cara ke-1

Jika diberikan suatu informasi tentang :

- nama string - starting address - panjang string

Contoh :

Nama String

Maka secara fisik bentuk formatnya pada storage adalah :

A B C D E F G Ptr2

Ptr1 Ptr1

Jika diberikan informasi sebagai berikut :

- nama string - starting address - terminal address

Misalnya diberikan tabel sbb :

Nama String

Ptr1s

Ptr1t

String2

Ptr2s

Ptr2t

Maka secara fisik bentuknya pada storage adalah :

A B C D E FG B C D

Ptr1s

Ptr2s

Ptr1t

Ptr2t

atau

A B C D E F G Ptr2s

Ptr1s

Ptr2t

Ptr1t

c. Cara ke-3

Jika diberikan informasi :

- nama string - starting address - suatu tanda yang menunjukkan batas string

Misalnya :

Nama String

Start

String1

Ptr1

String2

Ptr2

Maka bentuknya secara fisik pada storage adalah :

Ptr1

Ptr2

Selain cara-cara di atas, representasi suatu string pada storage dapat pula dalam bentuk packed atau unpacked. Suatu string yang direpresentasikan dalam bentuk packed terbagi atas beberapa word. Banyaknya karakter untuk masing- masing word tergantung dari kode yang digunakan oleh mesin (bitnya). Secara umum jumlah word yang digunakan untuk merepresentasikan string S dalam storage dengan R karakter per word adalah :

LENGTH(S)

notasi

disebut dengan ceiling function

Contoh : Misal diberikan string S = "StrukturData", direpresentasikan dalam 4 karakter per word dalam bentuk packed. Maka secara fisik dapat digambarkan :

Stru ktur

Data

Jumlah Word : 3, Jumlah Karakter/Word : 4

Sedangkan cara unpacked, setiap word terdiri hanya satu karakter, berarti jumlah word yang diperlukan untuk merepresentasikan suatu string S adalah

LENGTH(S).

Contoh : Diberikan string S = "StmikAsia". Representasinya dalam bentuk unpacked adalah :

BAB II ARRAY DAN RECORD

Sebuah array dapat dikatakan sebagai suatu himpunan terurut dengan elemen- elemen homogen. Terurut, dimaksudkan bahwa elemen pertama, elemen kedua, dst masing-masing dapat diidentifikasi. Sedangkan homogen berarti masing-masing elemen tersebut mempunyai tipe data yang sama. Array dapat dikelompokkan atas 2 bagian, yaitu :

1. Array satu dimensi.

2. Array multi dimensi.

2.1 ARRAY SATU DIMENSI

Bentuk array yang paling sederhana adalah array satu dimensi. Array jenis ini dapat dianggap sebagai sebuah vektor. Suatu array A berdimensi satu dengan N buah elemen, secara fisik dapat digambarkan sebagai berikut :

A(1) A(2) .....

A(I)

..... A(n)

Indeks dari elemen suatu array menyatakan posisinya dalam urutan secara umum suatu array A berdimensi satu dengan elemen berjenis data T yang mempunyai indeks dari L s/d U dituliskan sbb: A(L:U) = {A(I)} Untuk I = L, L+1, L+2, ................., U-1, U, dimana masing-masing A(I) berjenis data T. L disebut sebagai batas bawah dari indeks A dan U sebagai batas atas dari A. Jumlah elemen dalam suatu array disebut sebagai range. Range dari array A(L:U) adalah U - L + 1. Range dari array B(1:N) adalah N - l + 1= N.

2.2 ARRAY MULTI DIMENSI

Array dua dimensi adalah salah satu contoh dari array jenis multi dimensi (dimensi banyak). Array ini elemen-elemennya merupakan array pula. Bentuk yang dianggap dapat mewakili array dua dimensi ini adalah matriks. Suatu array B yang Array dua dimensi adalah salah satu contoh dari array jenis multi dimensi (dimensi banyak). Array ini elemen-elemennya merupakan array pula. Bentuk yang dianggap dapat mewakili array dua dimensi ini adalah matriks. Suatu array B yang

Array ini dituliskan : B(1:M,1:N) = {B(I,J)},

Untuk I = 1,2,...,M J = 1,2,...,N

Jumlah elemen (range) dari array B ini adalah M x N. Secara umum, array 2 dimensi B dengan batas bawah indeks pertama L1, batas atas

indeks pertama U1, batas bawah indeks kedua L2 batas atas indeks kedua U 2 , dituliskan:

B(L1 : U1, L2 : U2) = {B(I,J)}

Untuk L1 < I < U1 dan L 2 < J < U2 Jumlah elemen baris dari array B adalah : ( U 2 –L 2 +1)

Jumlah elemen kolom dari array B adalah : ( U1 - L1 + 1)

Jumlah total elemen array B adalah : (U 2 –L 2 + 1 )(U1 - L1 + 1)

2.2.1 CROSS SECTION

Yang dimaksud dengan Cross section dari array 2 dimensi adalah suatu himpunan yang anggotanya adalah elemen-elemen dalam satu baris saja atau satu kolom saja. Notasinya menggunakan *. Contoh : Misal diberikan array B(1:M,1:N).

 B(4,*) = {B(4,1), B(4,2), ...,B(4,N)} B(*,4) = {B(1,4), B(2,4), ...,B(M,4)}

2.2.2 TRANSPOSE

Transpose dari suatu array dua dimensi, adalah suatu array dua dimensi pula dengan menukar posisi indeksnya. Transpose dari array berukuran M x N adalah suatu

array berukuran N x M. Transpose dari suatu array dari B dinotasikan dengan BT, dan didefinisikan: B(I,J) = BT (J,I)

Selanjutnya secara umum, suatu array A berdimensi N dapat dituliskan sbb:

A(L1:U1,L2:U2,...,LN:UN)

Jumlah elemen array ini adalah :

(U1 - L1 + 1)(U2- L2+ 1)... (UN - LN + 1)  (UK - LK + 1)

k=1

Sebagai contoh perhatikan sebuah array berdimensi 3 yang menggambarkan (berisi) jumlah mahasiswa STMIK Asia untuk kelas reguler dan eksekutif. Array ini dapat digambarkan sbb :

Jika array ini diberi nama Asia, maka bentuknya dapat dituliskan sbb: Asia(1:2,1:2, A:E) = {Asia(i,j,k)} dimana

I = 1,2 (1 = pria, 2 = wanita) J = 1,2 (1 = reguler, 2 = eksekutif) K = A,B,C,D,E (kelas A s/d E)

Seluruh mahasiswa reguler dapat ditunjukkan dengan Asia (*,1,*) sedangkan seluruh mahasiswa eksekutif dapat ditunjukkan dengan Asia (*,2,*)

2.3 DEKLARASI ARRAY DALAM BAHASA PEMROGRAMAN.

Misal diberikan array dengan nama A yang mempunyai 24 elemen dengan masing-masing elemen berjenis data integer, maka deklarasinya dalam bahasa pemrograman adalah sbb:

VAR A : ARRAY [1..24] OF INTEGER;

Dalam mendeklarasikan suatu array ada 3 hal yang harus ada pada deklarasi tersebut, yaitu:

1. Nama array

2. Range dari indeksnya

3. Tipe elemen-elemen datanya

2.4 PEMETAAN ARRAY KE STORAGE

Ada beberapa cara untuk menyatakan suatu array pada storage, tetapi konsepnya hampir sama dengan apa yang ada pada data fungsi.

2.4.1 ARRAY SATU DIMENSI

Misal diberikan array satu dimensi dengan nama A yang mempunyai indeks 1 s/d N, yaitu A(1:N). Secara fisik array A(1:N) dapat digambarkan sbb:

A(1) A(2) A(3)

Yang perlu kita ketahui disini adalah letak elemen ke I dari array A(1:N), atau letak masing-masing elemen array pada storage. Letak suatu elemen biasanya disebut sebagai starting address atau starting location atau base location. Untuk mengetahui starting address suatu elemen array, perlu diketahui lebih dulu antara lain :

1. Starting address dari array yang bersangkutan.

2. Ukuran masing-masing elemen array atau ruang yang digunakan masing-masing elemen array. Misal starting address dari array A(1:N) adalah B dan masing-masing elemennya

menggunakan ruang sebanyak S bit. Maka starting address elemen ke I dari array A(1:N) adalah : B + ( I - 1 ) * S Hal ini disebabkan ada (I - 1) elemen array A, masing-masing dengan ukuran atau panjang S secara fisik mendahului elemen ke I pada array tersebut.

Secara umum dapat dikatakan bahwa : Starting address elemen ke I dari array A(L:U) adalah (B +( I – L ) * S jika starting address array A adalah B dan masing-masing elemenya menggunakan ruangan sebanyak S bit.

2.4.2 ARRAY MULTI DIMENSI

Prinsip yang digunakan disini tetap didasarkan pada array satu dimensi. Oleh karena itu untuk array multi dimensi, linierisasi-nya dapat dilakukan berdasarkan baris atau kolom. Contoh : Misal diberikan array A(1:3,1:4). Array ini secara fisik dapat digambarkan sbb :

Linierisasi menurut baris akan mengakibatkan bentuk diatas menjadi :

Jika B adalah starting address array A(1:3,1:4) dan S adalah ruang yang digunakan oleh masing-masing elemennya, maka starting address dari elemen A(I,J) adalah : B + (I-1) * 4 * S + (J-1) * S Hal ini karena ada ( I - 1) baris, masing-masing dengan panjang 4 * S yang mendahului baris dimana elemen A(I,J) berada dan ada (J-1) elemen masing-masing dengan panjang S yang mendahului elemen A(I,J) pada baris ke I. Contoh Dari array A(1:3,1:4) akan dicari starting adress elemen A(2,4).

baris 1

baris 2

baris 3

A(2,4)

Starting address A(2,4)

= B + (2 - 1) * 4 * S + (4 - 1) * S =B+7*S

Secara umum elemen A(I,J) dari array A(l:U,L:U) mempunyai starting address :

B + (I-L1) * (U2-L2+1) * S + (J-L2) * S

Alternatif lain untuk linierisasi adalah dengan menggunakan cara kolom jika diberikan array A(1:3,1:4) diatas, maka bentuk linierisasinya :

kolom 1 kolom 2 kolom 3 kolom 4 Jika B adalah starting address dari array A(1:4,1:6) dan S adalah ruang digunakan

untuk masing-masing elemennya, maka starting address dari A(I,J) adalah :

B + (J - 1) * 4 * S + (I - 1) * S

Hal ini disebabkan ada (J - I) kolom masing-masing dengan 4 elemen yang panjangnya s yang mendahului kolom tempat elemen A(I,J) berada dan ada (I-1) elemen masing- masing dengan panjang S yang mendahului elemen A(I,J) pada kolom ke J.

Secara umum dapat dikatakan bahwa elemen A(I,J) dari array A(L1:U1,L2:U2), menurut kolom mempunyai starting address : B + (J-L2) * (U1-L1+1) * S + (I-L1) * S Jika starting adress array tersebut adalah B dan masing-masing elemenya menggunakan

ruang sebanyak S bit. Contoh : Misal diberikan array K(1:4,1:6) dengan starting address B dan masing-masing elemenya menggunakan ruang S bit. Maka starting adress dari elemen k(2,4) adalah :

= B + (4 - 1) * (4-1+1) * S + (2 - 1) * S = B + 3 * 4* S + 1 * S = B + 13 * S

2.5 RECORD

Record adalah himpunan dari elemen-elemen yang heterogen. Heterogen adalah elemen-elemennya dapat mempunyai tipe data yang berbeda. Beberapa hal yang perlu diketahui dalam record sbb:

1. ELEMENTARY ITEM adalah suatu field yang tidak mempunyai subfield.

2. GROUP ITEM adalah suatu field yang mempunyai subfield.

3. TUPEL adalah gabungan atribut yang menjadi suatu informasi dari proses basis data.

Contoh RECORD : PEGAWAI

Job Tittle

Emp. No

Pay Rate

Name

Telp. No

Bob Geldof

Ceu Rika

( String(20) ) ( String(8) )

Record-record yang tipenya sama : FILE. Untuk menyatakan suatu data dalam record yang mempunyai identifikasi yang khusus, maka harus punya 1 field khusus yang disebut KEY (kunci field).

2.6 DEKLARASI RECORD DALAM BAHASA PEMROGRAMAN

PROGRAM DALAM PASCAL Type

Pegawai = Record;

Job_Tittle : String[20]; Emp_No : String[8]; Pay_Rate : Real; Name : String[25]; Telp_No : String[7];

End;

BAB III STACK

3.1 LINEAR LIST

Linear List adalah suatu struktur data yang merupakan himpunan terurut. Misal didefinisikan suatu linear list A yang terdiri atas T buah elemen sebagai berikut :

A = [a1, a2, .........., aT]

Jika T = 0, maka A dikatakan sebagai “Null List”.

Suatu elemen dari sembarang posisi pada linear list A dapat dihilangkan. Sebaliknya, suatu elemen baru dapat dimasukkan ke dalam list dan dapat menempati sembarang posisi pada list tersebut. Jadi suatu linear list dapat berkurang atau bertambah setiap saat.

3.2 DEFINISI STACK

Stack adalah suatu bentuk khusus dari linear list di mana operasi penyisipan dan penghapusan atas elemen-elemennya hanya dapat dilakukan pada satu sisi saja yang

disebut sebagai “TOP”.

Misal diberikan Stack S sebagai berikut :

S = [ S1, S2, .........., ST ]  maka TOP(S) = ST.

Untuk menunjukkan jumlah elemen suatu stack digunakan notasi NOEL. Dari stack di atas, maka NOEL(S) = T. Selanjutnya, jika diberikan sebuah stack S = [A,B,C,D], maka stack S ini dapat digambarkan sebagai berikut :

D Top

B Top

D Top

Top

3.3 OPERASI DASAR PADA STACK

Ada empat operasi dasar yang didefinisikan pada stack, yaitu :

1. CREATE(stack)

2. ISEMPTY(stack)

3. PUSH(elemen,stack)

4. POP(stack)

3.3.1 CREATE

Operator ini berfungsi untuk membuat sebuah stack kosong dan didefinisikan bahwa :

NOEL(CREATE(S)) = 0 dan TOP(CREATE(S)) = null

3.3.2 ISEMPTY

Operator ini berfungsi untuk menentukan apakah suatu stack adalah stack kosong. Operasinya akan bernilai boolean, dengan definisi sebagai berikut :

ISEMPTY(S) = true, jika S adalah stack kosong

= false, jika S bukan stack kosong

atau

ISEMPTY(S) = true, jika NOEL(S) = 0

= false, jika NOEL(S) 0

Catatan : ISEMPTY(CREATE(S)) = true.

3.3.3 PUSH

Operator ini berfungsi untuk menambahkan satu elemen ke dalam stack. Notasi yang digunakan adalah :

PUSH(E,S)

Artinya : menambahkan elemen E ke dalam stack S. Elemen yang baru masuk ini akan menempati posisi TOP. Jadi : TOP(PUSH(E,S)) = E.

Akibat dari operasi ini jumlah elemen dalam stack akan bertambah, artinya NOEL(S) menjadi lebih besar atau stack menjadi tidak kosong (ISEMPTY(PUSH(E,S)) = false).

3.3.4 POP

Operator ini berfungsi untuk mengeluarkan satu elemen dari dalam stack. Notasinya :

POP(S)

Elemen yang keluar dari dalam stack adalah elemen yang berada pada posisi TOP. Akibat dari operasi ini jumlah elemen stack akan berkurang atau NOEL(S) berkurang dan elemen pada posisi TOP akan berubah. Operator POP ini tidak dapat digunakan pada stack kosong, artinya :

POP(CREATE(S)) = error condition

Catatan : TOP(PUSH(E,S)) = E

3.4 DEKLARASI STACK PADA BAHASA PEMROGRAMAN

Dalam bahasa pemrograman, untuk menempatkan stack biasanya digunakan sebuah array. Tetapi perlu diingat di sini bahwa stack dan array adalah dua hal yang berbeda. Misalkan suatu variabel S adalah sebuah stack dengan 100 elemen. Diasumsikan elemen S adalah integer dan jumlah elemennya maksimum adalah 100 elemen. Untuk mendeklarasikan stack dengan menggunakan array, harus dideklarasikan pula variabel lain yaitu TOP_PTR yang merupakan indeks dari array. Variabel TOP_PTR ini digunakan untuk menyatakan elemen yang berada pada posisi TOP dalam stack tersebut. Selanjutnya gabungan kedua variabel ini diberi nama STACK_STRUCT. Kemudian didefinisikan bahwa :

NOEL(S) = TOP_PTR ISEMPTY(S) = TRUE, jika TOP_PTR = 0 dan

FALSE, jika TOP_PTR > 0.

Maka bentuk deklarasinya dalam PASCAL adalah :

TYPE Stack_Struct = Record Stack : array[1..100] of integer; TopPtr : integer;

End;

VAR S : Stack_Struct;

Selanjutnya, untuk keperluan operasi PUSH dan POP harus dibuat suatu prosedur tersendiri, yaitu :

PROCEDURE PUSH(Eon : integer); Begin

If (S.TopPtr < NoelMax) Then Begin S.TopPtr := S.TopPtr + 1; S.Stack [S.TopPtr] := Eon End

Else Overflow_Condition

End;

PROCEDURE POP(Eoff : integer); Begin

If (S.TopPtr > 0) Then Begin

Eoff := S.Stack[S.TopPtr]; S.TopPtr := S.TopPtr - 1

End Else Underflow_Condition

End;

Catatan : Overflow adalah suatu keadaan di mana kita melakukan operasi PUSH terhadap stack dalam keadaan penuh. Underflow adalah keadaan di mana kita melakukan operasi POP Catatan : Overflow adalah suatu keadaan di mana kita melakukan operasi PUSH terhadap stack dalam keadaan penuh. Underflow adalah keadaan di mana kita melakukan operasi POP

3.5 PENGGUNAAN/ APLIKASI STACK

Logika stack digunakan untuk menyelesaikan berbagai macam masalah. Antara lain digunakan pada compiler, operating system dan dalam program-program aplikasi. Berikut ini tiga buah contoh aplikasi stack, yaitu :

3.5.1 MATCHING PARENTHESES

Proses ini dilakukan compiler untuk memeriksa kelengkapan tanda kurung yang terdapat pada suatu ekspresi aritmetik. Sedangkan stack di sini digunakan sebagai tempat prosesnya. Algoritma yang digunakan adalah :

1. Elemen-elemen suatu ekspresi aritmetik (string) di-Scan dari kiri ke kanan.

2. Jika ditemukan simbol "(" atau "Left parenthesis", maka simbol tersebut di-push ke dalam stack.

3. Jika ditemukan simbol ")" atau "Right parenthesis", maka isi stack diperiksa.  Jika stack kosong  terjadi kesalahan. berarti : ada simbol ")",

tetapi tidak ada simbol "(" yang seharusnya mendahului.  Jika stack tidak kosong  artinya ada pasangannya dan langsung di-POP keluar stack.

Misalkan NEXT CHAR adalah suatu karakter terakhir dalam suatu string. Berikut ini bentuk flowchart (logika proses) yang digunakan pada proses matching ini : Misalkan NEXT CHAR adalah suatu karakter terakhir dalam suatu string. Berikut ini bentuk flowchart (logika proses) yang digunakan pada proses matching ini :

valid syntax

string

invalid syntax(unclosed left done parenthesis)

on to stack

invalid syntax(unclosed left found

pop stack

done

increament NEXT CHAR to next character in string

3.5.2 NOTASI POSTFIX

Bentuk aplikasi stack yang lain adalah mengubah suatu ekspresi aritmatik (string) ke dalam notasi postfix. Notasi postfix ini digunakan oleh compiler untuk menyatakan suatu ekspresi aritmatik dalam bahasa tingkat tinggi (high level language). Stack digunakan oleh compiler untuk mentransformasikan ekspresi aritmatik menjadi suatu ekspresi dalam bentuk/notasi postfix. Contoh : Misal diberikan ekspresi aritmatik : A + B ; Maka bentuknya dalam notasi postfix menjadi : AB+ Urutan (prioritas) dari operator adalah :

1. Perpangkatan (^)

2. Perkalian (*) atau Pembagian (/)

3. Penjumlahan (+) atau Pengurangan (-)

Aturan yang digunakan dalam proses transformasi tersebut adalah :

1. Ekspresi aritmatik yang diberikan di- "Scan" dari kiri ke kanan.

2. Bila simbol yang di-scan adalah "(", maka simbol tersebut di push ke dalam stack.

3. Bila simbol yang di-scan adalah ")", maka seluruh isi stack di pop keluar mulai dari simbol "(" yang pertama ditemukan dalam stack.

4. Bila simbol adalah operator, maka dilakukan perbandingan dulu dengan simbol (operator) yang berada pada posisi top dalam stack.

a. Jika derajatnya setara atau lebih rendah dari simbol yang berada pada posisi top, maka top stack di-pop keluar sebagai output dan simbol yang baru di- push ke dalam stack.

b. Jika derajatnya lebih tinggi dari simbol yang berada pada posisi top, maka simbol (operator) yang di-scan tersebut di-push ke dalam stack.

5. Bila simbol yang di-scan adalah operand, maka simbol tersebut langsung sebagai output.

6. Bila simbol adalah ";" maka seluruh isi stack di-pop sebagai output.

Contoh : Misal diberikan sebuah ekspresi aritmatik dengan bentuk sbb:

( (A + B) * C / D + E ^ F ) / G ; Selanjutnya akan dicari bentuk ekspresi diatas dalam notasi postfix. Proses yang dilakukan dapat digambarkan dalam tabel berikut : Urutan

8 9 10 11 12 13 14 15 16 17 18 Proses Simbol Yang di Scan

G ; Top

Output

E F ^+

Jadi ekspresi aritmatik : ( ( A + B ) * C / D + E^F ) / G ; dalam notasi postfix menjadi : AB+D*C/EF^+G/

3.5.3 PROSES REKURSIF

Stack juga dapat digunakan untuk menelurusuri suatu program atau procedure yang rekursif. Berikut ini sebuh contoh yang menyelesaikannya menggunakan proses rekursif.

Persoalan : Agar diperoleh uang sebanyak 1.000.000 rupiah pada 25 tahun yang akan datang, berapakah banyak uang yang harus didepositokan saat ini? dianggap bahwa tingkat bunga tidak berubah selama 25 tahun yaitu sebesar 8% per/tahun.

Penyelesaian : Untuk menyelesaikan masalah ini akan digunakan logika stack yaitu : - pada tahun ke-25 jumlah uang = Rp. 1.000.000,- - pada tahun ke-24 jumlah uang = Rp. 1.000.000 / (1 + 0.8) - pada tahun ke-23 jumlah uang =

. dst Berikut ini sebuah program PASCAL yang mengandung suatu procedure rekursif untuk menghitung jumlah uang diinginkan.

PROGRAM DEPOSITO ; CONST

Goal = 1000000; Rate = 0.08;

VAR

Ju : Real; Thn: Integer;

PROCEDURE Hitung (VAR Thn : Integer); BEGIN

IF (Thn > 0) THEN

BEGIN

Ju := Ju/(1.0 + Rate); Thn := Thn - 1; Hitung(Thn);

END;

END; BEGIN Thn := 25; Ju := Goal; HITUNG(Thn); WRITE(Ju);

END.

Pemanggilan pertama procedure HITUNG dimana nilai Thn =25

Top

Pemanggilan kedua procedure HITUNG dimana nilai Thn = 24

Top

Pemanggilan ketiga procedure HITUNG, dimana nilai Thn = 23

Top

Setelah 25 kali pemanggilan procedure HITUNG keadaan stack adalah :

Top

24 kali pemanggilan 5 statement langkah ke 5

3.6 MAPPING KE STORAGE DARI STACK

Bentuk mapping ke storage dari stack yang paling sederhana adalah dengan menggunakan pendekatan array satu dimensi. Hal ini karena sarana yang digunakan untuk menyatakan suatu stack adalah array.

Jika diberikan stack S dengan m elemen maka bentuk mappingnya seperti mapping array satu dimensi dengan m elemen.

batas/start struktur data lain start

TOP elemen

stack S

Selanjutnya jika terdapat dua stack S1 dan S2 masing-masing dengan jumlah maksimum elemennya adalah M dan N, maka kedua stack ini dialokasikan dalam dengan bentuk sbb:

start S2

start S1 TOP S1

(sementara) struktur data lain

Konsep mapping seperti diatas dianggap tidak efisien, terutama jika S1 dan S2 tidak penuh pada saat yang bersamaan.

Cara yang dianggap lebih baik adalah :

Jika diketahui bahwa jumlah elemen S1 dan S2 tidak melebihi jumlah tertentu, misal N.

NOEL(S1) + NOEL(S2) <= N

Maka bentuk mapping yang digunakan adalah :

start s1 TOP s1

TOP s2

start s2

(sementara)

(sementara)

BAB IV QUEUE

4.1 DEFINISI

Queue adalah suatu linear list di mana operasi DELETE terjadi pada sisi depan (FRONT) dan operasi INSERT terjadi pada sisi belakang (REAR). Jika diberikan suatu Queue Q dengan elemen-elemennya yang terdiri atas Q1, Q2, ....., QT maka queue Q dituliskan

Q = [ Q1, Q2, .........., QT ]

FRONT(Q) = Q1

REAR(Q) = QT

Selanjutnya untuk menyatakan jumlah elemen dalam suatu queue Q digunakan notasi NOEL(Q).

Catatan : Satu pengoperasian berlaku hanya untuk satu elemen.

4.2 GAMBAR QUEUE

Untuk menggambarkan suatu queue dapat dilakukan beberapa cara , yaitu : Misal : diberikan Queue Q = [A, B, C, D, E, F], maka Queue Q dapat digambarkan sebagai berikut :

atau dapat pula digambarkan dengan posisi tegak.

4.3 PRINSIP KERJA QUEUE

Prinsip kerja Queue adalah FIFO (First In First Out), di mana data yang masuk terlebih dahulu akan keluar pertama.

4.4 OPERASI-OPERASI PADA QUEUE (Q)

Terdapat empat operasi dasar yang didefinisikan pada queue, yaitu :

1. CREATE

Bentuk Umum : CREATE(Queue) Suatu operasi CREATE(Q) akan menghasilkan suatu queue kosong dengan nama Q, dan didefinisikan bahwa :

NOEL(CREATE(Q)) = 0 FRONT(CREATE(Q)) = tidak terdefinisi REAR(CREATE(Q)) = tidak terdefinisi

2. ISEMPTY

Bentuk Umumnya adalah : ISEMPTY(queue) Jika Q adalah Queue, maka ISEMPTY(Q) adalah suatu operasi yang digunakan untuk memeriksa apakah Queue Q adalah queue kosong. Jika hasil dari operasi ini akan berjenis data boolean (true/false), dengan bentuk sebagai berikut :

ISEMPTY(Q) = True, jika Q adalah queue kosong. = False, jika Q bukan queue kosong.

3. INSERT

Bentuk Umumnya : INSERT(elemen, Queue) INSERT(E,Q), di mana E = elemen dan Q = queue, adalah suatu operasi yang digunakan untuk memasukkan elemen E ke dalam queue Q. Didefinisikan, bahwa elemen E akan menjadi elemen yang berada pada posisi REAR dari queue Q. Akibat dari operasi ini adalah :

- REAR(INSERT(E,Q)) = E - NOEL(Q) bertambah satu dan QNOEL adalah E

Jika Q adalah queue kosong, maka :

ISEMPTY(INSERT(E,Q)) = False

Dalam bentuk statement Pascal, biasanya dituliskan : IF ISEMPTY(Q) Then front(insert(E,Q)) = E

Else front(insert(E,Q)) = front(Q) ;

4. REMOVE

Bentuk Umum : REMOVE(elemen, queue) REMOVE(Q) berarti mengeluarkan elemen Q yang berada pada posisi FRONT. Akibat dari operasi ini, elemen Q akan berkurang satu dan elemen kedua (elemen yang berada disebelahnya) akan menjadi elemen yang berada pada posisi FRONT dari queue Q ini. Selanjutnya, jika Q adalah queue kosong, maka REMOVE(Q) akan menghasilkan suatu Error.

IF NOEL(Q) = 0 Then Remove(Q) = erroe_condition Remove(create(Q)) = error_condition

4.5 DEKLARASI QUEUE DALAM PASCAL

Dalam bahasa pemrograman biasanya tidak ada fasilitas queue (built in queue). Untuk itu setiap programmer harus mendefinisikan sendiri dengan bantuan fasilitas yang ada. Pada umumnya fasilitas yang digunakan untuk mendeklarasikan queue adalah Array. Bentuk deklarasinya dalam bahasa Pascal adalah sebagai berikut :

TYPE StrukQueue = Record

Q : Array[1..100] of integer; Front, Rear : integer;

End;

VAR Q : StrukQueue;

Selanjutnya untuk keperluan operasinya (bentuk proses atau logikanya), harus dibuat suatu procedure tersendiri dan disesuaikan dengan aturan-aturan yang berlaku (yang telah didefinisikan). Berikut ini contoh sebuah procedure yang digunakan untuk Selanjutnya untuk keperluan operasinya (bentuk proses atau logikanya), harus dibuat suatu procedure tersendiri dan disesuaikan dengan aturan-aturan yang berlaku (yang telah didefinisikan). Berikut ini contoh sebuah procedure yang digunakan untuk

Procedure INSERT (eon : integer); Begin

If (q.rear < noelmax) Then Begin

q.rear := q.rear + 1; q.queue[q.rear] := eon; If (q.front = 0) Then

q.front := 1 End Else overflow_condition

End;

Procedure REMOVE(var eoff : integer); Begin

If (q.front > 0) Then Begin

eoff := q.queue[q.front]; If (q.front = q.rear) Then Begin

q.front := 0; q.rear := 0;

End Else q.front := q.front + 1 End

Else underflow-condition End;

4.6 CIRCULAR QUEUE

Misal diberikan queue Q dengan jumlah maksimum elemen sebanyak 100, yang digambarkan sebagai berikut :

Queue di atas diisi secara berurutan empat elemen A, B, C dan D, sehingga bentuknya menjadi:

Kemudian dilakukan operasi REMOVE dua kali berurutan, sehingga bentuknya menjadi :

Selanjutnya dilakukan operasi INSERT untuk 3 elemen secara berurutan, yaitu E,

F dan G, maka bentuknya menjadi :

Kemudian dilakukan operasi REMOVE lagi berurutan terhadap dua elemen, sehingga bentuknya menjadi :

Terlihat bahwa elemen-elemen queue bergerak terus dari kiri ke kanan sepanjang arraynya. Apa yang terjadi bila suatu saat REAR = 100 dan kita masih akan memasukkan suatu elemen ke dalam queue ? Dalam keadaan ini, batas maksimum telah dicapai, padahal kita masih ingin menambah/memasukkan beberapa elemen lagi.

Salah satu cara/pendekatan untuk menyelesaikan masalah seperti ini adalah dengan menambah ukuran array yang digunakan. Artinya kita harus mendeklarasikan array dengan ukuran yang besar untuk menempatkan queue tersebut. Tetapi cara ini dianggap tidak efektif, karena keadaan serupa masih dapat muncul kembali. Cara lain yang dianggap lebih baik adalah dengan mengubah queue tersebut ke dalam bentuk yang disebut CIRCULAR. Berikut ini contoh bentuk circular tersebut :

Q(N-3)

Q(5)

Q(4) Q(N-2) Q(3)

Q(N-1)

Q(2)

Q(N) Q(1)

Dalam hal ini kondisi dari suatu queue kosong adalah :FRONT = REAR = 0 Jika queue hanya berisi dua elemen, maka bentuknya adalah :

Selanjutnya jika elemen queue melampaui batas yang ada sedangkan kita masih memiliki ruang yang kosong, maka posisi FRONT dan REAR harus di-'reset' dulu agar kita bisa memasukkan elemen ke dalam queue tersebut.

Berikut ini sebuah algoritma yang digunakan untuk operasi INSERT

pd akhir array?

Move REAR ke posisi yg pertama dr array

tdk

Move REAR satu posisi dalam array

FRONT & REAR

ya

pd posisi yg sama ?

overflow

tdk

Insert elemen pd posisi REAR dlm

Move FRONT pd

elemen pd queue

posisi tsb dlm array

tdk

selesai

Algoritma yang digunakan untuk operator REMOVE pada circular queue :

underflow selesai

tdk REMOVE elemen pada

posisi FRONT

satu- ya

satunya elemen pd reset FRONT dan

move FRONT ke

pd akhir array ?

posisi awal dari array

tdk move FRONT pd posisi

yang baru dalam array

selesai

Sedangkan bentuk procedure-nya dalam bahasa Pascal adalah sebagai berikut

PROCEDURE insert (eon : integer); BEGIN

IF (q.rear = n) THEN q.rear := 1

ELSE q.rear := q.rear + 1; IF (q.rear = q.front)

THEN overflow_condition

ELSE BEGIN

q.queue[q.rear] := eon; IF (q.front = 0) THEN

q.front := 1 end;

end;

PROCEDURE remove (eoff : integer); BEGIN

IF (q.front = 0) THEN underflow_condition ELSE BEGIN

eoff := q.queue[q.front] ; IF (q.front = q.rear) THEN BEGIN

q.front := 0; q.rear := 0

END ELSE IF (q.front = n)

THEN q.front := 1 ELSE q.front:=q.front + 1

END; END;

BAB V LINKED LIST

5.1 PENDAHULUAN. Dalam suatu linear list kita dapat melakukan operasi penyisipan atau penghapusan atas elemen-elemennya pada sembarang posisi. Misalkan ada 1500 item yang merupakan elemen dari suatu linear list. Jika elemen ke-56 akan kita keluarkan, maka elemen ke-1 s/d elemen ke-55 tidak akan berubah posisinya pada linear list tersebut. Tetapi elemen ke-

57 akan menjadi elemen ke-56, elemen ke-58 akan menjadi elemen ke-57 dst. Selanjutnya, jika kita sisipkan satu elemen pada posisi setelah elemen ke-41, maka elemen ke-42 s/d elemen ke-1500 akan berubah posisinya.

Untuk menyatakan keadaan diatas diperlukan suatu konsep yang berbeda dengan konsep sekuensial sebelumnya. Linked list merupakan suatu cara non-sekuensial yang digunakan untuk merepresentasikan suatu data.

5.2 DEFINISI

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 :

 INFO, berisi informasi tentang elemen data yang bersangkutan.  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 :

info next

info next null

info next info next

CATATAN : - Ada dua hal yang menjadi kerugian dengan representasi suatu data dengan linked list ini, yaitu :

1. Diperlukan ruang tambahan untuk menyatakan/tempat field pointer.

2. Diperlukan waktu yang lebih banyak untuk mencari suatu node dalam linked list.

- Sedangkan keuntungannya adalah :

1. Jenis data yang berbeda dapat di-link.

2. Operasi REMOVE atau INSERT hanya dilakukan dengan mengubah pointer- nya saja.

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

info next

info next

start

A C node ke-2

node ke-1

node ke-3

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

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

info next

info next

langkah ke-2 : Next(P) := Next(Q)

info next

info next

info next

info next

langkah ke-3 : Freenode(Q)

procedure Freenode(Q)

(a) Next(Q) := Avail

info next Q

info next Avail ... null

next

info next

P (b)

Info(Q) := Null (c)

Avail := Q

Q next

Avail

next

info next

info next

null

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

5.5.1 Procedure Getnode(NEW)

if Avail = Null then out-of-free-space

(a) else begin Getnode := Avail;

info next

info next

info next

info next

(b) Avail := Next(Avail);

info next Getnode

info next

info next

info next

(c) Next(Getnode) : = Null; end;

info next Getnode

info next

info next

info next

5.5.2 Algoritma menyisipkan sebuah Node

(a) Getnode(NEW); (b)

Info(NEW) := Name; Info(NEW) := Name;

next

NEW Name null

next

info next

info next ...

(c) Q := Next(P) (d)

Next(P) := NEW

info

next

NEW Name null

next

info next

info next ...

(e) Next(NEW) := Q

info

next

NEW Name

next

info next

info next

5.6 LOGIKA LINKED LIST PADA ARRAY

(a) Jika tidak menggunakan logika linked list (pada umumnya dalam meng-input data digunakan cara sequential)

Awal

Insert E

Delete

Insert F

Insert G

(b) Jika menggunakan logika Linked List Keadaan awal

Insert E

Delete C

Nex Info Nex

Insert G Info

Insert F

Delete E

Info Nex

5.7 MENDEFINISIKAN LINKED LIST DALAM PASCAL

Type nodeptr = ^ nodetype; nametype = packed array [1..10] of char; nodetype = record

info : nametype; next : nodeptr;

end;

Var p : nodeptr; node : nodetype; * Catatan : P ^. Info

: Info dari node yang ditunjuk oleh pointer P P^. Next

: Next dari node yang ditunjuk oleh pointer P P := nil

: pointer P berisi nilai Null

New(P)

: fungsi Getnode dalam Pascal

dispose(P)

: procedure Freenode dalam Pascal

5.8 MENGHAPUS SEBUAH NODE DALAM PASCAL

procedure removaf(p:nodeptr, var out:nametype); var

q : nodeptr; begin if (p^.Next = nil) then UNDERFLOW-CONDITION else begin q : nodeptr; begin if (p^.Next = nil) then UNDERFLOW-CONDITION else begin

end;

5.9 MENYISIPKAN SEBUAH NODE DALAM PASCAL

procedure inseraf(p:nodeptr, in:nametype); var

q : nodeptr; begin New(q); q^.Info := in; q^.Next := p^.Next; p^.Next := q;

end;

5.10 PENYISIPAN PADA AKHIR DARI SUATU LINKED LIST (LINKED LIST ANTREAN) DALAM PASCAL

Procedure Inserend(first : nodeptr, in :nametype); Var newnode, q : nodeptr; Begin

New(newnode); newnode^.Info := in; newnode^.Next := nil; q := first; do while (q^.next <> nil)

q := q^.Next; q^.Next := newnode; End;

Jika sebuah Linked List digunakan untuk menggambarkan suatu antrean, dalam hal ini pointer dapat langsung menunjuk ke rear/akhir dari antrean untuk menghindari pengulangan melalui semua node untuk menemukan node terakhir.

procedure inserend(in : nametype, var rear : nodeptr); var

newnode : nodeptr; begin New(newnode); newnode^.Info := in; newnode^.Next := nil; rear^.Next := newnode; rear := newnode;

end;

5.11 CIRCULAR LINKED LIST

info next first

info next

info next

info next

Head Nodes

info next Head

info next

info next

info next

Circular Linked List dengan Head Node

info next Head

Circular Linked List dengan Head Node kosong

5.12 ALGORITMA PENYISIPAN NODE YANG BERISI VARIABEL NAME PADA HEAD DALAM LINKED LIST

(a) Ambil node baru pada free storage kemudian node tersebut ditunjuk oleh

pointer NEW (b) Isikan Info dengan Name pada node baru tsb. (c) Next dari node baru tsb. menunjuk ke node yang ditunjuk oleh pointer Head (d) Pindahkan pointer Head menunjuk ke node yang baru.

5.13 MENGHAPUS NODE KHUSUS

Procedure removp(head : nodeptr, var p:nodeptr, out : nametype); Var prior, this : nodeptr;

flag : 0..2; Begin prior := head; this := head^.next; flag := 1; While flag = 1

do begin if (this = head) then flag := 2; if (this = p) then flag := 0 else begin

prior := this; this := this^.next;

end; end; if (flag > 0) then Node yang ditunjuk oleh pointer p tidak ada dalam List

else begin prior^.next := p^.next; else begin prior^.next := p^.next;

End;

5.14 DOUBLY LINKED LIST

prior info next Head

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

5.14.1 Double Linked List Kosong

prior head next

Prior(Head) = Head Next(Head) = Head

Dalam Pascal :

Type nodeptr = ^ nodetype nodetype = record

prior : nodeptr; info : nametype; next : nodeptr

end;

5.14.2 Procedure menghapus sebuah node pada Double Linked List

(a) Set pointer P

prior info next

(b) Ubah pointer pada node Next predecessor P ke node Successor P

prior info next

(c) Ubah pointer pada node dari prior Successor P ke node Predeccssor P

prior info next

(d) bebaskan node yang ditunjuk pointer P

Dalam Pascal :

Procedure Removp(var p:nodeptr, out : nametype); Var pred, succ : nodeptr; Begin

pred := p^.prior; succ := p^.next; pred^.next := succ; succ^.prior := pred; out := p^.info; dispose(p)

End;

5.14.3 Penyisipan sebuah Node pada Doubly Linked List

(a) Ambil sebuah node baru dan isikan datanya (b)

Set pointer dari Next node baru menunjuk ke Successor P dan pointer Proirnya ke P

(c) Ubah pointer Next P menunjuk ke node baru (d)

Ubah pointer Prior dari Successor P menunjuk ke node baru

5.15 Contoh Aplikasi Linked List

5.15.1 Polynomial n

n-1

anx + an-1 x

+ ... + a2 x + a1 x + a0

Type nodeptr = ^nodetype; nodetype = record

exp : integer; coef : integer; next : nodeptr;

end;

EXP COEF

4 143

2 20 1 14 0 2

BAB VI GRAPH

6.1 DEFINISI

GRAPH merupakan suatu koleksi dari himpunan VG dan EG. Notasi : G = { VG, EG }

G = Graph VG = Himpunan titik

EG = HImpunan garis

Titik : Node / Vertex Garis : Arc / Edge

Contoh : Graph G terdiri dari : G = { VG, EG }

VG = { a,b,c,d } EG = { 1,2,3,4,5,6,7,8 }

- edge 1 menghubungkan vertex a & b  Edge 1 = (a,b) - edge 2 menghubungkan vertex b & c  Edge 2 = (b,c) - edge 3 menghubungkan vertex b & c  Edge 3 = (b,c), dst ...

Jumlah vertex dalam suatu graph disebut ORDER dari graph tersebut. Contoh : Graph G dengan order = 4 (jumlah vertex = 4 ; a,b,c,d)

Suatu graph hanya ditentukan oleh vertex-vertex dan edge-edgenya. Posisi dari vertex-vertex dan edge-edge dalam penggambaran tidaklah penting.

GRAPH EQUIVALEN : penggambaran graph yang sama.

GRAPH EQUIVALEN

Suatu graph G disebut SIMPLE GRAPH, jika :

1. tidak mempunyai edge yang SELF LOOP (tidak ada (V,V) dalam G)

2. tidak mempunyai MULTIPLE EDGE (hanya ada (Vi, Vj) dalam G) (V1, V2, V3, ......  VG)

SIMPLE GRAPH

MULTIPLE EDGE adalah 1 vertex dihubungkan oleh beberapa edge. Contoh : Pada gambar graph equivalen diatas, vertex b dihubungkan oleh edge- edge 1,2,3,5,6,7. Sedangkan vertex c dihubungkan oleh edge-edge 2,3,4

SELF LOOP adalah vertex yang dihubungkan oleh edge-edge menuju edge itu sendiri. Contoh : Pada gambar graph equivalen diatas, Vertex a dihubungkan oleh edge 8 menuju a kembali.

Suatu Graph G disebut CONNECTED (terhubung) jika Graph G dapat dipartisi (dibagi) menjadi 2 graph dengan menghapus paling sedikit 1 edge.

 Contoh yang tidak connected : Suatu graph G terdiri dari :

G = { VG, EG } VG = { e,f,g,h }

EG = { 1,2,3 }

UNCONNECTED GRAPH

PATH dalam Graph adalah barisan dari 1 buah edge-edge yang menghubungkan 2 vertex.

Notasi : P(Vi, Vj) = (Vi, X1) (X1, X2) (X2, Xn-1) (Xn-1, Xn) (Xn, Vj) Dari gambar simple graph :

P(b,d) =

(b,c) (c,d)

P(b,d) =

(b,c) (c,b) (b,c) (c,d)

P(b,d) =

(b,d)

P(b,d) =

(b,c) (c,b) (b,d)

LENGTH dari suatu path adalah jumlah edge-edge pada path tersebut. Contoh : Perhatikan gambar simple graph : P(b,d) = (b,d)

 length = 1

= (b,c) (c,d)

 length = 2 = (b,c) (c,b) (b,d)

 length = 3

CYCLE adalah path yang memenuhi syarat sebagai berikut :

1. tidak ada edge yang tampil lebih dari satu kali dalam barisan edge dari path tersebut contoh : Gambar simple graph ;

P(b,d) = (b,c) (c,b) (b,d)

 tidak boleh