Anda di halaman 1dari 43

BAB I

PENDAHULUAN
1.1 Latar Belakang
Pemograman dalam struktur data ada beberapa macam. Salah satunya
adalah pemograman C++. Dalam pemograman ini biasanya menggunakan berbagai
variable misalnya Struktur data, pointer, Array, Linked List, stack, queue, tree,
pohon biner (binari tree) dan graph / matrik penjajian data.
Makalah ini akan membahas variabel tersebut dimana variable mempunyai
ciri dan umum yang berbeda sesuai dengan tipe file yang di gunakan pembaca.
Pemograman ini merupakan pemograman yang berbeda dari pemograman lainnya
misalnya VB, Delphi atau Pascal namun perbedaan juga tidak begitu signifikan
pada pemograman pascal.

1.2 Rumusan Masalah


Makalah ini akan membahas tentang :
1. Konsep dasar struktur data
2. Pointer
3. Array (1 dimensi, 2 dimensi dan multi/banyak)
4. Linked List,
5. Stack
6. Queue
7. Tree
8. Pohon biner (binari tree)
9. Graph / matrik penjajian data.

BAB II
PEMBAHASAN
I. Konsep Dasar Struktur Data
A. Pengertian Data
Data adalah representasi dari fakta dunia nyata. Fakta atau keterangan tentang
kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk tulisan,
suara, gambar, sinyal atau simbol.
Pengertian data ini menyiratkan suatu nilai yang bisa dinyatakan dalam bentuk
konstanta / variable.
Konstanta digunakan untuk menyatakan nilai tetap sedangkan variable
digunakan dalam program untuk menyatakan nilai yang dapat berubah-ubah selang
eksekusi berlangsung.
Ada empat istilah data, yaitu:
1. Tipe data adalah jenis atau macam data di dalam suatu variable dalam bahasa
pemrograman.
2. Objek data mengacu kumpulan elemen, D (domain).
3. Representasi data : Suatu mapping dari struktur data d ke suatu set ke
struktur data e (d===e) misal bolean di representasikan dalam 0 dan 1.
4. Struktur data biasa dipakai untuk mengelompokan beberapa informasi yang
terkait menjadi sebuah kesatuan.
Tipe data sederhana terbagi menjadi dua, yaitu:
1. Data sederhana tunggal. Misalnya : Integer, real / float, Boolean dan
character.
2. Data sederhana majemuk. Misalnya : String.
B. Pengertian Struktur Data
Struktur data adalah cara menyimpan atau merepresentasikan data didalam
komputer agar bisa dipakai secara efisien.
Sedangkan data adalah representasi dari fakta dunia nyata. Fakta atau keterangan
tentang kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk
tulisan, suara, gambar, sinyal atau simbol.

Struktur data menyangkut susunan fisik data dalam komputer dan berfungsi
agar:

Penyimpanan lebih efesien


Agar tersusun lebih terurut
Agar data retrieval lebih efektif
Struktur data diperlukan dalam perencanaan Algoritma dan penyusunan
program sebagai dasar teknik dari Database. Pemakaian struktur data yang tepat
didalam proses pemrograman akan menghasilkan algoritma yang lebih jelas dan
tepat, sehingga menjadikan program secara keseluruhan lebih efesien dan
sederhana.
Secara garis besar type data dapat dikategorikan menjadi :

Type data sederhana


Type data sederhana tunggal (Integer, real, boolean dan karakter)
Type data sederhana majemuk (String)

Struktur data
Struktur data sederhana (array dan record)
Struktur data majemuk
Linier
: Stack, Queue, serta List dan Multilist
Non Linier
: Pohon Biner dan Graph

Struktur data yang standar yang biasanya digunakan dibidang informatika adalah :

List linier (Linked List) dan variasinya Multilist


Stack (Tumpukan)
Queue (Antrian)
Tree ( Pohon )
Graph ( Graf )

C. Konstanta & Variabel


Jika dalam membuat suatu program, tentu akan sering menggunakan
bilangan numerik atau suatu kalimat string yang sama yang akan digunakan berkalikali, ada baiknya bilangan atau kalimat tersebut dijadikan sebagai suatu konstanta.
Manfaat Konstanta:
Penggunaan konstanta akan membuat program menjadi lebih mudah
dimengerti dan diperbaiki.
Penggunaan konstanta akan dapat memberikan nama yang mudah dipahami
untuk suatu bilangan numerik yang kompleks. Contoh: phi = 3.141592.
Variabel adalah sebuah identifier yang nilainya dapat diubah sesuai dengan
kebutuha program. Jika dibutuhkan sebuah variabel yang dapat dikenali oleh semua
lingkungan dalam program maka harus digunakan variabel Global. Pada C++ selalu
terdapat fungsi utama, variabel global biasanya dideklarasikan di luar fungsi utama
tersebut. Juga terdapat variabel Lokal. Variabel lokal hanya dikenali oleh suatu
fungsi saja, artinya variabel lokal tidak dikenal oleh lingkungan luar di dalam
program yang dibuat. Variabel lokal harus berada dalam lingkup fungsi tertentu.
II. POINTER
Pointer merupakan tipe data berukuran 32 bit yang berisi satu nilai yang
berpadanan dengan alamat memori tertentu. Sebagai contoh, sebuah variabel P bertipe
pointer bernilai 0x0041FF2A, berarti P menunjuk pada alamat memori 0041FF2A.
Pointer dideklarasikan seperti variabel biasa dengan menambahkan tanda * (asterik)
yang mengawali nama variabel.
Bentuk Umum:
<tipe data> namaVariabel;
Contoh:

float * px;
Statement di atas mendeklarasikan variabel px yang merupakan pointer.
Penyebutan tipe data float berarti bahwa alamat memori yang ditunjuk oleh px
dimaksudkan untuk berisi data bertipe float.
Contoh Program:
1:

Output:

2.

Output:

3.

Output:
SELAMAT DATANG FACROROZI
III. ARRAY
1. Pengertian
Array adalah suatu struktur yang terdiri dari sejumlah elemen yang memiliki
tipe data yang sama. Elemen-elemen array tersusun secara sekuensial dalam memori
komputer. Array dapat berupa satu dimensi, dua dimensi, tiga dimensi ataupun
banyak dimensi (multi dimensi).
2. Array Satu Dimensi

Array Satu dimensi tidak lain adalah kumpulan elemen-elemen identik yang
tersusun dalam satu baris. Elemen-elemen tersebut memiliki tipe data yang sama,
tetapi isi dari elemen tersebut boleh berbeda.
Elemen keNilai

23

34

32

12

25

14

23

12

11

10

Bentuk umum:
<tipe data> NamaArray[n] = {elemen0, elemen1, elemen2,.....,n};
n = jumlah elemen

Contoh Program:
1.

Output:

Nilai maksimum

: 76

Nilai minimum

: 12

3. Array Dua Dimensi


Array dua dimensi sering digambarkan sebagai sebuah matriks, merupakan
perluasan dari array satu dimensi. Jika array satu dimensi hanya terdiri dari sebuah
baris dan beberapa kolom elemen, maka array dua dimensi terdiri dari beberapa baris

dan beberapa kolom elemen yang bertipe sama sehingga dapat digambarkan sebagai
berikut:
0
10
45
32
11

3
1
2
3

1
21
43
34
12

2
23
65
23
32

3
43
12
56
23

4
45
21
54
56

5
78
12
34
76

6
65
21
45
45

Bentuk umum:
<tipe data> NamaArray [m][n];
Atau
<tipe data> NamaArray [m][n] = { {a,b,..z},{1,2,...,n-1} };
Contoh:
double matrix[4][4];
bool papan[2][2] = { {true,false},{true,false} };
Pendeklarasian array dua dimensi hampir sama dengan pendeklarasian array satu dimensi,
kecuali bahwa array dua dimensi terdapat dua jumlah elemen yang terdapat di dalam kurung
siku dan keduanya boleh tidak sama.
Elemen array dua dimensi diakses dengan menuliskan kedua indeks elemennya dalam kurung
siku seperti pada contoh berikut:
//papan nama memiliki 2 baris dan 5 kolom
bool papan[2][5];
papan[0][0] = true;
papan[0][4] = false;
papan[1][2] = true;
papan[1][4] = false;
Contoh program: 1.

10

Output:

11

12

Output:

13

4. Array multidimensi
- Array multidimensi merupakan array yang mempunyai ukuran lebih dari dua.
Bentuk pendeklarasian array multidimensi sama saja dengan deklarasi array
dimensi satu maupun dimensi dua.
-

Deklarasi array :
Tipe_array nama_array [ukuran 1][ukuran 2] . . . [ukuran N]
Int nilai[10][5][5];

Struktur Data Dinamis (jumlah komponennya dapat berubah) contoh: Pointer


Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat memori
dari suatu variabel lain. Alamat ini merupakan lokasi dari obyek lain (biasanya
variabel lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat dari
variabel lain, variabel pertama dikatakan menunjuk ke variabel kedua.
Operator Pointer ada dua, yaitu :
Operator &

Operator & bersifat unary (hanya memerlukan satu operand saja).

Operator & menghasilkan alamat dari operandnya.

14

Operator *

Operator * bersifat unary (hanya memerlukan satu operand saja).

Operator * menghasilkan nilai yang berada pada sebuah alamat.

IV. LINKED LIST


Linked List adalah salah satu bentuk struktur data, berisi kumpulan data (node)
yang tersusun secara sekuensial, saling sambung-menyambung, dinamis dan terbatas.

Linked List sering disebut juga Senarai Berantai

Linked List saling terhubung dengan bantuan variabel pointer

Masing-masing data dalam Linked List disebut dengan node (simpul) yang
menempati alokasi memori secara dinamis dan biasanya berupa struct yang
terdiri dari beberapa field.

1. Single Linked List


Apabila setiap Anda ingin menambahkan data, Anda selalu menggunakan
variabel pointer yang baru, Anda akan membutuhkan banyak sekali pointer. Oleh
karena itu, ada baiknya jika Anda hanya menggunakan satu variabel pointer saja
untuk menyimpan banyak data dengan metode yang kita sebut Linked List. Jika
diterjemahkan, ini berarti satu daftar isi yang saling berhubungan. Untuk lebih
jelasnya, perhatikan gambar di bawah ini:

Pada gambar di atas tampak bahwa sebuah data terletak pada sebuah lokasi
memori area. Tempat yang disediakan pada satu area memori tertentu untuk
menyimpan data dikenal dengan sebutan node/simpul. Setiap node memiliki pointer

15

yang menunjuk ke simpul berikutnya sehingga terbentuk satu untaian, degan


demikian hanya diperlukan sebuah variabel pointer. Susunan berupa untaian
semacam ini disebut Single Linked List (NULL memilik nilai khusus yang artinya
tidak menunjuk ke mana-mana. Biasanya Linked List pada titik akhirnya akan
menunjuk ke NULL).
Pembuatan Single Linked List dapat menggunakan 2 metode:

LIFO (Last In First Out), aplikasinya : Stack (Tumpukan)

FIFO (First In First Out), aplikasinya : Queue (Antrean)

LIFO ( Last In First Out)


Lifo adalah suatu metode pembuatan Linked List di mana data yang masuk
paling akhir adalah data yang keluar paling awal. Hal ini dapat di analogikan (dalam
kehidupan sehari-hari) dengan saat Anda menumpuk barang seperti digambarkan
dibawah ini. Pembuatan sebuah simpul dalam suatu linked list seperti digambarkan
dibawah ii, disebutkan istilah INSERT, Jika linked list dibuat dengan metode LIFO,
terjadi penambahan / Insert simpul di belakang.

Gambar. Ilustrasi Single Linked List dengan metode LIFO

FIFO (Fisrt In Fisrt Out)


FIFO adalah suatu metode pembuatan Linked List di mana data yang masuk paling
awal adalah data yang keluar paling awal juga. Hal ini dapat di analogikan (dalam
kehidupan sehari-hari), misalnya saat sekelompok orang yang datang (ENQUEUE)
mengantri hendak membeli tiket di loket.

16

Jika linked list dibuat dengan metode FIFO, terjadi penambahan / Insert simpul
didepan.
2. Operasi Pada Single Linked List Insert
Istilah Insert berarti menambahkan sebuah simpul baru ke dalam suatu linked list.
Procedure dan Function Linked List Lainnya
Selain fungsi insert di atas, pada linked list juga terdapat fungsi-fungsi lainnya. Di
bawah ini diberikan fungsi-fungsi umum dalam aplikasi linked list.
Konstruktor
Fungsi ini membuat sebuah linked list yang baru dan masih kosong.
IsEmpty
Fungsi ini menentukan apakah linked list kosong atau tidak.
Find First
Fungsi ini mencari elemen pertama dari linked list
Find Next
Fungsi ini mencari elemen sesudah elemen yang ditunjuk now.
Retrieve
Fungsi ini mengambil elemen yang ditunjuk oleh now. Elemen tersebut lalu
dikembalikan oleh fungsi.
Update
Fungsi ini mengubah elemen yang ditunjuk oleh now dengan isi dari sesuatu.
Delete Now
Fungsi ini menghapus elemen yang ditunjuk oleh now. Jika yang dihapus adalah
elemen pertama dari linked list (head), head akan berpindah ke elemen berikut.
Delete Head
Fungsi ini menghapus elemen yang ditunjuk head. Head berpindah ke elemen
sesudahnya.
Clear
Fungsi ini menghapus linked list yang sudah ada. Fungsi ini wajib dilakukan bila
anda ingin mengakhiri program yang menggunakan linked list. Jika anda
melakukannya,

17

data-data uang dialokasikan ke memori pada program sebelumnya akan tetap


tertiinggal di dalam memori.
3. Double Linked List
Salah satu kelemahan single linked list adalah pointer (penunjuk) hanya dapat
bergerak satu arah saja, maju/ mundur, atau kanan/kiri sehingga pencarian data pada
single linked list hanya dapat bergerak dalam satu arah saja. Untuk mengatasi
kelemahan tersebut, anda dapat menggunakan metode double linked list. Linked list
ini dikenal dengan nama Linked list berpointer Ganda atau Double Linked List.
Operasi operasi pada Double Linked List Insert Tail
Fungsi insert tail berguna untuk menambah simpul di belakang (sebelah kanan) pada
sebuah linked list.
Insert Head
Sesuai dengan namanya, fungsi Insert Head berguna untuk menambah simpul di
depan (sebelah kiri). Fungsi ini tidak berada jauh dengan fungsi Insert Tail yang telah
dijelaskan sebelumnya.
Delete Tail
Fungsi Delete Tail berguna untuk menghapus simpul dari belakang. Fungsi ini
merupakan kebalikan dari fungsi Insert Tail yang menambah simpul dibelakang.
Fungsi Delete Tail akan mengarahkan Now kepada Tail dan kemudian memanggil
fungsi Delete Now.
Delete Head
Fungsi Delete Head merupakan kebalikan dari fungsi Delete Tail yang menghapus
simpul dari belakang, sedangkan Delete Head akan menghapus simpul dari depan
(sebelah kiri). Fungsi Delete Head akan mengarahkan Now kepada Head dan
kemudianm memanggil fungsi Delete Now.
Delete Now
Fungsi Delete Now berguna untuk menghapus simpul pada posisi yang sedang
ditunjuk oleh Now.

18

Circular Double Linked List


Ini adalah double linked list yang simpul terakhirnya menunjuk ke simpul
terakhirnya menunjuk ke simpul awalnya menunjuk ke simpul akhir sehingga
membentuk suatu lingkaran.
Operasi-operasi pada Circular Double Linked List Insert Tail
Fungsi insert Tail berguna untuk menambah simpul di belakang (sebelah kanan) pada
sebuah circular double linked list.
Insert Head
Sesuai dengan namanya, fungsi Insert Head berguna untuk menambah simpul di
depan (sebelah kiri). Fungsi ini tidak berbeda jauh dengan fungsi Insert tail yang
telah dijelaskan sebelumnya.
Delete Tail
Fungsi Delete Tail berguna untuk menghapus simpul dari belakang. Fungsi ini
kebalikan dari fungsi Insert Tail yang menambah simpul dibelakang.
Delete Head
Fungsi Delete Head merupakan kebalikan dari fungsi Delete Tail yang menghapus
simbul dari belakang. Delete Head akan menghapus simpul dari depan (sebelah kiri).
Delete Now
Fungsi Delete Now, sesuai dengan namanya, berguna untuk menghapus simpul pada
posisi yang diinginkan.
Contoh Program: 1.

19

20

Output:

V. STACK
1. Definisi Stack
Stack adalah suatu tumpukan dari benda. Konsep utamanya adalah LIFO
(Last In First Out), benda yang terakhir masuk dalam stack akan menjadi benda
pertama yang dikeluarkan dari stack.

Pada gambar diatas, jika kita ingin mengambil sesuatu dari tumpukan maka
kita harus mengambil benda paling atas dahulu, yakni compo. Misalnya jika VCD
langsung diambil, compo akan jatuh. Prinsip stack ini bias diterapkan dalam
pemrograman. Di C++, ada dua cara penerapan prinsip stack, yakni dengan array dan
linked list. Setidaknya stack haruslah memiliki operasi-operasi sebagai berikut.
Push

Untuk menambahkan item pada tumpukan paling atas

Pop

Untuk mengambil item teratas

Clear

Untuk mengosongkan stack

IsEmpty

Untuk memeriksa apakah stack kosong

IsFull

Untuk memeriksa apakah stack sudah penuh


Dalam bab ini penjelasan mengenai stack akan menggunakan kelas stack.

Kelima operasi stack diatas akan dideklarasikan secara abstrak dalam kelas ini,

21

sedangkan kelas turunan dari stack akan mengimplementasikan operasi-operasi


tersebut.
2. Stack dengan Array
Sesuai dengan sifat stack, pengambilan / penghapusan delemen dalam stack
harus dimulai dari elemen teratas.
Operasi-operasi pada Stcak dengan Array
Konstruktor
Fungsi ini membuat sebuah stack baru yang masih kosong. Konsepnya adalah
bahwa Top menunjukkan elemen stack teratas. Jika Top bernilai -1, berarti tumpukan
kosong.
IsFul
Fungsi ini memeriksa apakah stack yang ada sudah penuh. Stack penuh jika stack
penuh jika puncak stack terdapat tepat dibawah jumlah maksimum yang dapat
ditampung stack atau dengan kata lain Top = MAX_STACK -1.
Push
Fungsi ini menambahkan sebuah elemen ke dalam stack dan tidak bias dilakukan lagi
jika stack sudah penuh.
IsEmpty
Fungsi menentukan apakah stack kosong atau tidak. Tanda bahwa stack kosong
adalah Top bernilai kurang dari nol.
Pop
Fungsi ini mengambil elemen teratas dari stack dengan syarat stack tidak boleh
kosong.
Clear
Fungsi ini mengosongkan stack dengan cara mengeset Top dengan -1. Jika Top
bernilai kurang dari nol maka stack dianggap kosong.
3. Double Stack dengan Array
Metode ini adalah teknik khusus yang dikembangkan untuk menghemat pemakaian
memori dalam pembuatan dua stack dengan array. Intinya adalah penggunaan hanya
sebuah array untuk menampung dua stack.

22

Tampak jelas bahwa sebuah array dapat dibagi untuk dua stack, stack 1 bergerak ke
atas dan stack 2 bergerak ke bawah. Jika Top1 (elemen teratas dari Stack 1) bertemu
dengan Top 2 (elemen teratas dari Stack 2) maka double stack telah penuh.
Implementasi double stack dengan array adalah dengan memanfaatkan operasioperasi yang tidak berbeda jauh dengan operasi single stack dengan array. Operasioperasi Double Stack Array Konstruktor
Fungsi ini membuat stack baru yang masih kosong. Top[0] diset dengan -1 dan
Top[1] diset dengan MAX_STACK.
IsFull
Fungsi ini memeriksa apakah double stack sudah penuh. Stack dianggap penuh jika
Top[0] dan Top[1] bersentuhan sehingga stack tida memiliki ruang kosong. Dengan
kata lain, (Top[0] + 1) > Top[1].
Push
Fungsi ini memasukkan sebuah elemen ke salah satu stack.
IsEmpty
Fungsi memeriksa apakah stack pertama atau stack kedua kosong. Stack pertama dianggap
kosong jika puncak stack bernilai kurang dari nol, sedangkan stack kedua dianggap kosong
jika puncak stack sama atau melebihi MAX_STACK.
Pop
Fungsi ini mengeluarkan elemen teratas dari salah satu stack
Clear
Fungsi ini mengosongkan salah satu stack.

4. Stack dengan Single Linked List


Selain implementasi stack dengan array seperti telah dijelasnkan sebelumnya, ada cara lain
untuk mengimplementasi stack dalam C++, yakni dengan single linked list. Keunggulannya
dibandingkan array tebtu saja adalah penggunaan alokasi memori yang dinamis sehingga
menghindari pemborosan memori. Misalnya saja pada stack dengan array disediakan tempat
untuk stack berisi 150 elemen, sementara ketika dipakai oleh user stack hanya diisi 50
elemen, maka telah terjadi pemborosan memori untuk sisa 100 elemen, yang tak terpakai.
Dengan penggunaan linked list maka tempat yang disediakan akan sesuai dengan banyaknya
elemen yang mengisi stack. Oleh karena itu pula dalam stack dengan linked list tidak ada

23

istilah full, sebab biasanya program tidak menentukan jumlah elemen stack yang mungkin
ada (kecuali jika sudah dibatasi oleh pembuatnya). Namun demikian sebenarnya stack ini
pun memiliki batas kapasitas, yakni dibatasi oleh jumlah memori yang tersedia.
Operasi-operasi untuk Stack dengan Linked List
Konstruktor
Fungsi ini membuat stack baru yang kosong. Stack adalah kosong jika Top tidak menunjuk
apa pun (bernilai NULL).
IsEmpty
Fungsi memeriksa apakah stack yang adamasih kosong.
Push
Fungsi memasukkan elemen baru ke dalam stack. Push di sini mirip dengan insert dalam
single linked list biasa.
Pop
Fungsi ini mengeluarkan elemen teratas dari stack.
Clear
Fungsi ini akan menghapus stack yang ada.
Contoh Program:
1. Menggunakan Borland C++ Builder 6

24

Output:

VI. QUEUE
1. Definisi Queue
Jika diartikan secara harafiah, queue berarti antrian, queue merupakan salah satu contoh
aplikasi dari pembuatan double linked list

yang cukup sering kita temui dalam

kehiduypan sehari-hari, misalnya saat Anda mengantri di loket untuk membeli tiket. Istilah
yang cukup sering dipakai seseorang masuk dalam sebuah antrian adalah enqueue. Dalam
suatu antrian, yang dating terlebih dahulu akan dilayani lebih dahulu. Istilah yang sering
dipakai bila seseorang keluar dari antrian adalah dequeue. Walaupun berbeda
implementasi, struktur data queue setidaknya harus memiliki operasi-operasi sebagai
berikut :
EnQueue

Memasukkan data ke dalam antrian

DeQueue

Mengeluarkan data terdepan dari antrian

Clear

Menghapus seluruh antrian

IsEmpty

Memeriksa apakah antrian kosong

IsFull

Memeriksa apakah antrian penuh

2. Implementasi Queue dengan Linear Array


Linear Array
Linear array adalah suatu array yang dibuat seakan-akan merupakan suatu garis lurus dengan
satu pintu masuk dan satu pintu keluar.
Berikut ini diberikan deklarasi kelas Queue Linear sebagai implementasi dari Queue
menggunakan linear array. Dalam prakteknya, anda dapat menggantinya sesuai dengan
kebutuhan Anda. Data diakses dengan field data, sedangkan indeks item pertama dan terakhir
disimpan dalam field Head dan Tail. Konstruktor akan menginisialisasikan nilai Head dan
Tail dengan -1 untuk menunjukkan bahwa antrian masih kosong dan mengalokasikan data
sebanyak MAX_QUEUE yang ditunjuk oleh Data. Destruktor akan mengosongkan antrian
kembali dan mendealokasikan memori yang digunakan oleh antrian.

25

Operasi-operasi Queue dengan Linear Array


Konstruktor
Konstruktor berguna untuk menciptakan queue yang baru dan kosong dengan memberikan
nilai awal (head) dan nilai akhir (tail) dengan -1. Nilai -1 menunjukkan bahwa queue
(antrian) masih kosong.
IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah queue masih kosong atau sudah berisi data.
hal ini dilakukan dengan mengecek apakah tail bernilai -1 atau tidak. Nilai -1 menandakan
bahwa queue masih kosong.
IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau masih bisa
menampung data dengan cara mengecek apakah nilai tail sudah sama dengan jumlah
maksimal queue. Jika nilai keduanya sama, berarti queue sudah penuh.
EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen dalam queue.
DeQueue
Fungsi DeQueue berguna untuk mengambil sebuah elemen dari queue. Operasi ini sering
disebut juga serve. Hal ini dilakukan dengan cara memindahkan sejauh satu langkah ke
posisi di depannya sehingga otomatis elemen yang paling depan akan tertimpa dengan
elemen yang terletak di belakangnya.
Clear
Fungsi Clear berguna untuk menghapus semua lemen dalam queue dengan jalan
mengeluarkan semua elemen tersebut satu per satu hingga queue kosong dengan
memanfaatkan fungsi DEQueue.

3. Implementasi Queue dengan Circular Array


Circular Array
Circular array adalah suatu array yang dibuat seakan-akan merupakan sebuah lingkaran
dengan titik awal (head) dan titik akhir (tail) saling bersebelahan jika array tersebut masih
kosong.
Posisi head dan tail pada gambar diatas adalah bebas asalkan saling bersebelahan. Berikut ini
diberikan deklarasi kelas Queue Circular sebagai implementasi circular array. Dalam
prakteknya, Anda dapat menggantikanny sesuai dengan kebutuhan Anda. Data diakses
dengan field data, sedangkan indeks itemn pertama dan terakhir disimpan dalam field Head
dan Tail. Konstruktor akan menginisialisasi nilai Head dan Tail dengan 0 dan MAX-

26

QUEUE-1 untuk menunjukkan bahwa antrian masih kosong dan mengalokasikan data
sebanyak MAX-QUEUE yang ditunjuk oleh Data. destruktor akan mengosongkan antrian
kembali dan mendealokasikan memori yang digunakan oleh antrian.
Operasi-operasi Queue dengan Circular Array
Konstruktor
Konstruktor berguna untuk menciptakan queue yang baru dan kosong, yaitu dengan cara
memberikan nilai awal (head) dengan nol (0) dan nilai akhir (tail) dengan jumlah maksimal
data yang akan di tampung/array.
IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah Queue masih kosong atau sudah berisi. Hal
ini dilakukan dengan mengecek apakah tail masih terletak bersebelahan dengan head dan tail
lebih besar dari head atau tidak. Jika benar, maka queue masih kosong.
IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau masih bias
menampung data dengan cara mengecek apakah tempat yang masih kosong tinggal satu atau
tidak (untuk membedakan dengan empty dimana semua tempat kosong). Jika benar berarti
queue penuh.
EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen ke dalam queue tail dan head
mula-mula bernilai nol (0).
DeQueue
DeQueue berguna untuk mengambil sebuah elemen dari queue. Hal ini dilakukan dengan
cara memindahkan posisi head satu langkah ke belakang.

7.4. Implementasi Queue dengan Double Linked List


Selain menggunakan array, queue juga dapat dibuat dengan linked list. Metode linked list
yang digunakan adalah double linked list.
Operasi-operasi Queue dengan Double Linked List
Konstruktor
Konstruktor berguna untuk menciptakan queue yang baru dan kosong, yaitu dengan
mengarahkan pointer head dan tail kepada NULL.
IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah queue masih kosong atau sudah berisi data.
Hal ini dilakukan dengan mengecek apakah head masih menunjukkan pada Null atau tidak.
Jika benar berarti queue masih kosong.

27

IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah penuh atau masih bias
menampung data dengan cara mengecek apakah Jumlah Queue sudah sama dengan
MAX_QUEUE atau belum. Jika benar maka queue sudah penuh.
EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen ke dalam queue (head dan tail
mula-mula meunjukkan ke NULL).
DeQueue
Procedure DeQueue berguna untuk mengambil sebuah elemen dari queue. Hal ini dilakukan
dengan cara menghapus satu simpul yang terletak paling depan (head).
Contoh Program:

28

29

30

31

Output:

VII. TREE
1. Definisi Tree
Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan hubungan
yang bersifat hierarkis (hubungan one to many) antara elemen-elemen. Tree bias didefinisikan
sebagai kumpulan simpul/node dengan elemen khusus yang disebut Root. Notde lainnya terbagi
menjadi himpunan-himpunan yang saling tak berhubungan satu sama lain (disebut Subtree).
Untuk lebih jelasnya, di bawah akan diuraikan istilah-istilah umum dalam tree.
Predecessor

Node yang berada di atas node tertentu

Successor

Node yang berada dibawah node tertentu

Ancestor

Seluruh node yang terletak sebelum node tertentu dan terletak


pada jalur yang sama

Descendant

Seluruh node yang terletak sebelum node tertentu dan terletak


pada jalur yang sama

Parent

Predecessor satu level di atas suatu node

Child

Successor satu level di bawah suatu node

Sibling

Node-node yang memiliki parent yang sama dengan suatu


node

Subtree

Bagian dari tree yang berupa suatu node beserta descendantnya


dan memiliki semua karakteristik dari tree tersebut.

Size

Banyaknya node dalam suatu tree

Height

Banyaknya tingkatan / level dalam suatu tree

Root

Satu-satunya node khusus dalam tree yang tak punyak

32

predecessor
Leaf

Node-node dalam tree yang tak memiliki successor

Degree

Banyaknya child yang dimiliki suatu node

2. Jenis-jenis Tree
Binary Tree
Binary Tree adalah tree dengan syarat bahwa tiap node hanya boleh memiliki maksimal dua
subtree dan kedua subtree tersebut harus terpisah. Sesuai dengan definisi tersebut tiap node
dalam binary tree hanya boleh memiliki paling banyak dua child. Jenis- Jenis Binary Tree :
Full Binary Tree
Jenis binary tree ini tiap nodenya (kecuali leaf) memiliki dua child dan tiap subtree harus
mempunyai panjang path yang sama.
Complete Binary Tree
Jenis ini mirip dengan Full Binary Tree, namun tiap subtree boleh memiliki panjang path
yang berbeda dan setiap node kecuali leaf hanya boleh memiliki 2 child.
Skewed Binary Tree
Skewed Binary Tree adalah Binary Tree yang semua nodenya (kecuali leaf) hanya memiliki
satu child.
Implementasi Binary Tree
Binary tree dapat diimplementasikan dalam C++ dengan menggunakan double
linkedlist.

VIII. Binary Tree (Pohon Biner)


Dalam mata kuliah struktur data, secara khusus akan dipelajari mengenai
pohon biner. Pohon biner adalah sebuah tree yang pada masing-masing
simpulnya hanya dapat memiliki maksimum 2 (dua) simpul anak. Tidak boleh
lebih. Pada pohon biner, umumnya kedua node anak disebut dengan
posisinya, yaitu kiri dan kanan.
Beberapa istilah pada pohon biner:

Size (ukuran): jumlah total node yang terdapat pada pohon biner tersebut.

Depth (kedalaman): panjang jalur yang menghubungkan sebuah node


sampai ke node anaknya yang paling ujung (leaf). Depth biasa juga
disebut height.

33

Full Binary Tree (Pohon Biner Penuh) adalah pohon biner yang setiap
nodenya pasti memiliki 0 atau 2 node anak. Perfect Binary Tree (Pohon Biner
Sempurna) adalah pohon biner yang semua node leafnya berada pada
kedalaman yang sama dari node root. Juga disebut sebagai Complete Binary
Tree (Pohon Biner Lengkap) Almost Complete Binary Tree (Pohon Biner
Hampir Lengkap) adalah pohon biner yang setiap nodenya dapat memiliki 0
node anak, atau memiliki kiri, atau jika memiliki kanan harus memiliki kiri.
Tidak boleh memiliki kanan saja.
Ilustrasi Binary Tree: Contoh Binary Tree / Pohon Biner

Implementasi
Implementasi dalam pemrograman, dalam pokok bahasan ini akan dibicarakan untuk
pohon biner saja. Asumsi awal adalah data yang hendak dimasukkan ke dalam node,
bertipe data integer.
1. Deklarasi Tree
Karena tree tersusun oleh node-node, maka yang perlu kita deklarasikan adalah
komponen node itu sendiri. Dalam contoh dibawah, akan kita namai Node.
Sebelumnya perlu kita lihat bahwa untuk mewujudkan implementasi node ke
dalam bahasa pemrograman, diperlukan sebuah struktur yang memiliki susunan
berikut ini:

34

Variabel data digunakan untuk menyimpan nilai angka node tersebut, sedangkan
kiri dan kanan, bertipe pointer, masing-masing mewakili vektor yang akan
menunjuk ke node anak kiri dan kanan.
2. Inisialisasi Tree
Untuk pertama kali, saat kita akan membuat sebuah pohon biner, asumsi awal
adalah pohon itu belum bertumbuh, belum memiliki node sama sekali, sehingga
masih kosong. Oleh karena itu perlu kita tambahkan kode berikut pada baris awal
fungsi Main:

nama *pohon. Pointer ini ditujukan untuk menunjuk struktur bertipe Node, yang
telah dibuat pada bagian 1. Karena pohon tersebut sama sekali belum memiliki
node, maka pointer *pohon ditunjukkan ke NULL.
3. Menambahkan Node Pada Tree
Karena pohon yang kita buat merupakan sebuah pohon biner, maka untuk
menambahkan sebuah node, secara otomatis penambahan tersebut mengikuti
aturan penambahan node pada pohon biner:
1. Jika pohon kosong, maka node baru ditempatkan sebagai akar pohon.
2. Jika pohon tidak kosong, maka dimulai dari node akar, dilakukan proses
pengecekan berikut:
a. Jika nilai node baru lebih kecil dari nilai node yang sedang dicek, maka lihat
ke kiri node tersebut. Jika kiri node tersebut kosong (belum memiliki kiri),
maka node baru menjadi kiri node yang sedang dicek. Seandainya kiri node
sudah terisi, lakukan kembali pengecekan a dan b terhadap node kiri
tersebut. Pengecekan ini dilakukan seterusnya hingga node baru dapat
ditempatkan.

35

b. Jika nilai node baru lebih besar dari nilai node yang sedang dicek, maka
lihat ke kanan node tersebut. Jika kanan node tersebut kosong (belum
memiliki kanan), maka node baru menjadi kanan node yang sedang dicek.
Seandainya kanan node sudah terisi, lakukan kembali
pengecekan a dan b terhadap node kanan tersebut. Pengecekan ini dilakukan
seterusnya hingga node baru dapat ditempatkan.
Proses penambahan ini diimplementasikan secara rekursif pada fungsi berikut:

Variabel **root menunjukkan node mana yang sedang dicek saat ini, untuk itu
saat pemanggilan fungsi ini, variabel **root kita beri nilai pointer yang menunjuk
ke node akar, yaitu pohon.
tambah( Jipohon, data)
Untuk selengkapnya dapat dilihat pada bagian 5, kode program lengkap.
4. Membaca dan Menampilkan Node Pada Tree
Untuk membaca dan menampilkan seluruh node yang terdapat pada pohon biner,
terdapat 3 macam cara, atau yang biasa disebut kunjungan (visit). Semua
kunjungan diawali dengan mengunjungi akar pohon. Karena proses kunjungan ini
memerlukan perulangan proses yang sama namun untuk depth (kedalaman) yang
berbeda, maka ketiganya diimplementasikan dengan fungsi rekursif.

36

a.

Kunjungan Pre-Order.
Kunjungan pre-order dilakukan mulai dari akar pohon, dengan urutan:

Cetak isi (data) node yang sedang dikunjungi

Kunjungi kiri node tersebut,

Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama, terapkan
untuk kiri
(NULL), lanjut ke langkah ketiga. 3.
Kunjungi kanan node tersebut,

b.

Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kanan tersebut.

Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan
proses yang sama untuk node yang dikunjungi sebelumnya.

Kunjungan In-Order.
1. Kunjungi kiri node tersebut,
- Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kiri tersebut.
- Jika kiri kosong (NULL), lanjut ke langkah kedua.
2. Cetak isi (data) node yang sedang dikunjungi
3. Kunjungi kanan node tersebut,
- Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk
kanan tersebut.

37

- Jika kanan kosong (NULL), proses untuk node ini selesai, tuntaskan proses
yang sama
untuk node yang dikunjungi sebelumnya.

c.

Kunjungan Post-Order.
1. Kunjungi kiri node tersebut,

Jika kiri bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kiri tersebut.

Jika kiri kosong (NULL), lanjut ke langkah kedua.

2. Kunjungi kanan node tersebut,

Jika kanan bukan kosong (tidak NULL) mulai lagi dari langkah pertama,
terapkan untuk kanan tersebut.

Jika kanan kosong (NULL), lanjut ke langkah ketiga.

3. Cetak isi (data) node yang sedang dikunjungi. Proses untuk node ini selesai,
tuntaskan proses yang sama untuk node yang dikunjungi sebelumnya.

Variabel **root pada setiap fungsi diatas menunjukkan node mana yang sedang
dikunjungi saat ini, untuk itu saat pemanggilan, variabel **root kita beri nilai
pointer yang menunjuk ke node akar, yaitu pohon.

38

5. Kode Program Lengkap


Berikut ini kode program keseluruhan, termasuk menu tampilan, di mana di
dalamnya terdapat Deklarasi Tree, Inisialisasi Tree, Penambahan Node, dan
Pembacaaan serta Menampilkan Node dengan 3 macam kunjungan. Kode ditulis
dengan C++ 3.00.
IX. GRAPH (GRAF) DAN MATRIK PENYAJIAN DATA
1. Pengertian
Graph merupakan struktur data yang paling umum. Jika struktur linier
memungkinkan pendefinisian keterhubungan sekuensial antara entitas data, struktur
data tree memungkinkan pendefinisian keterhubungan hirarkis, maka struktur graph
memungkinkan pendefinisian keterhubungan tak terbatas antara entitas data. Banyak
entitas-entitas data dalam masalah-masalah nyata secara alamiah memiliki
keterhubungan langsung (adjacency) secara tak terbatas demikian. Contoh: informasi
topologi dan jarak antar kota-kota di pulau Jawa.
Dalam masalah ini kota X bisa berhubungan langsung dengan hanya satu atau
lima kota lainnya. Untuk memeriksa keterhubungan dan jarak tidak langsung antara
dua kota dapat diperoleh berdasarkan data keterhubungan-keterhubungan langsung
dari kota-kota lainnya yang memperantarainya. Representasi data dengan struktur
data linier ataupun hirarkis pada masalah ini masih bisa digunakan namun akan
membutuhkan pencarian-pencarian yang kurang efisien. Struktur data graph secara
eksplisit

menyatakan

keterhubungan

ini

sehingga

pencariannya

langsung

(straightforward) dilakukan pada strukturnya sendiri.


2. Matriks Penyajian Graph
Matriks Adjacency dari Graph G, yaitu Matriks yang menghubungkan Vertex dengan
Vertex, tanpa ruas sejajar adalah Matriks A berukuran (NxN).
Matriks Adjacency merupakan matriks simetri.
Matriks Incidence dari Graph, yaitu Matriks yang menghubungkan Vertex dengan
edge, tanpa self-loop diefinisikan sebagai matriks M berukuran (NxM).

39

Graph Terarah (Directed Graph / Digraph)


Graph terarah adalah grap yang dapat menghubungkan V1 ke V2 saja (1 arah).
Maksimum jumlah busur dari n simpul adalah :
Graph Tak Terarah (Undirected Graph)
Graph tak terarah adalah graph yang menghubungkan 2 vertex V1 ke V2 dan V2 ke
V1 (2 arah). Bila Vertex = n, maka Graph tak terarah komplit akan mempunyai busur
edge sama dengan :
Penelusuran graph
Dapat dilakukan dengan 2 cara, yaitu :
1. Depth First Search (DFS)
Penelusuran dengan DFS pada graph tak berarah dengan melakukan pengecekan
pada node dengan kedalaman pertama dari node yang ditinjau.
2. Breadh First Searh (BFS)
Berbeda dengan cara BFS, dengan BFS penelusuran akan diawasi dari node-1,
kemudian melebar pada Adjacent Node dari Node-1 dan diteruskan pada Node-2,
Node-3 dan seterusnya.
Contoh : Matriks Penyajian Graph

contoh bahwa G graf dengan N simpul dan M ruas. Untuk mempermudah komputasi,
graf dapat disajikan dalam bentuk matriks, disebut Matriks Ruas, yang berukuran (2
x M) atau (M x 2) yang menyatakan ruas dari graf.
Matriks adjacency dari graf G tanpa ruas sejajar adalah matriks A berukuran (N x N),
yang bersifat :
1, bila ada ruas (vi, vj)
a = 0, dalam hal lain

40

Matriks adjacency merupakan matriks simetri.


Untuk graph dengan ruas sejajar, matriks adjacency didefinisikan
sebagai berikut :
p, bila ada p buah ruas menghubungkan (vi, vj) (p > 0)
a = 0, dalam hal lain
Matriks Incidence dari graf G, tanpa self-loop didefinisikan sebagai
matriks M berukuran (N x M)
1, bila ruas ej berujung di simpul vi,
m = 0, dalam hal lainGRAF BERARAH (DIGRAF)
Suatu graf berarah (digraf) D terdiri atas 2 himpunan :
1. Himpunan V, anggotanya disebut simpul
2. Himpunan A, merupakan himpunan pasangan terurut, yang
disebut ruas berarah atau arkus.
Notasi : D(V, A)
Simpul, anggota v, digambarkan sebagai titik (atau lingkaran
kecil). Sedangkan arkus a=(u,v), digambarkan sebagai garis
dilengkapi dengan tanda panah mengarah dari simpul u ke simpul
v. Simpul u disebut titik pangkal, dan simpul v disebut titik terminal
dari arkus tersebut.

41

BAB III
PENUTUP
A. Kesimpulan
Data adalah representasi dari fakta dunia nyata. Fakta atau keterangan tentang
kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk tulisan,
suara, gambar, sinyal atau simbol. Pengertian data ini menyiratkan suatu nilai yang
bisa dinyatakan dalam bentuk konstanta

/ variable. Konstanta digunakan untuk

menyatakan nilai tetap sedangkan variable digunakan dalam program untuk


menyatakan nilai yang dapat berubah-ubah selang eksekusi berlangsung.
Struktur data adalah cara menyimpan atau merepresentasikan data didalam
komputer agar bisa dipakai secara efisien. Sedangkan data adalah representasi dari
fakta dunia nyata. Fakta atau keterangan tentang kenyataan yang disimpan, direkam
atau direpresentasikan dalam bentuk tulisan, suara, gambar, sinyal atau simbol.
B. Saran

Bagi pembaca di harapkan mengamalkan ilmu yang di dapat setelah membaca


makalah ini.

Dan jika makalah saya ada kata kata yang tidak berkenan di hati anda saya
minta maaf

42

DAFTAR PUSTAKA

http://n2t2ea.blogspot.com/2014/10/normal-0-false-false-false-en-us-x-none.html
http://infonya-ti.blogspot.com/2012/07/rangkuman-mata-muliah-struktur-data-di.html
http://fadlyrunevol.blogspot.com/2010/06/matriks-penyajian-graph.html
http://infonya-ti.blogspot.com/2012/07/rangkuman-mata-muliah-struktur-data-di.html
http://nazaruddin.blog.unigha.ac.id/struktur-data/
Heriyanto, Imam, Budi Raharjo (2003). Pemrograman Borland C++ Builder. Informatika
Bandung.. Indrajit, Richardus Eko. Manajemen Sistem Informasi dan Teknologi Informasi.
Indrajit, Richardus Eko. Kajian Strategis Analisa Cost-Benefit Investasi Teknologi Informasi.
Lidya, Leoni, rinaldi Munir (2002). Algoritama dan Pemrograman dalam Bahas Pascal dan C.
Informatika Bandung. Sanjaya, Dwi (2005). Asyiknya Belajar Struktur Data di
Planet C++. Elex Media
Komputindo. Solichin, Achmad (2003). Pemrograman Bahasa C dengan Turbo C. Materi
Kuliah Struktur Data - Tree Structure.pdf
Modul Praktikum Struktur Data Laboratorium Dasar Komputer. Program Ilmu Komputer
Universitas Sriwijaya 2006. Copyright@PIK-Unsri Maret 2006.pdf
IlmuKomputer.Com. Wahono, Romi Satria(2003). Cepat MahirBahasa. IlmuKomputer.Com.

43

Anda mungkin juga menyukai