• Tidak ada hasil yang ditemukan

Algoritma Pemrograman dan Struktur Data

N/A
N/A
Protected

Academic year: 2021

Membagikan "Algoritma Pemrograman dan Struktur Data"

Copied!
167
0
0

Teks penuh

(1)

MODUL PERKULIAHAN

Algoritma

Pemrograman

dan Struktur

Data

Modul Standar untuk

digunakan dalam Perkuliahan

di Universitas Mercu Buana

Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh

Ilmu Komputer Sistem Informasi

01

87007 Team Dosen

(2)

Tipe-tipe data dan deklarasi data dalam bahasa pemrograman

Memahami jenis-jenis data yang digunakan dalam algoritma

(3)

Pengenalan Algoritma Pemrograman

dan Struktur Data

1. Pendahuluan

Instruksi harus diberikan kepada komputer agar dapat memecahkan suatu masalah.

Langkah-langkah yang dilakukan untuk memberikan instruksi kepada komputer untuk memecahkan masalah inilah yang dinamakan pemrograman komputer. Pemrograman komputer bukanlah hal yang sederhana. Kegiatan ini memerlukan ketelitian dan kemauan untuk bekerja dalam jangka waktu yang lama.

Dalam komunikasi sehari-hari seorang harus berbicara dalam bahasa yang sama

dengan orang tersebut. Hal ini berlaku juga untuk berkomunikasi dengan komputer. Kita harus menggunakan bahasa yang dimengerti oleh komputer untuk memberikan suatu instruksi. Pada dasarnya komputer adalah sebuah mesin digital, artinya komputer hanya mengenal kondisi adanya arus (dilambangkan sebagai angka 1) atau tiadanya arus (dilambangkan sebagai angka 0). Dengan kata lain sandi 1 dan 0 harus digunakan untuk melakukan pemrograman. Sandi tersebut dikenal sebagai bahasa mesin. Kita dapat membayangkan bagaimana sulitnya menggunakan bahasa mesin sebagai bahasa pemrograman..

Karena bahasa mesin sangat sulit maka muncul ide untuk melambangkan untaian sandi

1 dan 0 dengan singkatan kata yang mudah dipahami manusia. Sebagai contoh dalam prosesor Intel terdapat perintah 0011 1010 0000 1011. Perintah dalam bahasa mesin ini artinya sama dengan perintah assembly CMP AL, 0D yang artinya bandingkan nilai register AL dengan 0D. CMP sebenarnya adalah singkatan dari compare. Dapat dilihat disini bahwa perintah tersebut lebih mudah dipahami dibandingkan dengan urut-urutan bilangan biner seperti tersebut diatas.

Pemrograman dengan bahasa assembly untuk banyak orang masih dirasakan terlalu

sulit. Karena hal tersebut akhirnya dikembangkan suatu bahasa pemrograman yang lebih yang lebih mudah digunakan. Bahasa pemrograman ini menggunakan bahasa generasi ketiga atau disingkat 3GL, biasa juga disebut sebagai high-level language. Contoh dari bahasa ini adalah bahasa Basic, Pascal, C, C++, COBOL, dsb.

(4)

Bahasa generasi ketiga biasanya menggunakan kata-kata dalam bahasa Inggris karena bahasa Inggris merupakan bahasa internasional. Sebagai contoh anda dapat menuliskan perintah berikut dalam bahasa Pascal . Sebagai contoh :

writeln (‘Hallo’); {Pascal} printf (“Hallo”); // C++ cout << “Hallo” << endl; // C

2. Algoritma

Algoritma adalah urutan langkah berhingga untuk memecahkan masalah logika atau

matematika. Dalam kehidupan sehari-hari sebenarnya kita juga menggunakan algoritma untuk melakukan sesuatu. Sebagai contoh untuk menulis surat diperlukan langkah-langkah sebagai berikut :

1. Mempersiapkan kertas dan amplop 2. Mempersiapkan alat tulis

3. Mulai menulis.

4. Memasukkan kertas ke dalam amplop.

5. Pergi ke kantor pos untuk mengeposkan surat tersebut.

Langkah-langkah dari nomor 1 sampai dengan nomor 5 di atas itulah yang disebut dengan algoritma. Jadi sebenarnya kita menggunakan algoritma baik dengan sadar maupun tanpa kita sadar.

Dalam banyak kasus, algoritma yang dilakukan tidak selalu berutan seperti diatas.

Kadang-kadang harus memilih dua atau beberapa pilihan. Sebagai contoh jika kita ingin makan, kita harus menentukan akan memasak sendiri atau dirumah makan. Jika kita memilih untuk makan dirumah makan kita akan menjalankan algoritma yang berbeda jika kita ingin memasak sendiri. Didalam pemrograman hal tersebut dikenal sebagai percabangan.

Dalam kasus lain lagi mungkin kita harus melakukan langkah-langkah tertentu beberapa

kali Sebagai contoh, saat kita menulis surat, sebelum memasukkan kertas ke dalam amplop, mungkin kita harus memeriksa apakah surat tersebut sudah benar atau belum. Jika belum benar berarti kita harus menyisihkan kertas baru untuk memperbaiki surat tersebut. Demikian seterusnya sampai surat yang dibuat sesuai dengan yang diharapkan. Hal seperti ini disebut sebagai pengulangan.

Misalkan kita ingin menghitung luas lingkaran dari masukan berupa jari-jari lingkaran

(5)

Luas = πR2

Maka algoritma untuk menghitung luas lingkaran adalah : 1. Masukkan R

2. Pi = 3.14

3. Luas = Pi * R * R 4. Tulis Luas

Perhatikanlah bahwa tanda = berarti merupakan pemberian nilai kepada variabel-variable yang berada disebelah kiri. Sebagai contoh untuk baris kedua, nilai 3.14 diberikan pada variable Pi. Berikutnya nilai Pi * R * R diberikan kepada variabel Luas.

Baris pertama dari algoritma diatas meminta masukkan dari pengguna berupa jari-jari

disimpan pada variabel

2 atau yang

dituliskan Pi * R * R. Luas lingkaran ini disimpan pada variabel Luas. Baris terakhir menuliskan luas lingkaran tersebut.

Urut-urutan atau sequence adalah rangkaian tindakan yang dilakukan secara berurut.

Contoh algoritma yang diperlihatkan diatas menunjukkan program yang berurut. Untuk memudahkan memahami algoritma, diagram alur atau flow hart akan sangat membantu. Contoh dari diagram dari proses pencarian nilai lingkaran tersebut terdapat pada gambar 1. Mulai Masukkan r π = 3.14 Luas = π * r * r Tulis Luas

(6)

Gambar 1. Algoritma Perhitungan Luas Lingkaran Komponen-komponen pada Flow Chart

Oval melambangkan Terminal, untuk menyatakan awal (Start) dan akhir (end,) hanya sebagai tanda, tidak melakukan suatu pekerjaan khusus.

Persegi Panjang melambangkan Process, untuk menyatakan assignment statement

Jajaran genjang melambangkan I/O, Input/Output operation. untuk menyatakan proses baca (READ)dan proses tulis (WRITE)

Belah Ketupat mengambarkan Decision, untuk menyatakan pengambilan keputusan sesuai dengan suatu kondisi. Digunakan untuk menggambarkan control statement.

Garis, untuk menyatakan urutan pelaksanaan, atau alur proses.

Preparation, Pemberian nilai awal suatu variabel. Biasa dipakai pada bahasa COBOL, juga bahasa C.

Call , Memanggil suatu subprogram (procedure, atau function)

Lingkaran melambangkan Titik connector atau sambungan yang berada pada halaman yang sama

(7)

Pseudocode adalah penulisan program dengan menggunakan bahasa yang kita pergunakan sehari hari. Bahasa yang digunakan bisa saja bahasa Indonesia, Bahasa Inggris, C-like, Pascal-like ataupun bentuk bentuk yang lainnya. Contoh pseuducocde dari algoritma diatas adalah :

Program : Menghitung Luas Lingkaran

Mulai

Masukkan nilai jari-jari kedalam variabel R Masukkan 3.14 kedalam variabel Pi

Masukkan hasil perkalian Pi dengan R kuadrat kedalam variabel Luas Tampilkan nilai variabel luas

Selesai

Apapun bentuk tampilan algoritma anda yang terpenting adalah logika dari program yang anda buat.

3. Struktur Data

Struktur data adalah sebuah skema organisasi, seperti struktur dan array, yang diterapkan pada data sehingga data dapat diinterprestasikan dan sehingga operasi-operasi spesifik dapat dilaksanakan pada data tersebut.

Secara umum jenis-jenis data dapat dikelompokkan atas 2 bagian, yaitu :

1. Jenis data primitif, terdiri atas :

a. Integer b. Real c. Boolean d. Karakter

2. Jenis data campuran, yaitu : "String".

3.1 Bilangan Bulat atau Integer

Suatu integer adalah anggota dari himpunan bilangan :

(8)

( ..., -(n+1), -n, ..., -2, -1, 0, 1, 2, ..., n, n+1, ... )

Operasi-operasi dasar yang ada dalam integer antara lain :

 Penjumlahan

 Pengurangan

 Perkalian

 Pembagian

 Perpangkatan, dsb

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

3.2 Bilangan Pecahan atau Real atau Float

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 sistim desimal, 123000 = 0.123 * 106.

Di sini 0.123 adalah mantissa atau pecahan, sedangkan 6 adalah eksponennya. Secara umum suatu bilangan real X dituliskan M * RE

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

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

(9)

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

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

3.4 Karakter dan String

Jenis data karakter merupakan elemen dari suatu himpunan yang terdiri atas bilangan, abjad dan simbol-simbol khusus. Sedangkan jenis data string merupakan jenis data campuran, karena elemen-elemennya dibentuk dari karakter-karakter di atas. 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 3 operasi utama, yaitu :

1. Length

2. Concatenation 3. Substring Latihan:

(10)

1. Buat Algoritma Untuk menghitung nilai Jajarang genjang dan Segitiga, buat algoritma tersebut dalam bentuk flow chart dan juga dalam bentuk Pseudo code.

2. Buat program dalam bahasa C++ untuk menampilkan Operasi Aritmatika, Operasi

Relasional, Operasi Logika, Operasi Bitwise dan Operasi Geser Bit

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2, Graha Ilmu, Yogyakarta, 2009. Budi Raharjo, Pemrograman C++, Informatika, Bandung, 2010.

Teddy Marcus Zakaria dan Agus Prijono, Konsep dan Implementasi Struktur Data, Informatika, Bandung, 2006

Thompson Susabda Ngoen, Pengantar Algoritma dengan Bahasa C, Salemba Teknika, Jakarta, 2004

(11)

MODUL PERKULIAHAN

Algoritma

Pemrograman

dan Struktur

Data

Modul Standar untuk

digunakan dalam Perkuliahan

di Universitas Mercu Buana

Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh

Ilmu Komputer Sistem Informasi

02

87007 Team Dosen

Abstract

Kompetensi

(12)

Algoritma untuk mengakses Array. Pengertian Record dan Penggunaan Structure pada bahasa C++

dimaksud dengan Array dan Record serta Pendeklarasiannya dalam bahasa Pemrograman

(13)

Array dan Record

2. Pendahuluan

Pada pertemuan kali ini, kita akan kembali membahas materi yang sudah diberikan di

algoritma dan pemrograman, yaitu array. Secara singkat, array adalah suatu tipe data terstruktur yang berupa sejumlah data sejenis (bertipe data sama) yang jumlahnya tetap dan diberi suatu nama tertentu. Array dapat berupa array 1 dimensi, 2 dimensi, bahkan n-dimensi. Array adalah bagian dari struktur data, sedangkan dalam prosesnya penggunaan array, kita memerlukan algoritma dan pemrograman yang baik.

Dalam kehidupan sehari-hari, kita seringkali bertemu dengan kebutuhan penyimpanan data sejenis yang dalam jumlah atau kuantitas banyak. Sebagai contoh sederhana, kita akan mencatat nilai suhu ruangan setiap hari selama 1 tahun. Tentunya kita akan membutuhkan sebuah data untuk menyimpan data suhu tersebut. Mengingat dalam 1 tahun ada 12 bulan dan tiap minggu ada 7 hari, maka yang kita butuhkan adalah variabel dengan tipe data terstruktur seperti array. Dan tidak mungkin kita menggunakan variabel tunggal sebanyak 366 buah.

2. Array

Array adalah suatu set dari alokasi data, dengan jenis data yang sama untuk tiap alokasi

tersebut. Setiap alokasi data disebut sebagai elemen dari array. Untuk mendeklarasikan sebuah array, tuliskan jenis data dalam array tersebut, nama array dan diikuti dengan subscript. Subscript disini adalah menyatakan jumlah elemen array yang dituliskan di dalam kurung siku. Contohnya : int IntArray[25];

Sebagai deklarasi sebuah array yang memiliki 25 alokasi data (elemen) dengan jenis

data integer bernama IntArray. Perbedaan deklarasi variabel array dengan variabel biasa. int a; //* hanya 1 nilai untuk variabel a

int a[10]; //* terdapat 10 slot nilai untuk variabel a int a[7] = {1,2,3,5,43,5,6};

Array dapat menggunakan nama apapun (yang dapat digunakan dalam bahasa C/C++),

selama tidak memiliki nama yang sama dengan variabel tunggal lain. Dalam bahasa C/C++, array dimulai dari 0. Jika A merupakan array dengan jumlah elemen 10, maka variabelnya

(14)

adalah A[0], A[1], ..., A[9]

5 9 15 8 -7 21 0 -3 11 -1 → Isi Array

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] → indeks Array

A[0] bernilai 5

A[4] bernilai -7 Berapa nilai A[6] ? Berapa nilai A[9] ? Contoh lain.

6. int angka[10];

mendeklarasikan sebuah variable bernama angka berupa array satu dimensi untuk menampung/ menyimpan sepuluh data bertipe integer.

1 3 2 4 5 7 8 6 9 10

Indeks = 0 1 2 3 4 5 6 7 8 9

7. float bilangan[4][4];

mendeklarasikan sebuah variable bernama bilangan berupa array dua dimensi untuk menampung/ menyimpan enam belas data bertipe float.

Kolom = 0 Kolom = 1 Kolom = 2 Kolom = 3

Baris = 0 1.2 2.3 3.4 4.5

Baris = 1 1.3 1.4 1.5 1.8

Baris = 2 2.2 2.2 2.9 2.8

Baris = 3 3.0 3.7 3.5 3.6

3.char huruf[3][5][5];

mendeklarasikan sebuah variable bernama huruf berupa array tiga dimensi untuk menampung/ menyimpan tujuh puluh lima data bertipe char.

(15)

2.1 Mengisi Nilai Elemen Array

Mengisi nilai pada elemen array dapat dilakukan dengan 2 cara, yaitu : 5. langsung dari program (statik)

6. diisi oleh user melalui input dari keyboard (dinamik)

Berikut contoh pengisian array yang diinput langsung dari program (statik). Artinya user tidak dapat merubah isi elemen array kecuali merubah dari kode programnya.

A[0] = 100; /*Nilai elemen A[0] adalah 100*/ B[5] = 35; /*Nilai elemen B[5] adalah 35 */ A[0] = B[5]; /*Nilai elemen A[0] adalah 35 */

C = -99; /*C adalah variabel biasa, bukan array. C bernilai -99 */ B[5] = C; /*Nilai elemen B[5] adalah -99. A[0] tetap bernilai 35 */ Berikut algoritma menampilkan elemen nilai array.

Deklarasi int A[3]; int B = 35; Deskripsi Mulai A[0] = 70; A[1] = B;

Print “Isi nilai A[0] adalah A[0]”;

w e t u r o u h h k d f h k l a c v b n m z x r d T = 0 T = 1 T = 2

(16)

Print “Isi nilai A[1] adalah A[1]”; Print “Silakan user mengisi nilai A[2]:” Scan A[2];

Print “Isi nilai A[2] adalah A[2]”; Selesai

Tampilan hasil yang diharapkan adalah sebagai berikut:

2.2 Inisialisasi Array

Meskipun tidak dimungkinkan mengoperasikan array secara langsung, namun pemberian nilai dapat dilakukan.

int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

Bila initializers-nya lebih sedikit dari elements array, sisanya akan dianggap bernilai 0.

int a[10] = {0, 1, 2, 3, 4, 5, 6};

maka nilai a[7], a[8], dan a[9] dianggap 0.

Bila terdapat initializer, maka dimensi array dapat diabaikan. int b[] = {10, 11, 12, 13, 14};

b merupakan array yang memiliki 5 elemen karena di-inisialisasi dengan 5 angka. Perhatikan bahwa variable b dinyatakan sebagai b[] untuk menjelaskan bahwa b adalah sebuah array. Jika elemen array adalah karakter, maka initializer dapat berupa string constant:

char s1[7] = "Hello,"; char s2[10] = "there,"; char s3[] = "world!";

Untuk memberikan nilai atau mengoperasikan suatu array, dapat digunakan sebuah loop: for(int i = 0; i < 10; i = i + 1)

(17)

/* a[0] hingga a[9] bernilai 0 */

for(i = 0; i < 10; i++) /* i++ adalah sama dengan i=i+1 */

{ b[i] = a[i]+1; } /* b[0] hingga b[9] bernilai 1 */ for(i = 0; i < 10; i++) { c[i] = b[i]+i; } /* untuk i=0 → c[0]=1+0=1, untuk i=1 → c[1]=1+1=2, untuk i=2 → c[2]=1+2=3, berapa nilai c[9]? */

Berikut contoh notasi algoritma deklarasi array dengan memanfaatkan proses iterasi (loop). Deskripsi

int n[10]

Deklarasi Mulai

for (int i=0; i<10; i++) n[i] = 0

Print ”Indeks Elemen Nilai”

for (i=0; i<10; i++) Print “i” ”n[i]” Selesai

(18)

3. Record

Array sangat seringkali digunakan bersamaan dengan struktur data lain, yaitu record (rekaman). Deklarasi

typedef struct SISWA long NIM; char Nama[25]; char Kota[30];

// deklarasi array A berisi 2 record SISWA; Deskripsi

//menerima masukan user for (int i=0;i<2;i++){

Print "NIM: "; Scan A[i].NIM; Print "Nama: ";Scan A[i].Nama; Print "Kota: ";Scan A[i].Kota;

//menampilkan isi for (int i=0;i<2;i++){

Print "Siswa ke-i ";

Print A[i].Nama "("A[i].NIM")"; Print "dari "A[i].Kota";

(19)

4. Latihan

Buatlah kode program di bawah ini dengan menggunakan bahasa pemrograman C++. Lalu kompilasi program tersebut, jalankan. Apakah program tersebut sesuai dengan permasalahan yang ada?

/* Program untuk mengevaluasi beberapa data nilai */ #include “stdio.h”

int data[10]; //* deklarasi variable global. Sebuah array berisi 10 elemen int

int baik=0, cukup=0, kurang=0; void input_data( )

{

for( int I = 0; I < 9; I++) {

printf(“Data ke [ %d ] = “, I); scanf(“%d”, data[I]); }

return; };

void cari_rata2( ) {

for( int I = 0; I < 9; I++) {

if (data[I] > 80 && data[I] <= 100) baik++; elseif (data[I] > 60 && data[I] <= 80) cukup++; elseif (data[I] > 0 && data[I] <= 60) kurang++; }

return; };

void output_data( ) {

if ((baik >= cukup) && (baik >=kurang)) printf(“\n Rata-ratanya Baik”);

elseif ((cukup >= baik) && (cukup >=kurang)) printf(“\n Rata-ratanya Cukup”);

(20)

elseif ((kurang >= cukup) && (kurang >= baik)) printf(“\n Rata-ratanya Kurang”);

return; }; main( ) { input_data( ); cari_rata2( ); output_data( ); }

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2, Graha Ilmu, Yogyakarta, 2009.

Budi Raharjo, Pemrograman C++, Informatika, Bandung, 2010.

Deitel & Deitel, C How to Program 3rd Edition, Prentice Hall, New Jersey, 2001

Teddy Marcus Zakaria dan Agus Prijono, Konsep dan Implementasi Struktur Data, Informatika, Bandung, 2006.

Thompson Susabda Ngoen, Pengantar Algoritma dengan Bahasa C, Salemba Teknika, Jakarta, 2004

(21)

MODUL PERKULIAHAN

Algoritma

Pemrograman

dan Struktur

Data

Modul Standar untuk

digunakan dalam Perkuliahan

di Universitas Mercu Buana

Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh

Ilmu Komputer Sistem Informasi

03

Team Dosen

(22)

Pengertian Linked List dan Penyajian Linked List dalam memori

Mampu Memahami dan Menjelaskan Cara Kerja Linked List

(23)

Linked List

3. Pendahuluan

Linked List adalah suatu cara untuk menyimpan data dengan struktur sehingga

programmer dapat secara otomatis menciptakan suatu tempat baru untuk menyimpan data kapan saja diperlukan. Secara rinci, programmer dapat menulis suatu struct atau definisi kelas yang berisi variabel yang memegang informasi yang ada di di dalamnya, dan mempunyai suatu pointer yang menunjukan ke suatu struct sesuai dengan tipe datanya.

Struktur dinamis ini mempunyai beberapa keuntungan dibandingkan struktur array yang bersifat statis. Struktur linked list lebih dinamis, karena banyaknya elemen dengan mudah ditambah atau dikurangi, berbeda dengan arrayb yang ukuranya bersifat tetap. Disamping itu, manipulasi terhadap setiap elemen seperti menyisipkan, menghapus, maupun menambah dapat dilakukan dengan lebih mudah.

Untuk lebih memahami konsep linked list perhatikan permasalahan berikut ini:

Misalkan anda diminta untuk membuat sebuah algoritma dan program untuk memasukan 2 buah daftar ke dalam suatu daftar atau senarai (linked list), dimana senarai tersebut masih kosong, sehingga setelah anda masukan 2 buah data tersebut, senarai tersebut berisi 2 buah data.

Algoritma dari permasalahan diatas adalah sebagai berikut: 8. Tentukan struktur untuk menampung data yang dimasukan 9. Senarai masih keadaan kosong

10. Tentukan fungsi untuk memasukan data ke dalam senarai 11. Fungsi untuk memasukan data ke dalam senarai adalah:

if (p==nul){ t → next = *s *s = t }

12. masukan data tersebut ke dalam senarai 13. tampilkan data

14. selesai

(24)

/*Program:link1.cpp */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct nod { int data;

struct nod *next; } NOD, *NODPTR;

void CiptaSenarai (NODPTR *s) { *s = NULL; } NODPTR NodBaru(int m) { NODPTR n; n = (NODPTR) malloc(sizeof(NOD)); if (n != NULL) { n -> data = m; n -> next = NULL; } return n; }

void SisipSenarai (NODPTR *s, NODPTR t, NODPTR p) { if (p==NULL) { t -> next = *s; *s = t; } else { t -> next = p -> next; p -> next = t; } }

void CetakSenarai (NODPTR s) {

NODPTR ps;

for (ps = s; ps != NULL; ps = ps -> next)

printf("%d --->", ps -> data); printf("NULL\n"); } int main () { NODPTR pel; NODPTR n; CiptaSenarai(&pel);

(25)

n = NodBaru(55); SisipSenarai(&pel, n, NULL); n = NodBaru(75); SisipSenarai(&pel, n, NULL); CetakSenarai(pel); return 0; }

2.

Teknik-teknik Dalam Linked List

Teknik-teknik yang ada pada linked list antara lain: 1. Pengulangan linked list

2. Mengubah sebuah Pointer dengan referensi Pointer 3. Membuat kepala senarai dengan perintah push() 4. Menambah Ekor pada akhir senarai

5. Membuat referensi lokal

2.1. Pengulangan linked list

Teknik yang sering dalam linked list adalah pengulangan keseluruhan node dalam list. Secara umum pengulangan ini dikenal sebagai while loop. Head pointer dikopikan dalam variabel lokal current yang kemudian dilakukan perulangan dalam linked list. Hasil akhir dalam linked list dengan current!=NULL. Pointer lanjut dengan current=current -> next. Proses pengulangan linked list seperti pada penggalan program berikut ini:

// return the number of nodes in a list (while-loop version) int length(struct node *head) {

int count = 0;

struct node * current = head; while (current != NULL) { count++

current = current -> next }

return(count); }

2.2. Mengubah sebuah pointer dengan referensi pointer

Banyak fungsi pada pada linked list perlu untuk merubah pointer kepala. Dalam C++, anda juga dapat menyatakan parameterpointer sebagai argumen &. Untuk

(26)

melakukan ini bahasa C++, lewati pointer ke pointer kepala. Pointer ke pointer kadang-kadang ” reference pointer”

langkah utama untuk teknik ini adalah:

 Merancang sebuah fungsi untuk mengambil pointer ke pointer kepala. Ini teknik standar

yang digunakan dalam C++ untuk melewati pointer ke “value of interest” yang membutuhkan untuk diubah. Untuk mengubah struct node*, lewati struct node**

 Gunakan '&' dalam panggilan untulk menghitung dan melewati pointer ke value of

interest

 Gunakan '*' pada parameter dalam fungsi pemanggil untuk mengakses dan mengubah

value of interest

Fungsi Sederhana berikut ini adalah untuk membuat pointer kepala ke NULLdengan menggunakan parameter reference

void changeToNull (struct node ** headRef) *headRef = NULL;}

void ChangeCaller() { Struct node* head1 Struct node* head2 ChangeToNull (&head1); ChangeToNull (&head2); }

Gambar di bawah ini menunjukan bagaimana pointer headRef dalam ChangeToNull menunjukan ke head1 pada Change Caller.

ChangeCaller ()

head1

ChangeTo Null

(&head1)

(27)

Gambar 3.1 Pointer headRef dalam ChangeToNull menunjuk ke head1

2.3. Membuat head list (kepala senarai) dengan perintah Push()

Cara termudah untuk membuat sebuah senarai (list) dengan menambah node pada “akhir kepala (last head)” adalah dengan push().

Perhatikan fungsi berikut ini : struct node* AddAthead() {

Struct node*head =NULL; int i;

for (i=1; i<6; i++) { push (&head,i); }

// head == {5, 4, 3, 2, 1}; return (head);

}

Dalam membuat tambahan node pada akhir senarai (list) dengan menggunakan perintah Push(), sebaiknya anda berhati-hati, sebab salah urutan untuk masing-masing scrip maka urutannya akan terbalik.

2.4. Menambah Tail (Ekor) pada akhir List

Untuk menambahkan node ekor pada list, sebagian melibatkan penempatan pada node terakhir, dan kemudian merubahnya, next field dari NULL untuk menunjuk pada node baru seperti variabel tail, dalam contoh berikut ini yaitu menambah node 3 ke akhir daftar {1,2}

Stack

Heap

Head

(28)

Tail

newNode

Gambar 3.2. Membuat ekor pada akhir list

U

ntuk memasukan atau menghapus node di dalam list, anda membutuhkan pointer ke

node sebelum posisi itu, sehingga anda dapat merubahnya .next field.

Pada gambar 3.2 tersebut penjelasannya adalah sebagai berikut :

1.

Head pointer akan menunjukan ke node 1

2.

Kemudian node 1 akan menunjukan ke node 2, yang merupakan ekor.

3.

Misalkan ada node baru misalnya node 3, maka dari node 2 akan menunjuk ke

node baru yaitu 3. sehingga posisi node 3 adalah posisi terakhir.

Pertanyaanya, bagaimana membuat data-data {1,2,3,4,5} yang ada pada list dengan menambahkan node di akhir ekor. Kesulitannya adalah bahwa node yang pertama pasti ditambah pada head pointer, tetapi semua node yang lain dimasukkan sesudah node terakhir dengan menggunakan tail pointer. Cara yang terbaik untuk berhubungan dengan kedua hal adalah menambah head node {1}. kemudian melakukan perulangan yang terpisah yang menggunakan tail pointer untuk menambah semua node yang lain. Tail pointer digunakan untuk menunjuk pada last node, dan masing-masing node baru ditambah dengan tail → next

Perhatikan penggalan program berikut ini: struct node* BuildWidthSpecialCase (){ struct node* head = NULL;

struct node*tail; int i;

// Deal With the head node here, and set the tail pointer Push (&head, 1);

tail =head;

// Do all the other nodes using 'tail'

(29)

for (i=2; i<6; i++) {

push(&(tail → next), I); //add node at tail → next tail = tail → next; // advance tail to point to last node }

return(head); // head == {1, 2, 3, 4, 5}; }

2.5.

M

embuat referensi lokal

Untuk teknik ini, kita menggunakan “reference pointer” local yang selalu menunjuk ke pointer terakhir dalam list. Semua tambahan pada list dibuat dengan refernce pointer. Reference pointer tidak menunjuk ke head pointer, tetapi menunjuk ke .next field di dalam last node terakhir dalam list.

Perhatikan penggalan program berikut ini: struct node* BuildWidthLocalRef(){ struct node* head = NULL;

struct node** lasyPtrRefn=&head int I;

for (i=1; i<6; i++); Push (lastPtrRef, I);

LastPtrRef = &((*lastPtrRef)-> next); }

Return(head); }

Teknik ini pendek, tetapi di dalam perulangan cara ini agak membahayakan. Teknik ini jarang sekali digunakan, tetapi itu merupakan cara yang baik untuk memahami pengertian sebuah pointer. Cara kerja dari teknik ini adalah:

 Pada puncak putaran, lastPtrRef menunjuk pointer terakhir dalam list. Pada

permulaaanya menunjuk ke head pointer itu sendiri. Berikutnya kemudian akan menunjuk ke .next field di last node dalam list

 Push (LastPtrRef); menambah node baru pada pointer akhir. Node baru menjadi node

(30)

 LastPtrRef= &((*lastPtrRef) → next; last PtrRef lanjut ke . Next field dan .next field sekarang menjadi pointer terakhir dalam list.

Perhatikan gambar 3.3. berikut ini :

Stack

Heap

LocalRef() Head

lastPtrRef

Gambar 3.3 Membuat referensi local

3. OPERASI DALAM LINKED LIST

Operasi yang ada pada linked list adalah Menambah Node dan juga menghapus node

3.1. Menambah Node Baru

Untuk menambahkan sebuah node di dalam list, kita perlu mendefinisikan sebuah kepala (head) dan ekor (tail). Pada awal list, posisi head dan tail masih menjadi satu. Setelah ada tambahan node yang baru, maka posisinya berubah. Posisi kepala tetap pada awal list dan posisi ekor pada akhir list atau node yang baru. Seterusnya, bila ada tambahan node, maka posisi ekor akan bergeser sampai ke belakang dan akhir list ditunjukkan dengan NULL.

Adapun prosedurnya ditunjukkan pada penggalan program berikut ini: void SLList :: AddANode()

{Tail -> Next = new list; Tail=Tail ->Next;

}

Ilustrasi dari tahapan penambahan node dapat terlihat pada gambar 3.4

(31)

Adding a Node

Head

Before Tail

Step 1 Head New Node

Tail Next

Tail

Next

Step 2 Head

NULL

Gambar 3.4 menambah node baru

Adapun penjelasan dari gambar 3.4 adalah sebagai berikut:

1. Tentukan dan Definisikan head dan tail, dimana dalam kondisi pertama kepala dan ekor menunjuk pada node yang sama.

2. Misalkan ada node baru yang masuk, posisi head dan tail akan berubah. Head tetap akan menunjuk pada node yang lama, sedangkan ekor akan menunjuk pada node yang baru

3. Misalkan ada node yang baru, head tetap pada posisi awal, sedangkan tail akan terus bergeser ke belakang dan pada akhir list ditunjukan oleh NULL.

3.2. Menghapus Node

Untuk menghapus node, dapat dilihat pada penggalan program berikut ini : void SLList::DeleteANode(ListPtr corpse)) // <-- i though it was funny:) {

ListPtr temp;

if (corpse === Head) //case 1 corpse = Head {temp=Head;

(32)

Head=Head->Next; }

else if(corpse == Tail) //case 2 corpse is at the end { temp = Tail;

Tail=Previous(Tail); Tail->Next=NULL; delete temp; }

else //case 3 corpse is in middle somewhere { temp=Previous (corpse);

temp->Next=corpse->Next; delete corpse;

}

CurrentPtr=Head; //Reset the class tempptr }

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2, Graha Ilmu, Yogyakarta, 2009. Moh. Sjukani, Struktur Data [ Algoritma & Struktur Data 2 ] dengan C, C++, Mitra Wacana Media, Jakarta, 2008.

Teddy Marcus Zakaria dan Agus Prijono, Konsep dan Implementasi Struktur Data, Informatika, Bandung, 2006.

(33)

MODUL PERKULIAHAN

Algoritma

Pemrograman

dan Struktur

Data

Modul Standar untuk

digunakan dalam Perkuliahan

di Universitas Mercu Buana

Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh

Ilmu Komputer Sistem Informasi

04

Team Dosen

(34)

Operasi dasar stack dan contoh aplikasinya. Deklarasi stack dalam bahasa pemrograman

Mampu menjelaskan apa yang

(35)

STACK

4. Pendahuluan

Stack disebut juga tumpukan dimana data hanya dapat dimasukkan dan diambil dari

satu sisi. Karena itu, stack bersifat LIFO (Last In First Out).

Tumpukan bisa diartikan sebagai suatu kumpulan data yang seolah-olah ada data yang diletakkan diatas data yang lain. Satu hal yang perlu diingat bahwa kita bisa menambah (menyisipkan) data, dan mengambil (menghapus) data melalui ujung yang sama, yang disebut ujung atas tumpukan (top of stack). Tumpukan dapat diilustrasikan sebagai berikut:

Secara sederhana tumpukan bisa diilustrasikan seperti gambar dibawah ini. Dari gambar dibawah ini kotak B ada di atas kotak A dan ada di bawah kotak C. Gambar dibawah ini hanya menunjukan bahwa dalam tumpukan hanya bisa menambah atau mengambil sebuah kotak lewat satu ujung yaitu ujung bagian atas. Dapat dilihat bahwa tumpukan merupakan suatu senarai (list) yang mempunyai watak “masuk terakhir keluar pertama"(last in first out-LIFO).

F E D C B A

Gambar 2. Tumpukan dengan 6 elemen

A A A B C B C A B C Keadaan mula-mula adalah kosong

Setelah

ditumpuk

top max

(36)

Implementasi alternatif stack adalah:

1. List dengan pointer untuk variable-length stack (ukuran stack bervariasi)

2. Array untuk fixed-length stack (ukuran stack sudah dibatasi, tidak dapat tumbuh)

Stack banyak digunakan dalam bidang ilmu komputer, misalnya dalam pengembangan kompilator, pengelolaan backtracking untuk parser dan sebagainya.

Stack terdiri dari elemen S[1..top], dimana S[1] adalah elemen pada dasar stack dan

S[top] adalah elemen pada puncak stack. Jika top=0 berarti stack kosong. Jika top = N, dimana N adalah jumlah elemen terbanyak yang dapat ditampung, berarti stack sudah penuh. Jika stack sudah penuh tidak bias dilakukan penyisipan elemen baru. Pada stack yang diimplementasikan dengan list, ukurannya bisa tidak terbatas (unbounded stack) kecuali batasan ruang memori yang tersedia. Pada unbounded stack pemeriksaan yang diperlukan adalah pemeriksaan apakah masih ada ruang memori yang tersedia untuk elemen yang baru. Stack yang diimplementasikan dengan array disebut fixed length stack karena ukurannya tidak bisa berubah, sedangkan stack yang diimplementasikan dengan list disebut variable-length stack, karena ukurannya bisa berubah-ubah sesuai dengan penambahan dan penghapusan elemen-elemennya.

Operasi yang dapat dilakukan stack adalah:

 Menambah (push)

 Mengambil (pop)

 mengecek apakah stack penuh (isFull)

 mengecek apakah stack kosong (isEmpty)

 membersihkan stack (clear).

 Mencetak isi stack (print)

2. Operasi-operasi Pada Stack

Membuat stack dan operasi-operasi yang dapat dilakukannya.

1. Mendefinisikan stack dengan menggunakan struct

2. M endefi nisika typedef struct stack // Mendefinisikan stack dengan menggunakan struct

{

int top;

char data [15][20]; // menampung 15 data dengan jumlah string max 20 huruf };

(37)

n max_stack untuk maksimum isi stack

#define max_stack 15

3. Membuat variable array sebagai implementasi stack

stack tumpuk;

4. Mendeklarasikan operasi-operasi/fungsi yang dapat dilakukan stack. a. Push (menginputkan data pada stack)

b. Pop (mengambil data pada stack)

c. IsFull(mengecek apakah stack penuh)

d. isEmpty(mengecek apakah stack kosong) void push(char d[20])

{

tumpuk.top++;

strcpy(tumpuk.data[tumpuk.top],d); printf("data berhasil dimasukkan"); }

void pop() {

printf ("data %s terambil",tumpuk.data[tumpuk.top]); tumpuk.top--; } int isEmpty() { if (tumpuk.top==-1) return 1; else int isFull() { if (tumpuk.top==max_stack-1) return 1; else return 0; }

(38)

e. clear (membersihkan seluruh isi stack)

f. print (mencetak seluruh isi stack)

2.1. Operasi push dengan Single Stack

Operasi push merupakan proses penyisipan/pemasukan data ke dalam suatu tumpukan. Dimana tumpukan tersebut akan dicek, apakah sudah penuh atau belum. Jika sudah penuh, maka data tidak akan dimasukkan ke dalam tumpukan, tetapi jika masih kosong maka data akan disisipkan di tumpukkan paling atas.

Algoritma Operasi Push:

If atas = maxelemen then

penuh: ← true (Tumpukan sudah penuh)

else

penuh ← false (Tumpukan masih kosong)

Atas ← atas + 1 Isi[Atas] ← x Endif

2.2. Operasi Pop dengan Single Stack

void print() {

for (int i=tumpuk.top;i>=0;i--) printf ("%s\n",tumpuk.data[i]); }

void clear() {

tumpuk.top=-1;

printf("semua data terhapus."); }

(39)

Operasi pop adalah operasi untuk menghapus elemen yang terletak pada posisi paling atas dari sebuah tumpukan.

Algoritma Operasi Pop:

If atas = 0 then

(Tumpukan sudah kosong) else

Atas ← atas - 1 (hapus 1 elemen pada tumpukan)

Endif

2.3. Double Stack Dengan Array

Double stack merupakan suatu teknik khusus yang dikembangkan untuk menghemat memori dalam pembuatan dua stack dengan array. Intinya adalah penggunaan hanya sebuah array untuk menampung dua stack.

Gambar 3. Gambaran Perbandingan Single Stack dan Doube Stack Dengan Array

Tampak jelas pada gambar di atas bahwa sebuah array daspat dibagi untukk dua stack, stack 1 bergerak ke kanan dan stack 2 bergerak ke kiri. Jika Top 1 (elemen teratas dari stack 1) bertemu dengan top2 (elemen teratas dari stack 2), maka double stack telah penuh.

Algoritma Operasi Push pada double stack:

Stack

Kosong

1

Top

Max

Stack 1 Stack 2 1 Top 1 Max Kosong Top 2

(40)

If not penuh then

Case nostack of (Tumpukan masih kosong)

1 : top[1] ← top[1] + 1 2 : top[2] ← top[2] - 1 Endcase

Stack[top[elemen]] ← elemen Endif

Algoritma Operasi Pop pada double stack:

If not kosong then (Tumpukan tidak kosong)

Elemen ← stack[top[nostack]] Case nostack of 1 : top[1] ← top[1] + 1 2 : top[2] ← top[2] - 1 Endcase Endif

3.

Pemanfaatan STACK

Salah satu pemanfaatan stack adalah untuk menulis ungkapan dengan menggunakan notasi tertentu. Seperti kita ketahui, dalam penulisan ungkapan numeris, kita selalu menggunakan tanda kurung untuk mengelompokkan bagian mana yang akan dikerjakan terlebih dahulu. Perhatikan ungkapan berikut ini :

( C + D ) * ( E – F )

Dari contoh di atas ( C + D ) akan dikerjakan lebih dahulu, kemudian ( E – F ) dan hasilnya akan dikalikan

Cara penulisan ungkapan sering disebut dengan notasi INFIX, yang artinya bahwa operator

ditulis diantara 2 operand.

Seorang ahli matematika bernama Jan lukasiewiccz kemudian mengembangkan suatu cara penulisan ungkapan numeris yang kemudian dikenal dengan nama notasi PREFIX, yang artinya adalah bahwa operator ditulis sebelum kedua operand yang akan disajikan.

Notasi lain, yang merupakan kebalikan dari notasi PREFIX adalah notasi POSTFIX,

(41)

Contoh Notasi INFIX, PREFIX dan POSTFIX

INFIX

PREFIX

POSTFIX

A + B

+ A B

A B +

A + B – C

- + A B C

A B C - +

( A + B ) * ( C - D )

* + A B – C D

A B + C D - *

( 6 – 2 ) * ( 5 + 4 )

* - 6 2 + 5 4

6 2 – 5 4 + *

Program Konversi Bentuk INFIX ke bentuk POSTFIX

/*Program:InfixPostfix.cpp */ #include <stdio.h> #include <conio.h> #include <ctype.h> char A[25], S[20]; int I, Top;

int Operand(char Top); // fungsi memeriksa operand int Operator(char Op); // fungsi memeriksa operator

int Nilai(char X); // fungsi mencari nilai numerik sebuah karakter void main()

{ char OprStack, OprBaru; Top = -1; clrscr();

printf("Arithmetic Statement : "); scanf("%s",A); for (I=0; A[I] != '\0'; I++ )

{ if (Operand(A[I])) printf("%c", A[I]); else { if(Operator(A[I]))

{ if(Top==-1 || S[Top] == '(' ) S[++Top] = A[I]; else { OprStack = S[Top]; OprBaru = A[I]; if (Nilai(OprBaru) > Nilai (OprStack)) S[++Top] = OprBaru;

(42)

{ while(Nilai(OprStack) >= Nilai (OprBaru) && Top > -1 && S[Top] != '(' )

{ printf("%c ", OprStack); OprStack = S[--Top]; } S[++Top] = OprBaru; } }

}

else { if(Operand(A[I])=='(') S[++Top]=A[I]; else { while (Top>-1 && S[Top] != '(' ) { printf("%c ", S[Top--] ); } Top-- ; } } } } while (Top > -1) printf("%c ", S[Top--]); }

int Operand(char Op) // Fungsi Memeriksa Operand { if(isalpha(Op))

return(-1); //True else return(0); //False }

int Operator(char Opr) // Fungsi memeriksa Operator { if(Opr=='^' || Opr=='*' || Opr=='/' || Opr=='+' || Opr=='-')

return(-1); else return(0); }

int Nilai (char X) // Fungsi memeriksa Operator { if (X=='^') return(3);

else if(X=='*' || X=='/') return(2); else if(X=='+' || X=='-') return(1); else return(0);

(43)

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2, Graha Ilmu, Yogyakarta, 2009. Moh. Sjukani, Struktur Data [ Algoritma & Struktur Data 2 ] dengan C, C++, Mitra Wacana Media, Jakarta, 2008.

Teddy Marcus Zakaria dan Agus Prijono, Konsep dan Implementasi Struktur Data, Informatika, Bandung, 2006.

(44)

MODUL PERKULIAHAN

Algoritma

Pemrograman

dan Struktur

Data

Modul Standar untuk

digunakan dalam Perkuliahan

di Universitas Mercu Buana

Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh

Ilmu Komputer Sistem Informasi

05

87007 Team Dosen

(45)

Definisi dan operasi dasar QUEUE. Penyajian QUEUE dalam Array

Mengetahui cara kerja QUEUE dan menerapkannya

(46)

QUEUE (ANTRIAN)

5. Pendahuluan

Queue disebut juga antrian dimana data masuk di satu sisi dan keluar di sisi yang lain.

Karena itu, queue bersifat FIFO (First In First Out). Antrian (Queue) merupakan suatu kumpulan data yang penambahan elemennya (masuk antrian) hanya bisa dilakukan pada suatu ujung (disebut dengan sisi belakang/rear) atau disebut juga enqueue yaitu apabila seseorang masuk ke dalam sebuah antrian. Jika seseorang keluar dari antrian/penghapusan (pengambilan elemen) dilakukan lewat ujung yang lain (disebut dengan sisi depan/front) atau disebut juga

dequeue yaitu apabila seseorang keluar dari antrian.

Jadi, dalam antrian menggunakan prinsip “masuk pertama keluar pertama” atau disebut

juga dengan prinsip FIFO (first in first out). Dengan kata lain, urutan keluar akan sama dengan urutan masuknya. Contoh : antrian mobil saat membeli karcis di pintu jalan tol, antrian di bioskop dan sebagainya.

6. Operasi / Prosedur Standar pada QUEUE / ANTRIAN

QUEUE merupakan struktur data dinamis, ketika program dijalankan, jumlah elemennya dapat berubah secara dinamis sesuai keperluan. Berikut ini operasi-operasi standar pada queue :

a. Inisialisasi, merupakan prosedur untuk membuat queue pada kondisi awal, yaitu queue yang masih kosong (belum mempunyai elemen).

b. InQueue, Insert Queue merupakan prosedur untuk memasukkan sebuah elemen baru pada queue. Jumlah elemen Queue akan bertambah satu dan elemen tersebut merupakan elemen belakang.

c. DeQueue, Delete Queue merupakan prosedur untuk menghapus/mengambil sebuah elemen dari queue. Elemen yang diambil adalah elemen depan dan jumlah elemen queue akan berkurang satu.

Hal lain yang perlu diperhatikan dalam suatu struktur dinamis adalah jumlah elemen struktur data tersebut. Operasi-operasi yang berhubungan dengan jumlah elemen suatu queue adalah :

(47)

2. Empty, yaitu prosedur untuk mengetahui apakah queue dalam keadaan kosong atau tidak. Dengan status ini maka dapat dicegah dilakukannya operasi Dequeue dari suatu queue yang kosong.

3. Full, merupakan prosedur untuk mengetahui apakah Queue penuh atau tidak. Prosedur ini hanya berlaku untuk queue yang jumlahnya terbatas.

7. IMPLEMENTASI ANTRIAN DENGAN ARRAY

Karena antrian merupakan suatu kumpulan data, maka tipe data yang sesuai untuk menyajikan antrian adalah menggunakan array atau list (senarai berantai).

Perhatikan gambar berikut ini :

depan

keluar A B C D E F masuk

belakang

gambar 1. Contoh antrian dengan 6 elemen

Gambar di atas menunjukkan contoh penyajian antrian menggunakan array. Antrian di atas berisi 6 elemen, yaitu A, B, C, D, E dan F. Elemen A terletak di bagian depan antrian dan elemen F terletak di bagian belakang antrian. Jika ada elemen baru yang akan masuk, maka elemen tersebut akan diletakkan di sebelah kanan F. Dan jika ada elemen yang akan dihapus, maka A akan dihapus terlebih dahulu.

Elemen A terletak di bagian depan, kemudian disusul elemen B dan elemen yang paling akhir atau paling belakang adalah elemen F. Misalkan ada elemen baru yang akan masuk maka akan terletak di belakang elemen F, sehingga elemen baru akan menempati posisi yang paling belakang.

Gambar 2 menunjukkan antrian di atas dengan penambahan elemen G dan H, sehingga gambar 1. Menjadi :

(48)

keluar

A B C D E F G H masuk

belakang

gambar 2. Contoh penambahan antrian dengan 2 elemen

Gambar 3 menunjukkan antrian dengan penghapusan elemen A dan B, sehingga gambar 1 menjadi :

depan

keluar

C D E F G H masuk

belakang

gambar 3. Contoh penghapusan antrian dengan 2 elemen

Seperti pada tumpukan atau stack di dalam antrian juga dikenal 2 operasi dasar yaitu menambah elemen baru yang akan diletakkan di bagian belakang antrian dan menghapus elemen yang terletak di bagian depan antrian. Selain itu kita juga harus melihat antrian itu mempunyai isi atau masih kosong.

Untuk memahami penggunaan antrian dalam array, kita membutuhkan deklarasi antrian, misalnya sebagai berikut :

# define MAXN 6

Typedef enum { NOT_OK, OK } Tboolean; Typedef struct {

Titem array [MAXN]; int first;

int last;

int number_of_items; } Tqueue

(49)

terdapat dalam struktur. Variabel first menunjukkan posisi elemen pertama dalam array, dan variabel last menunjukkan posisi elemen terakhir dalam array.

Algoritma dari penggalan program di atas adalah :

1. Tentukan elemen yang akan dimasukkan ke dalam antrian (dalam hal ini adalah 6 elemen).

2. Deklarasikan struktur untuk menampung elemen pada antrian. 3. Selesai.

Untuk menambah elemen baru dan mengambil elemen dari antrian dalam antrian, diperlukan deklarasi berikut ini :

void initialize_queue ( Tqueue *Pqueue) {

Pqueue -> firs = 0; Pqueue -> last = -1;

Pqueue -> number_of_items = 0; }

Tboolean enqueue ( Tqueue *Pqueue, Titem item) {

if (Pqueue -> number_of_items >= MAXN) return (NOT_OK);

else {

Pqueue -> last++;

if (Pqueue -> last > MAXN -1) Pqueue -> = 0;

Pqueue -> array[Pqueue->last] = item; Pqueue -> number_of_items++; return (OK);

} }

Tboolean dequeue (Tqueue *Pqueue, Titem, item) {

if (Pqueue -> number_of_items == 0) return (NOT_OK);

(50)

else {

*Pitem = Pqueue -> array[Pqueue->first++]; if (Pqueue -> first > MAXN -1)

Pqueue -> first = 0;

Pqueue -> number_of_items--; return (OK);

} }

Penggalan program di atas apabila dikelompokkan berdasarkan fungsinya adalah sebagai berikut :

1. Deklarasikan Antrian

void initialize_queue ( Tqueue *Pqueue) {

Pqueue -> firs = 0; Pqueue -> last = -1;

Pqueue -> number_of_items = 0; }

2. Fungsi untuk memasukkan elemen pada antrian adalah sebagai berikut :

Tboolean enqueue ( Tqueue *Pqueue, Titem item) {

if (Pqueue -> number_of_items >= MAXN) return (NOT_OK);

else {

Pqueue -> last++;

if (Pqueue -> last > MAXN -1)

Pqueue -> = 0;

Pqueue -> array[Pqueue->last] = item;

Pqueue -> number_of_items++;

(51)

} }

3. Fungsi untuk menghapus elemen pada antrian adalah sebagai berikut :

Tboolean dequeue (Tqueue *Pqueue, Titem, item) {

if (Pqueue -> number_of_items == 0)

return (NOT_OK);

else {

*Pitem = Pqueue -> array[Pqueue->first++];

if (Pqueue -> first > MAXN -1)

Pqueue -> first = 0;

Pqueue -> number_of_items--;

return (OK);

} }

Untuk memperjelas masing-masing fungsi pada deklarasi di atas, perhatikan gambar 4 di bawah ini : Antrian 6 5 4 3 2 1 first = 1 last = 0

Gambar 4. Contoh deklarasi antrian dengan 6 ukuran

Dari gambar 4 di atas last dibuat = 0 dan first dibuat = 1 serta antrian dikatakan kosong jika last < first.

(52)

6 5 4 D last = 4 3 C 2 B 1 A first = 1

Gambar 5. Contoh deklarasi antrian penambahan 4 buah elemen

Dari gambar 5 di atas menunjukkan array dengan 6 elemen untuk menyajikan sebuah antrian (dalam hal ini MAXN = 6). Pada saat permulaan antrian dalam keadaan kosong (gambar 4.) pada gambar 5 terdapat 4 buah elemen yang ditambahkan. Dalam hal ini first = 1 dan last = 4. Gambar 6 menunjukkan antrian setelah 2 elemen yaitu setelah A dan B dihapus.

Gambar 7 menunjukkan antrian baru setelah E dan F ditambahkan. Banyaknya elemen dalam antrian adalah 6-3+1=4 elemen

Antrian 6 5 4 D last = 4 3 C first = 1 2 1

Gambar 6. Contoh deklarasi antrian penghapusan 2 buah elemen

Antrian

(53)

5 E

4 D

3 C first = 3

2 1

Gambar 6. Contoh deklarasi antrian penambahan 2 buah elemen

Karena array terdiri dari 6 elemen, maka sebenarnya kita masih bisa menambah elemen lagi. Tetapi jika ingin ditambah elemen baru, maka nilai last harus ditambah 1 menjadi 7. Padahal array antrian hanya terdiri dari 6 elemen, sehingga tidak mungkin ditambah lagi, meskipun sebenarnya array tersebut masih kosong di dua tempat.

4. IMPLEMENTASI ANTRIAN DENGAN POINTER

Pada ilustrasi contoh di atas penambahan yang selalu dilakukan disebelah belakang antrian dan penghapusan yang selalu dilakukan pada elemen pada posisi paling depan, maka antrian sebenarnya juga merupakan bentuk khusus dari suatu senarai berantai (linked list). Jumlah elemen yang bisa diisi dalam antrian terbatas pada ukuran array yang digunakan.

Untuk memanipulasi sebuah antrian bisa digunakan dua buah variabel yang menyimpan posisi elemen paling depan dan elemen paling belakang. Apabila antrian diimplementasikan menggunakan linked list maka cukup 2 pointer yang bisa dipakai yaitu elemen paling depan (kepala) dan elemen paling belakang (ekor).

Untuk mengimplementasikan antrian dengan menggunakan pointer, perhatikan algoritma berikut ini :

1. Tentukan struktur untuk menampung node yang akan dimasukkan pada antrian. Deklarasi struktur pada penggalan program berikut ini :

struct queueNode {

char data;

(54)

};

typedef struct queueNode QUEUENODE; ypedef QUEUENODE * QUEUENODEPTR;

QUEUENODEPTR headPtr = NULL, tailPtr = NULL;

2. Deklarasikan penambahan elemen baru pada antrian, dimana letaknya adalah paling belakang. Deklarasi penambahan elemen baru tersebut dapat dilihat pada penggalan program berikut ini :

void enqueue ( QUEUENODEPTR *headPtr, QUEUENODEPTR *tailPtr, char value ) {

QUEUENODEPTR newPtr = malloc ( sizeof ( QUEUENODE ) ); If ( newPtr != NULL )

{

newPtr -> data = value; newPtr -> nextPtr = NULL; if ( isEmpty ( *headPtr ) ) *headPtr = newPtr; else

( *tailPtr ) -> nextPtr = newPtr; *tailPtr = newPtr;

}

3. Lakukan pengecekan terhadap antrian, apakah antrian dalam kondisi kosong atau tidak. Kalau kondisi antrian kosong, maka elemen bisa dihapus. Penggalan program berikut ini akan menunjukkan kondisi tersebut.

int isEmpty ( QUEUENODEPTR headPtr ) {

return headPtr == NULL; }

(55)

Daftar Pustaka

Andri Kristanto, Algoritma & Pemrograman dengan C++ Edisi 2, Graha Ilmu, Yogyakarta, 2009. Moh. Sjukani, Struktur Data [ Algoritma & Struktur Data 2 ] dengan C, C++, Mitra Wacana Media, Jakarta, 2008.

Teddy Marcus Zakaria dan Agus Prijono, Konsep dan Implementasi Struktur Data, Informatika, Bandung, 2006.

(56)

MODUL PERKULIAHAN

Algoritma

Pemrograman

dan Struktur

Data

Modul Standar untuk

digunakan dalam Perkuliahan

di Universitas Mercu Buana

Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh

Ilmu Komputer Sistem Informasi

06

87007 Team Dosen

Abstract

Kompetensi

(57)

Insertion Sort. Membuat Algoritma dan penerapannya ke dalam bahasa pemrograman

Sorting Sederhana dan dapat membuat Algoritma dan program sorting.

SORTING

1.

Definisi Sorting

Salah satu bagian penting dari struktur data adalah sorting atau pengurutan data. Ada

banyak sekali Algoritma pengurutan data di dunia komputer, yatu : bubble sort, selection sort, insertion sort, exchange sort, quick sort, merge sort, dan lain lain.

Sorting adalah proses pengurutan data yang sebelumnya disusun secara acak atau

tidak teratur sehingga menjadi tersusun secara terurut menurut suatu aturan tertentu. Pada umumnya terdapat 2 jenis pengurutan :

Ascending (naik, pengurutan dari karakter/angka kecil ke karakter/angka besar).

Descending (turun, pengurutan dari karakter/angka besar ke karakter/angka kecil).

Contoh :

Data acak : 5 6 8 1 3 25 10

Terurut Ascending : 1 3 5 6 8 10 25

Terurut Descending : 25 10 8 6 5 3 1

2.

Metode Pengurutan

Untuk melakukan proses pengurutan tersebut dapat digunakan berbagai macam cara / metoda. Beberapa metoda diantaranya :

15. Bubble / Exchange Sort

16. Selection Sort

17. Insertion Sort

2.1 Metode Bubble Sort

Metode bubble sort adalah metode yang mendasarkan penukaran dua buah elemen

untuk mencapai keadaan urut. Metode ini mempunyai perilaku seperti gelembung dimana bila akan diurutkan naik nilai yang besar akan naik (indeks besar) sementara nilai yang kecil akan

(58)

turun (indeks kecil). Setiap data akan dibandingkan dengan data yang ada disebelahnya sampai dengan data terakhir. Metode ini adalah yang termudah, tetapi paling tidak efisien. Contoh data-data sebagai berikut akan diurut dari yang terkecil sampai yang terbesar dari ke 8 data tersebut dan akan menggunakan pembandingan data yang paling akhir:

5 34 32 25 75 42 22 2

Adapun langkah-langkah pengurutan adalah sebagai berikut :

Langkah 1: 5 34 32 25 75 42 22 2 5 34 32 25 75 42 2 22 5 34 32 25 75 2 42 22 5 34 32 25 2 75 42 22 5 34 32 2 25 75 42 22 5 34 2 32 25 75 42 22 5 2 34 32 25 75 42 22 2 5 34 32 25 75 42 22 Hasilnya adalah : 2 5 34 32 25 75 42 22 Langkah 2 : 2 5 34 32 25 75 42 22 2 5 34 32 25 75 22 42 2 5 34 32 25 22 75 42 2 5 34 32 22 25 75 42 2 5 34 22 32 25 75 42 2 5 22 34 32 25 75 42 Hasilnya adalah : 2 5 22 34 32 25 75 42

(59)

Langkah 3 : 2 5 22 34 32 25 75 42 2 5 22 34 32 25 42 75 Hasilnya adalah : 2 5 22 34 32 25 42 75 Langkah 4 : 2 5 22 34 32 25 42 75 2 5 22 34 25 32 42 75 2 5 22 25 34 32 42 75 Langkah 5 : 2 5 22 25 34 32 42 75 2 5 22 25 32 34 42 75 Hasilnya adalah : 2 5 22 25 32 34 42 75

Untuk pengurutan data dari besar ke kecil adalah kebalikan dari proses di atas. Algoritma dari langkah-langkah di atas adalah :

1. Tentukan data-data yang akan diurutkan dan disimpan dalam array. 2. Lakukan pengulangan dari data-data tersebut.

3. Lakukan pembandingan antara data yang satu dengan data yang lain, dimana kalau data yang satu lebih kecil dari data yang lain, maka posisinya ditukar. Kalau tidak, posisinya tetap.

4. Tampilkan data hasil pembandingan.

5. Ulangi langkah 3, sampai semua data dibandingkan. 6. selesai.

Implementasi dari langkah-langkah dalam Bubble Sort dapat dilihat pada program berikut ini, program Ascending dengan menggunakan Bubble Sort.

(60)

#include <iomanip.h> void main() { int NumList[8]= { 5, 34, 32, 25, 75, 42, 22, 2}; int i,ii,iii; int Swap;

cout<<"Data sebelum diurutkan : \n"; for(int ctr=0; ctr<8; ctr++)

{

cout<< setw(3)<<NumList[ctr]; }

cout<<"\n\n"; for(i=0; i<7; i++) for(ii=0; ii<7; ii++)

if (NumList[ii] > NumList[ii+1]) { Swap = NumList[ii]; NumList[ii] = NumList[ii+1]; NumList[ii+1] = Swap; }

cout<<"Data setelah diurutkan : \n" ; for (iii=0; iii<8; iii++);

cout<<setw(3)<<NumList[iii]; cout<<endl<<endl;

}

2.2 Metode Selection Sort

Metode seleksi (Selection Sort) adalah suatu metode pengurutan yang membandingkan elemen yang sekarang dengan elemen berikutnya sampai elemen yang terakhir. Jika ditemukan elemen lain yang lebih kecil dari elemen sekarang, maka dicatat posisinya dan kemudian ditukar. Misalkan ada data-data sebagai berikut yang akan diurutkan dari yang terkecil sampai yang terbesar dari data tersebut.

(61)

5 34 32 25 75 42 22 2

Langkah-langkahnya adalah sebagai berikut :

Langkah 1 : Posisi : 1 2 3 4 5 6 7 8 Data : 5 34 32 25 75 42 22 2 Pembanding Posisi 5 < 34 1 5 < 32 1 5 < 25 1 5 < 75 1 5 < 42 1 5 < 22 1 5 < 2 8

Tukar data pada posisi 1 dengan data posisi 8

Hasil Sementara : 2 34 32 25 75 42 22 5 Langkah 2 : Posisi : 1 2 3 4 5 6 7 8 Data : 2 34 32 25 75 42 22 5 Pembanding Posisi 34 > 32 3 32 > 25 4 25 < 75 4 25 < 42 4 25 > 22 7 22 > 5 8

Tukar data pada posisi 2 dengan data pada posisi 8

(62)

Langkah 3 : Posisi : 1 2 3 4 5 6 7 8 Data : 2 5 32 25 75 42 22 34 Pembanding Posisi 32 > 25 4 25 < 75 4 25 < 42 4 25 > 22 7 22 < 34 7

Tukar data pada posisi 3 dengan data pada posisi 7

Hasil Sementara : 2 5 22 25 75 42 32 34 Langkah 4 : Posisi : 1 2 3 4 5 6 7 8 Data : 2 5 22 25 75 42 32 34 Pembanding Posisi 75 > 42 6 42 > 32 7 32 < 34 7

Tukar data pada posisi 5 dengan data pada posisi 7

Hasil Sementara : 2 5 22 25 32 42 75 34 Langkah 5 : Posisi : 1 2 3 4 5 6 7 8 Data : 2 5 22 25 32 42 75 34 Pembanding Posisi 42 < 75 6 42 > 34 8

(63)

Hasil Sementara : 2 5 22 25 32 34 75 42 Langkah 6 : Posisi : 1 2 3 4 5 6 7 8 Data : 2 5 22 25 32 34 75 42 Pembanding Posisi 75 > 42 8

Tukar data pada posisi 7 dengan data pada posisi 8

Hasil Akhir : 2 5 22 25 32 34 42 75

Proses pengurutan data di atas memerlukan 6 kali perulangan. Algoritma dari langkah-langkah di atas adalah :

1. Tentukan data-data yang akan diurutkan dan disimpan dalam array. 2. Lakukan pengulangan dari data-data tersebut.

3. Lakukan pembandingan antara data yang satu dengan data yang lain, dimana kalau data yang satu lebih kecil dari data yang lain, maka posisinya ditukar. Kalau tidak, posisinya tetap.

4. Tampilkan data hasil pembandingan.

5. Ulangi langkah 3, sampai semua data dibandingkan. 6. Selesai.

Implementasi program selection adalah sebagai berikut : #include <stdio.h> #include <conio.h> int A[8]={2,5,22,25,32,34,42,75},i,j,tampung,pos; main() { clrscr(); printf("Sebelum Sorting : \n"); for (i=0; i<8; i++) {

printf("%i " , A[i]); }

(64)

if (A[j]<A[pos]) { pos=j; } } if (pos!=i) { tampung=A[pos]; A[pos]=A[i]; A[i]=tampung; } printf("\n\nSetelah Sorting : \n"); for (i=0; i<8; i++)

{

printf("%i ", A[i]); }

return 0; }

2.3. Metode Insertion Sort

Metode Insertion(penyisipan) adalah dengan membandingkan data/elemen ke-n (n

mulai dari data ke-2 hingga elemen terakhir) dengan elemen-elemen sebelumnya. Jika ditemukan data yang lebih kecil maka data tersebut disisipkan ke depan (tukar posisi) sesuai dengan posisi seharusnya.

Contoh : 8 3 7 4

Langkah 1 : 3 dibandingkan dengan 8, karena 3 < 8 maka kedua elemen ditukar posisinya

yang menghasilkan urutan 3 8 7 4

Langkah 2 : 7 dibandingkan dengan 8, karena 7 < 8 maka 7 ditukar posisinya dengan 8

yang menghasilkan urutan 3 7 8 4

Langkah 3 : 4 dibandingkan dengan 8, karena 4 < 8 maka tukar posisinya, hasil sementara

Gambar

Gambar 1. Algoritma Perhitungan Luas Lingkaran  Komponen-komponen pada Flow Chart
Gambar  di  bawah  ini  menunjukan  bagaimana  pointer  headRef  dalam  ChangeToNull  menunjukan ke head1 pada Change Caller
Gambar 3.3 Membuat referensi local
Gambar 3.4 menambah node baru
+7

Referensi

Dokumen terkait

Karena antrian merupakan suatu kumpulan data, maka tipe data yang sesuai untuk menyajikan antrian adalah menggunakan array atau list (senarai berantai).. Contoh antrian dengan

• Banyak fasilitas untuk memanipulasi operator dan fungsi • Struktur penulisan bahasa yang terstruktur. • Bahasa tingkat tinggi yang mempunyai kemampuan seperti bahasa tingkat

Meskipun sudah dikatakan, bahwa sewaktu kita menyusun algoritma kita tidak perlu tahu bahasa pemrograman apa yang akan digunakan kelak, namun, untuk penulisan algoritma yang

Program merupakan kumpulan instruksi-instruksi yang berkaitan sistematis dan logis dalam komputasi (bahasa pemrograman tertentu) untuk memecahkan permasalahan..

syntax (cara penulisan) sesuai dengan bahasa pemrograman yang digunakan yang mempunyai komponen-komponen : Input, Output, Proses,.. Percabangan

4 LINKED LIST Linked List Senarai Berantai adalah jenis struktur data yang berisi kumpulan data yang disusun secara linear dengan setiap data disimpan dalam sebuah simpul dan antara

Tugas 0A I/O 1 Nama berkas kode sumber : SDA1010A.java Batas waktu eksekusi program : 0,3 detik / kasus uji Batas memori program : 16 MiB / kasus uji Input/Output I/O yang dalam

• Program dibuat dengan menggunakan bahasa pemrograman sebagai alat untuk mengungkapkan ide sang programmer agar dapat dijalankan oleh komputer • Setelah ditulis dalam bahasa