• Tidak ada hasil yang ditemukan

Modul Struktur Data(teori)

N/A
N/A
Protected

Academic year: 2018

Membagikan "Modul Struktur Data(teori)"

Copied!
96
0
0

Teks penuh

(1)

MODUL

STRUKTUR DATA

ADI PRATOMO

NIP.19750925 200912 1 002

KEMENTERIAN PENDIDIKAN NASIONAL POLITEKNIK NEGERI BANJARMASIN

(2)

DAFTAR ISI

Kata Pengantar ... i

Daftar Isi ... ii

BAB I : Jenis-Jenis Data 1.1 Tipe Data Tunggal ... 1

1.1.1 Integer ... 1

1.1.2 Real ... 2

1.1.3 Boolean ... 2

1.1.4 Karakter ... 2

1.1.5 String ... 3

1.1.5.1 Length ... 3

1.1.5.2 Concatenation ... 4

1.1.5.3 Substring ... 4

1.1.5.4 Insert ... 5

1.1.5.5 Delete ... 5

1.2 Deklarasi Data dalam Bahasa Pemrograman ... 6

1.3 Pemetaan ke Storage ... 6

1.3.1 Integer ... 6

1.3.2 Karakter ... 7

1.3.3 String ... 8

BAB II : ARRAY DAN RECORD 2.1 Array Satu Dimensi ... 11

2.2 Array Multi Dimensi ... 11

2.2.1 Cross Section ... 12

2.2.2 Transpose ... 13

2.3 Deklarasi Array dalam Bahasa Pemrograman ... 14

(3)

2.4.2 Array Multi Dimensi ... 15

2.5 Record ... 17

2.6 Deklarasi Record dalam Bahasa Pemrograman ... 17

BAB III : STACK ... 18

3.4 Deklarasi Stack dalam Bahasa Pemrograman ... 20

(4)

5.5.2 Algoritma Menyisipkan sebuah Node ... 42

5.6 Logika Linked List pada Array ... 44

5.7 Mendefinisikan Linked List dalam Pascal ... 45

5.8 Menghapus sebuah Node dalam Pascal ... 45

5.9 Menyisipkan sebuah Node dalam Pascal ... 46

5.10 Penyisipan Pada Akhir Dari Suatu Linked List (Linked List Antrean) Dalam Pascal ... 46

5.11 Circular Linked List ... 47

5.12 Algoritma Penyisipan Node Yang Berisi Variabel Name Pada Head Dalam Linked List ... 48

5.13 Menghapus Node Khusus ... 48

5.14 Doubly Linked List ... 49

5.14.1 Double Linked List Kosong ... 49

5.14.2 Procedure Menghapus Sebuah Node Pada Double Linked List 50 5.14.3 Menyisipkan Sebuah Node pada Doubly Linked List ... 51

(5)

7.10 Binary Search Tree ... 72

7.10.1 Direct Search ... 72

7.10.2 Sequential Search ... 73

7.10.3 Insert Search ... 74

7.10.4 Delete search ... 74

7.11 BALANCED TREE ... 74

7.12 Height Balanced Tree ... 74

BAB VIII : SEARCHING& SORTING ... 76

8.1 Pendahuluan ... 76

8.2 Sorting ... 76

8.3 Insertion Sort ... 77

8.4 Selection Sort ... 79

8.5 Merging ... 81

8.6 Merge Sort ... 82

8.7 Tournament Sort ... 82

8.8 Shell Sort ... 87

8.9 Searching ... 89

8.10 Sequential Searching ... 89

8.11 Skema Move to the Front ... 90

8.12 Skema Transposition ... 90

(6)

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

(7)

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 :

Di dalam sistem desimal, bilangan 123000 = 0.123 * 106.

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

(8)

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 = 'a1a2 ... aN' , di mana setiap karakter ai anggota A untuk, 1  i  N.

Dalam suatu string terdapat beberapa operasi utama, yaitu : 1. Length

2. Concatenation 3. Substring 4. Insert 5. Delete

1.1.5.1 LENGTH

(9)

Contoh :

a. Jika diberikan string S = 'a1a2 ... aN'. 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 S1 dan S2 masing-masing adalah suatu string, maka bentuk operasi concatenation dinotasikan dengna : CONCAT(S1,S2).

Contoh :

Misal S1 = 'a1a2 ... aN' dan S2 = 'b1b2 ... bM' Maka CONCAT(S1,S2) = ' a1a2 ... aNb1b2 ... bM'

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

LENGTH(CONCAT(S1,S2)) = LENGTH(S1) + LENGTH(S2)

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 = 'a1a2 ... aN' ; i = 2 ; j = 4.

Maka SUBSTR(S,i,j) = SUBSTR(S,2,4) = 'a2a3a4a5'

(10)

2. SUBSTR(CONCAT(S1,S2),1,LENGTH(S1)) = S1

3. SUBSTR(CONCAT (S1,S2),LENGTH(S1)+1,LENGTH(S2)) = S2

1.1.5.4 INSERT

Operasi ini adalah untuk menyisipkan suatu string ke dalam string lain. Bentuk umumnya adalah : INSERT(S1,S2,i). S1 dan S2 masing-masing adalah suatu string dan i adalah posisi awal S2 pada S1.

Contoh :

Misalkan: S1 = 'a1a2 ... aN'

S2 = 'b1b2... bM'

INSERT(S1,S2,3) = 'a1a2b1b2... bMa3a4 ... aN'

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 = 'a1a2 ... aN' DELETE(S,3,4) = 'a1a2a7a8 ... aN'

Catatan :

INSERT(S1,S2,i) = CONCAT(CONCAT (SUBSTR(S1,1,i-1),S2), SUBSTR(S1,i,LENGTH(S1)-(i-1)))

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

(11)

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

(12)

jika X + X' = R. X disebut sebagai bentuk true, sedangkan X' = R - X disebut bentuk komplemen. Bentuk komplemen X' = R - X menyatakan bilangan integer negatif X. Sedangkan bentuk true X menyatakan integer positif X.

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)

(13)

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 : S1 = 'ABCDEFG' dan S2 = 'BCD'

a. Cara ke-1

Jika diberikan suatu informasi tentang : - nama string

- starting address - panjang string Contoh :

Nama String Start Panjang

String1 Ptr1 7

String2 Ptr2 3

Maka secara fisik bentuk formatnya pada storage adalah :

B C D E F G

A B C D

Ptr1 Ptr2

atau

A B C D E F G

(14)

b. Cara ke-2

Jika diberikan informasi sebagai berikut : - nama string

- starting address - terminal address Misalnya diberikan tabel sbb :

Nama String Start Terminal

String1 Ptr1s Ptr1t

String2 Ptr2s Ptr2t

Maka secara fisik bentuknya pada storage adalah :

B C D E F G

A B C D

Ptr1s Ptr2s

Ptr1t Ptr2t

atau

A B C D E F G

Ptr1t Ptr2t

Ptr1sPtr2s

c. Cara ke-3

Jika diberikan informasi : - nama string - starting address

- suatu tanda yang menunjukkan batas string Misalnya :

Nama String Start

String1 Ptr1

(15)

Maka bentuknya secara fisik pada storage adalah :

B C D E F

A B C D

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)

K

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 :

(16)

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

(17)

terdiri atas M elemen dimana masing-masing elemennya berupa array dengan N elemen, dapat digambarkan sebagai suatu tabel MxN, dengan bentuk sbb:

1 2 3 ... J ... N 1

2 3 ...

I ... M

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 U2, dituliskan:

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

Untuk L1 < I < U1 dan L2 < J < U2

Jumlah elemen baris dari array B adalah : ( U2– L2 + 1 )

Jumlah elemen kolom dari array B adalah : ( U1 - L1 + 1) Jumlah total elemen array B adalah : (U2 – L2 + 1 )(U1 - L1 + 1)

2.2.1CROSS 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).

(18)

2.2.2TRANSPOSE

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 :

N

(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 :

P w

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

(19)

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) ... A(I) ... A(N)

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

(20)

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 :

1 2 3 4

1 2 3

Linierisasi menurut baris akan mengakibatkan bentuk diatas menjadi :

1 2 3

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

(21)

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 :

1 2 3

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

(22)

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

Analys 00012724 1.000.000 Bob Geldof 7801725

Programmer 00023451 800.000 Ceu Rika 7521475

( String(20) ) ( String(8) ) ( Real(9,2) ) ( String(25) ) ( String(7) )

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;

(23)

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 :

(24)

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)

(25)

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

(26)

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 :

(27)

terhadap stack kosong. Eon adalah elemen yang akan dimasukkan ke dalam stack dan

Eoff adalah elemen yang akan dikeluarkan dari dalam stack.

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.

(28)

position NEXT CHAR

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

(29)

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

(30)

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

(31)

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

9

Pemanggilan kedua procedure HITUNG dimana nilai Thn = 24

Top

9

5

Pemanggilan ketiga procedure HITUNG, dimana nilai Thn = 23

Top

(32)

Setelah 25 kali pemanggilan procedure HITUNG keadaan stack adalah :

Top

9 5 5 5 5

24 kali pemanggilan 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.

start TOP batas/start struktur data lain stack S elemen

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 S1 TOP S1 startS2 TOP S2 start

(33)

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 TOPs1 TOPs2 start

(sementara) (sementara)

s2

(34)

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 :

A B C D E F

 

FRONT REAR

F E D C B A

 

REAR FRONT

(35)

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 :

(36)

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;

(37)

menggantikan operator insert. Pada procedure berikut ini dimisalkan eon adalah elemen yang akan dimasukkan ke dalam queue dan noelmax adalah kapasitas maximum elemen-elemen yang dapat ditampung dalam queue.

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

(38)

4.6 CIRCULAR QUEUE

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

1 2 3 4 5 ... 99 100

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

A B C D

1 2 3 4 5 6 7 8 ... 99 100

FRONT = 1 ; REAR = 4

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

C D

1 2 3 4 5 6 7 8 ... 99 100 FRONT = 3 ; REAR = 4

Selanjutnya dilakukan operasi INSERT untuk 3 elemen secara berurutan, yaitu E, F dan G, maka bentuknya menjadi :

C D E F G

1 2 3 4 5 6 7 8 ... 99 100 FRONT = 3 ; REAR = 7

(39)

E F G

1 2 3 4 5 6 7 8 ... 99 100 FRONT = 5 ; REAR = 7

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

Q(4)

Q(3) Q(2) Q(1) Q(N) Q(N-1) Q(N-2) Q(N-3)

. . .

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

F

(40)

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

start

ya

tdk

ya

tdk

ya

selesai tdk REAR

pd akhir array? Move REAR ke posisi yg pertama dr array

Move REAR satu posisi dalam array

FRONT & REAR

pd posisi yg sama ? overflow

Insert elemen pd posisi REAR dlm

array

satu-satunya elemen pd queue

(41)

Algoritma yang digunakan untuk operator REMOVE pada circular queue :

start

ya

tdk

ya

tdk

ya

selesai queue

kosong ? underflow selesai

REMOVE elemen pada posisi FRONT

satu-satunya elemen pd

queue ?

reset FRONT dan REAR = 0

FRONT pd akhir array ?

move FRONT ke posisi awal dari array

move FRONT pd posisi yang baru dalam array

(42)

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

(43)

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

info next info next info next info next start

node ke-1 node ke-2 node ke-3 node ke-4 null

(44)

Node-node dalam linked list tidak harus selalu digambarkan paralel seperti pada gambar diatas. Linked list pada contoh diatas dapat pula digambarkan seperti berikut :

null

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

(45)

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 :

A

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 :

(46)

langkah ke-2 :

Next(P) := Next(Q)

info

info info info next

next next next

P Q

langkah ke-3 : Freenode(Q)

procedure Freenode(Q)

(a) Next(Q) := Avail

info next Q

info info next next next

P Avail

...

null

(b) Info(Q) := Null (c) Avail := Q

next Q

info info next next next Avail

...

(47)

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

Avail

(b) Avail := Next(Avail);

info next info next info next info next null

info next info next info next info next null ...

Getnode Avail null

5.5.2 Algoritma menyisipkan sebuah Node

(48)

next

info info next next next

... NEW info

Name null

P Q

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

next

info info next next next

... NEW info

Name null

P Q

(e) Next(NEW) := Q

next

info info next next next

NEW info Name

(49)

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

(b) Jika menggunakan logika Linked List

(50)

Insert F Delete E Insert G

5.7 MENDEFINISIKAN LINKED LIST DALAM PASCAL

Type nodeptr = ^ nodetype;

nametype = packed array [1..10] of char; nodetype = record 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)

(51)

q := p^.Next; p^.Next := q^.Next; out := q^.Info; dispose(q); end; 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;

(52)

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 info next info next info next ...

first

Head Nodes

info next info next info next info next ...

Head

Circular Linked List dengan Head Node

info next Head

(53)

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;

then Node yang ditunjuk oleh pointer p tidak ada dalam List

(54)

out := p^.info; dispose(p) end;

End;

5.14 DOUBLY LINKED LIST

next

... Head prior info

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

next prior

head

prior head next Prior(Head) = Head Next(Head) = Head

Dalam Pascal :

Type nodeptr = ^ nodetype nodetype = record

(55)

5.14.2 Procedure menghapus sebuah node pada Double Linked List

(a) Set pointer P

next prior info

P

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

next prior info

P

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

next prior info

P

(d) bebaskan node yang ditunjuk pointer P

Dalam Pascal :

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

Begin

(56)

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

IN P

NEW

AVAIL

(c) Ubah pointer Next P menunjuk ke node baru

(d) Ubah pointer Prior dari Successor P menunjuk ke node baru

IN P

NEW

AVAIL

5.15 Contoh Aplikasi Linked List

5.15.1 Polynomial

anxn + an-1 xn-1 + ... + a2 x2 + a1 x + a0

Type nodeptr = ^nodetype; nodetype = record

(57)

143 x4 + 201 x2 + 14 x + 2

a4 = 143 a3 = 0 a2 = 201 a1 = 14 a0 = 2

POLY 1 EXP COEF

(58)

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

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

(59)

GRAPH EQUIVALEN : penggambaran graph yang sama.

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)

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

(60)

 Contoh yang tidak connected :

Suatu graph G terdiri dari : G = { VG, EG } VG = { e,f,g,h } EG = { 1,2,3 }

e f

g

h

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)

(61)

contoh : P(a,a) = (a,b) (b,c) (c,d) (d,b) (b,a) b dikunjungi lebih dari 1x P(b,b) = (b,c) (c,b) (b,a) (a,c) (c,b)

c & b dikunjungi 3x

Contoh CYCLE : P(b,b) = (b,d) (d,c) (c,b)

ACYCLIC adalah graph yang tidak mempunyai cycle. Contoh : Graph G terdiri dari : G = { VG, EG }

Graph yang Simple belum tentu graph yang Acyclic. Graph yang Acyclic adalah graph yang Simple.

Graph yang berarah disebut DI-GRAPH / DIRECTED GRAPH, adalah merupakan graph dimana edge-edgenya mempunyai suatu arah.

(62)

Graph yang tidak mempunyai arah boleh bolak-balik.

a b

c d

Pada Gambar ; (a,b)  1 arah (b,a)  1 arah

6.2 OUT DEGREE, IN DEGREE, DEGREE dari suatu vertex a

Vertex a mempunyai :

1. OUT DEGREE (derajat luar) = N

Jika vertex a mempunyai N edge mengarah keluar.

Misal : Vertex a mempunyai 2 edge mengarah ke luar (Gambar Digraph diatas) 2. IN DEGREE (derajat masuk) = N

Jika vertex a mempunyai N edge mengarah masuk (Gambar Digraph diatas) 3. DEGREE (derajat) = N

Jika Out Degree a ditambah In Degree a = N misal : vertex b : In Degree = 2

Out Degree = 3 ---

Degree = 5

Contoh : Pada Gambar Digraph diatas; degree(a) = 3 degree(b) = 5 degree(c) = 3 degree(d) = 5 ---

(63)

Graph G dengan himpunan vertex Vo dan edge Eo diasumsikan graph berorder N untuk N  1.

Salah satu pendekatan untuk graph ini menggunakan matriks ADJACENCY dengan suatu array A ukuran N x N.

1 jika edge (Vi, Vj)  Eij 0 jika edge (Vi, Vj)  Eij

Contoh : Graph UNDIRECT / Matriks Simetris

(64)

i j

1 2 3 4 5 6

1 0 1 0 0 0 0

2 0 1 1 0 0 0

3 0 0 0 0 1 1

4 0 0 1 0 0 0

5 0 0 0 0 0 0

6 0 0 0 0 0 0

6.3 Penggambaran NODE DIRECTORY

Penggambaran node dalam directory dibagi dalam 2 bagian : 1. Directory

2. Himpunan Link List (LL)

Setiap record dari Link List mempunyai 2 field ; 1. Node Identifier

2. Suatu link yang menghubungkan elemen lain dari list (next)

NODE NEXT

Directory menggambarkan banyak node. Link list menunjukkan edge-edgenya.

1 2 3

(65)

Directory Link

List

1. 2 null

2. 1 2 3 nul

l

3. 2 4 5 6 null

4. 3 null

5. 3 null

6. 3 null

1 2 3

4 5 6

Directory Link

List

1. 2 null

2. 2 3 null

(66)

4. null

5. null

6. 3 null

Kalau punya harga (untuk manajemen proyek) penggambaran node-nya di bagi 3 ; NODE WEIGH

T

NEX T

2

1 3 4 5

10

20

30

(67)

BAB VII

TREE

7.1 GENERAL TREE

TREE adalah suatu graph yang acyclic, simple, connected yang tidak mengandung loop.

ROOT Tree A ; suatu vertex dengan derajat masuk = 0.

LEAF Tree A ; suatu vertex dengan derajat keluar = 0.

(68)

LEVEL dari suatu vertex A dalam Tree A adalah LENGTH Path(P) (Root(A),A) Dari gambar Tree A ;

 Tentukan level A :

 Length P(Root(A),A)

 Length P(B,A) = (B,A) = 1

 Tentukan level G :

 Length P(Root(A),G)

 Length P(B,G) = (B,I) (I,E) (E,G) = 3

HIGH dari suatu tree A adalah level tertinggi ditambah 1.

WEIGHT dari suatu tree A adalah jumlah leaf dalam tree A. Contoh : Dari Tree A ; High Tree A = 3 + 1 = 4

Weight Tree A = 5 (A,C,D,G,H)

7.2 FOREST

Forest merupakan koleksi dari tree-tree. Contoh :

7.3 BINARY TREE

(69)

Contoh :

(1) (2) (3)

A

B C

D

A

B

A

B

Derajat keluar = 2 A adalah subtree kanan A adalah subtree kiri

(4) (5)

A

B

A

B C D

E F

Bukan Binary Tree tapi Bukan Binary Tree tapi General Tree General Tree karena bukan karena mempunyai derajat keluar > 2. merupakan Subtree Kiri/Kanan

7.4 SIMILAR & EKIVALEN dalam 2 BINARY TREE

(70)

Contoh :

T1 T2

A

B C

D E

X

Y Z

K L

Dua Binary Tree dikatakan Ekivalen, jika : - Similar

- Informasi setiap vertex sama. Contoh :

T3 T1

A

B C

D E

A

B C

D E

7.5 COMPLETE

Misalnya height dari binary tree T adalah k. Binary Tree T disebut COMPLETE jika jumlah verteks dari binary tree T adalah:

k-1

2 i (mencapai maximum) i = 0

(71)

4-1

2 i = (20 + 21 + 22 + 23) = 15 vertex i = 0

7.6 ALMOST COMPLETE

Misalnya height dari binary tree T adalah k. Binary Tree T disebut ALMOST COMPLETE jika :

- pada level 0 hingga level k - 2, jumlah verteksnya adalah: k-1

2 i i = 0

- pada level k - 1 verteks-verteksnya terisi dari kiri ke kanan sebagai u, dimana 1 <= u <= 2 k-1

Contoh height dari binary tree T = 4. dan mis u = 5. Gambar binary tree-nya :

4-2

(72)

7.7 HEIGHT MIN dan HEIGHT MAX Diperoleh dengan rumus sbb:

H min =  log 2 (N+1)  H max = N Keterangan :

 = Fungsi celling dengan pembulatan ke atas N = jumlah vertex

Contoh :

Diberi 7 buah vertex untuk membentuk suatu binary tree.

Hitung H min dan H max dari kemungkinan binary tree yang terbentuk. Gambar binary treenya.

Jawab : H min =  log 2 (7+1) H max = N = 7

7.8 REPRESENTASI BINARY TREE

Contoh :

A

B C

D E

A

B C

D E

Algoritma untuk merubah General Tree menjadi Binary tree:

(73)

2. Rotasi 45o sedemikian sehingga dibedakan subtree kiri dan kanan. Contoh :

(1) (2)

A

B C D E

F G H I

J K

A

B C D E

F G H I

J K

(3)

A

B

C

D

E F

G

H I

J

(74)

Algoritma untuk merubah Forest menjadi Binary tree:

1. Insert edge-edge yang menghubungkan sibling (saudara) kemudian delete semua edge yang menghubungkan parent dengan child-nya kecuali edge yang paling kiri.

2. Tree-tree yang lain dihitung sebagai satu level Contoh :

Adalah proses menelusuri suatu Binary Tree sehingga sedemikian rupa setiap vertex dikunjungi hanya 1 kali.

3 aktivitas dalam Binary tree Transversal : (1) Visit the Root

(75)

Algoritma dalam Binary Tree Transversal : 1. PRE-ORDER TRANSVERSAL

a. visit the root

b. tranverse the left subtree c. tranverse the right subtree 2. IN-ORDER TRANSVERSAL

a. tranverse the left subtree b. visit the root

c. tranverse the right subtree 3. POST-ORDER TRANSVERSAL

a. tranverse the left subtree b. tranverse the right subtree c. visit the root

Contoh : (1)

PRE-ORDER : V L R

+ + * A B C D

+

*

A B

(76)

(2)

+

*

A B

C D +

IN-ORDER : L V R

A * B + C + D

(3)

POST-ORDER : L R V

A B * C + D +

+

*

A B

C D +

+

*

A B

(77)

7.10 BINARY SEARCH TREE

Suatu Binary Search Tree dari himpunan N record (N1, N2, N3 . . . Nn) adalah suatu Binary Tree yang setiap vertex-nya (sebut Ri) ditempati oleh Ni untuk i = 1,2,3 ... N.

Vertex-vertex dari Binary Tree tsb. diatur sedemikian rupa sehingga untuk setiap Ri harus memenuhi syarat sbb :

1. Jika Rj = left (Ri) maka Nj < Ni 2. Jika Rj = right (Ri) maka Nj > Ni Contoh :

Diketahui key dari 7 record (K, M, L, N, P, O, Q) Binary Search Tree dari 7 key diatas dapat dibentuk :

K

M

L

K N

M

Operasi-operasi pada Binary Search Tree : 1. Direct Search

2. Sequential Search 3. Insert Search 4. Delete Search

7.10.1 DIRECT SEARCH

Untuk mencari vertex k dalam binary search tree dengan root=Ri , algoritmanya adalah sbb :

1. Jika tree kosong maka search tidak sukses (k tidak ada dalam binary search tree) 2. Jika k = Ni maka search sukses (k ada dalam binary search tree)

(78)

4. jika k > Ni maka subtree kanan dari Ri ditelusuri dan Ri=right (Ri) kembali ke langkah 1.

Contoh :

Carilah Key M dalam Binary Tree berikut secara Direct Search. Berapa langkah/perbandingan yang dibutuhkan untuk mencari Key M. Bandingkan dengan rootnya, jika :

- lebih besar maka cari ke kanan - lebih kecil maka cari ke kiri.

N, K, M -- 3 kali perbandingan M : N -- M < N

M : K -- M > K M : M

7.10.2 SEQUENTIAL SEARCH

Untuk mencari vertex K dalam binary search tree dengan Root=Ri.

Algoritmanya menggunakan langkah-langkah : IN-ORDER Transversal (Left Visit Right)

Contoh :

Cari key M dalam Binary Tree berikut secara sequential.

(79)

7.10.3 INSERT SEARCH

Prinsipnya sama dengan DIRECT.

4 langkah : K > A F > A D > A A = A

7.10.4 DELETE SEARCH

dilihat dari Link -list-nya.

7.11 BALANCED TREE

Suatu Binary Tree dimana untuk setiap Root Ri berlaku struktur subtree kiri = struktur subtree kanan.

Contoh :

7.12 HEIGHT BALANCED TREE

Suatu Tree dimana untuk setiap Root Ri berlaku height dari subtree kanan dan height dari subtree kiri beda paling banyak satu.

Contoh :

Height balanced Tree Bukan

sama 1 sama 2

K

F M

D H

A

(80)

Height Balanced tree belum tentu Balance Tree tapi Balance Tree sudah pasti height balance tree.

Binary tree yang Complete = Balance Tree

Balance Tree belum tentu Binary Tree Complete :

Height Balance Tree belum tentu Binary Tree Complete :

Height Balance Tree belum tentu Almost Complete :

Balance + Almost

Balance Tree = Almost Complete :

Gambar

gambar diatas. Linked list pada contoh diatas dapat pula digambarkan seperti  berikut :
Gambar binary treenya.
Tabel diatas menggambarkan algoritma insertion sort. Elemen yang dilingkari

Referensi

Dokumen terkait

Proses registrasi/her-registrasi KTA pada BPD GAPENSI jawa tengah telah menggunakan sistem informasi berbasis komputer, namun sistem informasi yang saat ini

1) Jasa Akses Internet, maksudnya adalah penyedia jasa sebuah akses internet yang diberikan kepada masyarakat untuk digunakan dan diambil manfaatnya. 2) Alat

Berdasarkan hasil penelitian yang diperoleh dapat disimpulkan bahwa terdapat perbedaan yang signifikan hasil belajar IPA siswa yang mendapat strategi pembelajaran

Ciri-ciri subjek dalam penelitian ini yaitu : lanjut usia yang telah berumur 60 tahun ke atas, lanjut usia tinggal dalam lingkungan UPTD Panti Sosial Tresna Werdha Nirwana

Persentase pemenuhan kebutuhan perlengkapan mess pemda yang disediakan Pengadaan kendaraan apung Jumlah kendaraan apung yang.

Akan tetapi hakim tetap pada Undang-Undang yang berlaku selama tidak ada perjanjian yang mengikat antara keduanya dalam membagi harta bersama selama dalam

Otitis media akut dapat dise#a#kan invasi virus Campak ke dalam telin$a ten$a!% Gendan$ telin$a #iasana !peremia pada fase prodormal dan stadium erupsi% 4ika terjadi invasi

Dalam hal ini CiWalk memiliki divisi pemeliharaan dan perawatan yang tugasnya secara umum adalah: menjaga kebersihan sarana, prasarana, dan peralatan pada bangunan