Anda di halaman 1dari 83

STRUKTUR DATA

1. Deskripsi Mata kuliah


Matakuliah ini mengajarkan sistem pengorganisasian data pada memori
komputer maupun file (berkas) pada suatu media penyimpanan dengan
menggunakan struktur data array, struct, tree, dan file menggunakan
teknik-teknik seperti stack, queue, dan linked list serta hashing.
Matakuliah ini juga mengajarkan teknik-teknik manipulasi data seperti
tambah, hapus, edit, pencarian dan pengurutan, yang dilakukan dengan
menggunakan bahasa pemrograman generasi ketiga (Bahasa C).
2. Tujuan Mata kuliah
Mahasiswa diharapkan mampu:
Memahami sistem pengorganisasian data pada memori komputer dan
file (berkas) pada media penyimpanan.
Mengimplementasikannya dalam program dengan menggunakan salah
satu bahasa pemrograman generasi ke-3 (Bahasa C) untuk membuat
berbagai macam struktur data (array, tree, struct) dengan teknik-teknik
tertentu (linked list, stack, dan queue) serta manipulasinya (sorting dan
searching) secara baik, efisien, dan cepat.
3. Silabus
Perkenalan
Perkenalan dan silabus
Aturan praktikum
Refresh Bahasa C
Pengantar Struktur Data, Abstract Data Type (ADT) dan Struct
Pengantar Struktur Data
Pengertian dan cara pembuatan ADT
Pengertian dan pendeklarasian Struct
Struct: add,del,edit & array of struct
Contoh-contoh program
Searching Array
Refresh array
Pengertian searching
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Algoritma-algoritma searching : sequential search, binary search


Array slice / explode
Sorting Array
Algoritma-algoritma sorting : bubble sort, selection sort, insertion 2
sort, dan quick sort
Stack dan Queue dengan Array
Pengertian stack, cara pembuatan stack, dan operasi-operasinya pada
array
Pengertian queue, cara pembuatan queue, dan operasi-operasinya
pada array
Pointer dan Function
Konsep, operator, dan deklarasi
Pointer pada array
Function by value & reference
Single Linked List Non Circular
Single Linked List Non Circular
Insert, update, dan delete
Single Linked List Circular
Insert, update, dan delete
Double Linked List Non Circular
Insert, update, dan delete
Double Linked List Circular
Insert, update, dan delete
Function Recursif dan Graf
Konsep rekursif implementasi Graf serta contoh
Tree
Konsep dan pembuatan
Kunjungan Tree: pre-order, in-order, dan post-order, level-order
Berbagai macam operasi tree

4. Refresh C++
Bahasa C dibuat pada tahun 1978 untuk Sistem Operasi Unix oleh Bell
Labs (Ken Thompson dan Dennis M. Ritchie).
Buku The C Programming Language
Bahasa C merupakan salah satu bahasa pemrograman yang paling sering

Teknik Informatika
Universitas Muhammadiyah Ponorogo

dipakai oleh pemrogram di seluruh dunia, terutama karena bahasa C


memperbolehkan pengakses memori secara manual. (dengan
POINTER)
Bahasa C menjadi dasar bahasa C++.
Bahasa C seringkali dipakai untuk membuat bahasa-bahasa
pemrograman yang lain.
Distandarisasi ANSI tahun 1989.
5. Identifier & Tipe Data C
Identifier adalah pengingat tempat penyimpanan data di dalam memori
komputer.
Variabel : bisa diubah
Konstanta : bersifat tetap

Consists mainly of :
Preprocessor Directive
Function Definitions
Data Structures
Code programs
Function Body
3

#include <.>
#define .
int coba();

void main()
{
int a;
printf(Hello, world!\n);
a = coba();
}
int coba(){
..
}

8. More about Hello World

Preprocessor
Comments are good

6. Some Programmer Jargon


Beberapa istilah:
Source code: kode program yang ditulis programmer.
Compile (build): pengubahan source code ke dalam object code (bisa
bahasa mesin / assembly)
Executable: program dalam bahasa mesin yang siap dieksekusi.
Language: bahasa pemrograman.
Library: fungsi-fungsi yang digunakan pada pembuatan program.
Preprocessor Directive
Dimulai dengan tanda #
Header file: file yang berekstensi .h yang disertakan pada
pembuatan program.
7. Structure of C
Teknik Informatika
Universitas Muhammadiyah Ponorogo

main() means start here


Library command
Return 0 from main means our program
finished without errors
Brackets
define code blocks

9. Keywords of C
Flow control (6) if, else, return, switch, case, default
Loops (5) for, do, while, break, continue
Common types (5) int, float, double, char, void
Structures (2) struct, typedef
Sizing things (1) sizeof
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Rare but still useful types (7) extern, signed, unsigned, long, short,
static, const
Evil keywords which we avoid (1) goto

10. Variable
Kita harus mendeklarasikan tipe data setiap variabel pada C.
5
Setiap varibel punya tipe data dan namanya.
Variabel adalah unik, tidak boleh berupa keyword, dimulai dengan huruf
atau underline, maks 32 karakter
int a,b;
double d;
/* This is
a bit cryptic */

int start_time;
int no_students;
double course_mark;
/* This is a bit better */

11. Pendeklarasian Variabel & Konstanta

13. The char Type


char disimpan dalam kode ascii (integer)
Print char dengan %c
char menggunakan single quote

int main()
{
char a, b;
a= 'x'; /* Set a to the character x */
printf ("a is %c\n",a);
b= '\n'; /* This really is one character*/
printf ("b is %c\n",b);
return 0;
}

14. A short note about ++


++i means increment i then use it
i++ means use i then increment it
int i= 6;
printf ("%d\n",i++);

12. Escape Characters

/* Prints 6 sets i to 7 */
Note this important difference

int i= 6;
printf ("%d\n",++i);

/* prints 7 and sets i to 7 */

All of the above also applies to --.


15. Casting
Memaksa suatu tipe data
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Tipe data yang serupa


float -> int
Int -> float
Lihat contoh!

18. Control Structure 2


16. Formatting Command Summary
Format Command

Data type

Description

%d

Int

Decimal number

%x

Int

Hexadecimal number

%b

Int

Low byte as binary


number

%c

Int

Low byte as ASCII


character

%f

float

Floating point number

%s

char array

Char array (string)

17. Control Structure 1

IF / IF ELSE

SWITCH

if ( true ) {
DoFirstThing();
DoSecondThing();
};
if ( true )
DoSomething();
else

switch ( key ) {
case a:
case A:
DoFirstThing();
DoSecondThing();
break;
case b:
DoSomething();
break;
default:
break;
};

DoSomethingElse()
;

Teknik Informatika
Universitas Muhammadiyah Ponorogo

FOR

WHILE

int i, j;
for (i=0; i<5; i++)
for (j=5; j>0; j--) {
// i counts up
// j counts down
printf(%i %j\n, i, j);
};

int i = 0;
int StayInLoop = 1;
while ( StayInLoop ) {
i+=2;
// Make sure you have
// exit condition!
if ( i > 200 )
StayInLoop = 0;
};

The

++ / -- is shortcut

used
to
decrement

increment
value
of

/
int

+= increments by n

19. What is a function?


The function is one of the most basic things to understand in C
programming.
A function is a sub-unit of a program which performs a specific task.
We have already (without knowing it) seen one function from the C
library printf.
We need to learn to write our own functions.
Functions take arguments (variables) and may return an argument.
Formal parameter
Actual parameter
20. Type of function
Void : tidak mengembalikan nilai
Non-void : mengembalikan nilai

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Tujuan nilai kembalian berupa integer adalah untuk mengetahui status


eksekusi program.
jika terminated successfully (EXIT_SUCCESS) maka, akan
dikembalikan status 0,
sedangkan jika terminated unsuccessfully (EXIT_FAILURE) akan
dikembalikan nilai status tidak 0, biasanya bernilai 1
Biasanya dipakai di lingkungan UNIX
21. An example function
9
Prototype the function

Call the function


function header
The function itself

22. The main Function


function main() dibutuhkan agar program C dapat dieksekusi!
Tanpa function main, program C dapat dicompile tapi tidak dapat
dieksekusi (harus dengan flag parameter c, jika di UNIX)
Pada saat program C dijalankan, maka compiler C pertama kali akan
mencari function main() dan melaksanakan instruksi-instruksi yang ada
di sana.
23. int main()
Berarti di dalam function main tersebut harus terdapat keyword return
di bagian akhir fungsi dan mengembalikan nilai bertipe data int,
Mengapa hasil return harus bertipe int juga? karena tipe data yang
mendahului fungsi main() diatas dideklarasikan int
Teknik Informatika
Universitas Muhammadiyah Ponorogo

24. What is scope variable?


The scope of a variable is where it can be used in a program
10
Normally variables are local in scope - this means they can only be used
in the function where they are declared (main is a function)
We can also declare global variables.
If we declare a variable outside a function it can be used in any function
beneath where it is declared
Global variables are A BAD THING
25. Why Global is Bad?

26. The print stars example

This program prints five rows of


five stars
*****
*****
*****
*****
*****
Loop around 5 times to
print the stars
Variables here are LOCAL variables
This prints 'n' stars and then
a new line character

Teknik Informatika
Universitas Muhammadiyah Ponorogo

27. Other techniques for debugging


Check missing brackets and commas.
Check that you have a semicolon at the end of every line which needs
one.
Put in some printf
if you know what your program is DOING you will know what it is
DOING WRONG.
Try to explain to someone else what the program is meant to do.
Take a break, get a cup of coffee and come back to it fresh.
Debugging is FRUSTRATING

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

11

Pengantar Tipe Data, Obyek Data & Struktur Data

Struktur data = obyek data + [operasi manipulasi data]

1. Pengantar
Bagaimana cara mengatasi masalah implementasi program dengan 12
komputer?
Pemahaman masalah secara menyeluruh dan persiapan data
Keputusan operasi-operasi yang dilakukan terhadap data
Penyimpanan data-data pada memori sehingga tersimpan dan
terstruktur secara logis, operasinya efisien
Pengambilan keputusan terhadap bahasa pemrograman mana yang
paling cocok untuk jenis data yang ada

4. Hubungan SD dan Algoritma


Dengan pemilihan struktur data yang baik, maka problem yang13
kompleks dapat diselesaikan sehingga algoritma dapat digunakan secara
efisien, operasi-operasi penting dapat dieksekusi dengan sumber daya
yang lebih kecil, memori lebih kecil, dan waktu eksekusi yang lebih
cepat.
Tidak semua struktur data baik dan sesuai. Contoh untuk problem data
bank: pengupdate-an harus cepat, sedangkan penambahan/penghapusan
data boleh lebih lambat.

2. Perbedaan Tipe Data, Obyek Data & Struktur Data


Tipe data adalah jenis data yang mampu ditangani oleh suatu bahasa
pemrograman pada komputer.
Tiap-tiap bahasa pemrograman memiliki tipe data yang memungkinkan:
Deklarasi terhadap variabel tipe data tersebut
Menyediakan kumpulan operasi yang mungkin terhadap variabel
bertipe data tersebut
Jenis obyek data yang mungkin
Contoh tipe data di C? Java? Pascal? .NET?
Obyek Data adalah kumpulan elemen yang mungkin untuk suatu tipe
data tertentu.
Mis: integer mengacu pada obyek data -32768 s/d 32767, byte 0 s/d
255, string adalah kumpulan karakter maks 255 huruf
Struktur Data adalah cara penyimpanan dan pengorganisasian data-data
pada memori komputer maupun file secara efektif sehingga dapat
digunakan secara efisien, termasuk operasi-operasi di dalamnya.

5. Ciri Algoritma
Ciri algoritma yang baik menurut Donald E.Knuth :
Input: ada minimal 0 input atau lebih
Ouput: ada minimal 1 output atau lebih
Definite: ada kejelasan apa yang dilakukan
Efective: langkah yang dikerjakan harus efektif
Terminate: langkah harus dapat berhenti (stop) secara jelas

3. Aktivitas Struktur Data


Di dalam struktur data kita berhubungan dengan 2 aktivitas:
Mendeskripsikan kumpulan obyek data yang sah sesuai dengan tipe
data yang ada
Menunjukkan mekanisme kerja operasi-operasinya
Contoh: integer (-32768 s/d 32767) dan jenis operasi yang
diperbolehkan adalah +, -, *, /, mod, ceil, floor, <, >, != dsb.
Teknik Informatika
Universitas Muhammadiyah Ponorogo

6. ADT (Abstract Data Type) atau Tipe Data Bentukan


Bahasa pemrograman bisa memiliki tipe data:
Built-in : sudah tersedia oleh bahasa pemrograman tersebut
Tidak berorientasi pada persoalan yang dihadapi.
UDT : User Defined Type, dibuat oleh pemrogram.
Mendekati penyelesaian persoalan yang dihadapi
Contoh: record pada Pascal, struct pada C, class pada Java
ADT : Abstract Data Type
memperluas konsep UDT dengan menambahkan pengkapsulan
atau enkapsulasi, berisi sifat-sifat dan operasi-operasi yang bisa
dilakukan terhadap kelas tersebut.
Contoh: class pada Java
Bahasa C memiliki tipe data numerik dan karakter (seperti int, float,
char dan lain-lain). Disamping itu juga memiliki tipe data enumerasi
dan structure. Bagaimana jika kita ingin membuat tipe data baru?
Untuk pembuatan tipe data baru digunakan keyword typedef
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Bentuk umum:
typedef <tipe_data_lama> <ama_tipe_data_baru>
7. Program
Contoh:

#include <stdio.h>
#include <conio.h>
typedef int angka;
typedef float pecahan;
typedef char huruf;
void main(){
clrscr();
angka umur;
pecahan pecah;
huruf h;
huruf nama[10];
printf("masukkan umur anda : ");scanf("%d",&umur);
printf("Umur anda adalah %d",umur);
printf("\nmasukkan bilangan pecahan : ");scanf("%f",&pecah);
printf("Bilangan pecahan %f",pecah);
printf("\nmasukkan huruf : ");h=getche();
printf("\nHuruf anda %c",h);
printf("\nmasukkan nama : ");scanf("%s",nama);
printf("Nama anda %s",nama);
getch();
}

14

Struct adalah tipe data bentukan yang berisi kumpulan variabel-variabel


yang bernaung dalam satu nama yang sama dan memiliki kaitan satu
sama lain.
Berbeda dengan array hanya berupa kumpulan variabel yang bertipe
data sama, struct bisa memiliki variabel-variabel yang bertipe data sama
atau berbeda, bahkan bisa menyimpan variabel yang bertipe data array
15
atau struct itu sendiri.
Variabel-variabel yang menjadi anggota struct disebut dengan elemen
struct.
9. Bentuk
Umum
typedef
struct <nama_struct> {

10. Pendeklarasian dan penggunaan Struct (1) (menggunakan typedef)


typedef struct Mahasiswa {
char NIM[8];
char nama[50];
float ipk;
};

Hasil Program

tipe_data <nama_var>;
tipe_data <nama_var>;
....

untuk menggunakan struct Mahasiswa dengan membuat


variabel mhs dan mhs2
Mahasiswa mhs,mhs2;
untuk menggunakan struct Mahasiswa dengan membuat
variabel array m;
Mahasiswa m[100];

8. Stuct
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

clrscr();
printf("NIM = ");scanf("%s",mhs.NIM);
printf("Nama = ");scanf("%s",mhs.nama);
printf("IPK = ");scanf("%f",&mhs.ipk);
11. Pendeklarasian dan penggunaan Struct (2) (tanpa menggunakan
typedef)
struct {
16
char NIM[8];
char nama[50];
float ipk;
} mhs;

printf("Data Anda : \n");


printf("NIM : %s\n",mhs.NIM);
printf("Nama : %s\n",mhs.nama);
printf("IPK : %f\n",mhs.ipk);
getch();

17

}
Hasil

Berarti kita sudah mempunyai variabel mhs yang bertipe data struct seperti
diatas.
12. Cara penggunaan struct dan pengaksesan elemen-elemennya
Penggunaan/pemakaian tipe data struct dilakukan dengan membuat
suatu variabel yang bertipe data struct tersebut
Pengaksesan elemen struct dilakukan secara individual dengan
menyebutkan nama variabel struct diikuti dengan operator titik (.)
Misalnya dengan struct mahasiswa seperti contoh di atas, kita akan
akses elemen-elemennya seperti contoh berikut:
13. Program
Contoh 1
#include <stdio.h>
#include <conio.h>
//Pendeklarasian tipe data baru struct Mahasiswa
typedef struct Mahasiswa{
char NIM[9];
char nama[30];
float ipk;
};
void main(){
//Buat variabel mhs bertipe data Mahasiswa
Mahasiswa mhs;

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Contoh 2
#include <stdio.h>
#include <conio.h>
#define phi 3.14
//langsung dianggap variabel 'lingkaran'
struct {
float jari2;
float keliling;
float luas;
} lingkaran;
//fungsi void untuk menghitung luas ingkaran
void luasLingkaran(){
//langsung menggunakan luas lingkaran asli
lingkaran.luas = lingkaran.jari2 * lingkaran.jari2 * phi;
printf("\nLuas lingkaran = %f",lingkaran.luas);
}
//fungsi yang mengembalikan nilai float untuk menghitung keliling
Teknik Informatika
Universitas Muhammadiyah Ponorogo

lingkaran
float kelLingkaran(float j){
return 2*phi*lingkaran.jari2;
}
int main(){
clrscr();
printf("Jari-jari = ");scanf("%f",&lingkaran.jari2);
//panggil fungsi luasLingkaran
18
luasLingkaran();
//panggil fungsi keliling, nilai kembaliannya dikirim ke keliling lingkaran
asli
lingkaran.keliling = kelLingkaran(lingkaran.jari2);
//tampilkan keliling lingkaran asli
printf("\nKeliling lingkaran = %f",lingkaran.keliling);
getch();
}

};
typedef struct Login{
int ID;
Date tglLogin;
Time waktuLogin;
};
int main(){
Login user1;
printf("USER 1\n");
printf("ID : ");scanf("%d",&user1.ID);
printf("Tanggal Login\n");
printf("Hari : ");scanf("%d",&user1.tglLogin.dd);
printf("Bulan : ");scanf("%d",&user1.tglLogin.mm);
printf("Tahun : ");scanf("%d",&user1.tglLogin.yyyy);
printf("Waktu Login\n");
printf("Jam : ");scanf("%d",&user1.waktuLogin.h);
printf("Menit : ");scanf("%d",&user1.waktuLogin.m);
printf("Detik : ");scanf("%d",&user1.waktuLogin.s);
printf("Terimakasih\n");

Hasil

14. Struct yang berisi struct lain


#include <stdio.h>
#include <conio.h>
typedef struct Date{
int dd;
int mm;
int yyyy;
};

printf("Data Anda :\n");


printf("ID : %d\n",user1.ID);
printf("Date
:
%d
%d
%d\n",user1.tglLogin.dd,user1.tglLogin.mm,user1.tglLogin.yyyy);
printf("ID
:
%d:%d:
%d\n",user1.waktuLogin.h,user1.waktuLogin.m,user1.waktuLogin.s);
getch();
}
Hasil

typedef struct Time{


int h;
int m;
int s;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

19

Teknik Informatika
Universitas Muhammadiyah Ponorogo

printf("Hari : ");scanf("%d",&user[i].tglLogin.dd);
printf("Bulan : ");scanf("%d",&user[i].tglLogin.mm);
printf("Tahun : ");scanf("%d",&user[i].tglLogin.yyyy);
printf("Waktu Login\n");
printf("Jam : ");scanf("%d",&user[i].waktuLogin.h);
printf("Menit : ");scanf("%d",&user[i].waktuLogin.m);
printf("Detik : ");scanf("%d",&user[i].waktuLogin.s);
printf("Terimakasih Atas Pengisiannya\n");
15. Array of Struct
#include <stdio.h>
#include <conio.h>
typedef struct Date{
int dd;
int mm;
int yyyy;
};
typedef struct Time{
int h;
int m;
int s;
};

20

printf("\nData User ke-%d:\n",i+1);


printf("Login ID : %d\n",user[i].ID);
printf("Login Date : %d - %d 21
%d\n",user[i].tglLogin.dd,user[i].tglLogin.mm,user[i].tglLogin.yyyy);
printf("Login
Time
:
%d:%d:
%d\n",user[i].waktuLogin.h,user[i].waktuLogin.m,user[i].waktuLogin.s);
}
getch();
}
Hasil

typedef struct Login{


int ID;
Date tglLogin;
Time waktuLogin;
};
int main(){
Login user[3];
//3 user
for(int i=0;i<3;i++){
printf("\nUSER ke-%d\n",i+1);
printf("ID : ");scanf("%d",&user[i].ID);
printf("Tanggal Login\n");
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

16. LATIHAN
Buatlah program menu yang berisi data-data KTP penduduk yang
disimpan dalam array struct 1 dimensi dan dapat dilakukan penambahan
data, pencarian data, penampilan data dan penghapusan data.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

SEARCHING ARRAY
1. Definisi Array
Array : a finite ordered set of homogenous elements
Elemen-elemen array tersusun secara berderet dan dapat diakses secara
random di dalam memori.
Array memiliki alamat yang besebelahan/berdampingan tergantung
lebar tipe datanya.
Array dapat berupa array 1 dimensi, 2 dimensi, bahkan n-dimensi.
Elemen-elemen array bertipe data sama dan bisa berisi nilai yang sama
atau berbeda-beda.

3. Ilustrasi Array 1 Dimensi int


22

21d2 21d4

21d6

21d8

21da

21dc

21de

21e0

21dc

21dd

21de

21df

21e0

21e1

alamat

%x adalah hexadesimal
indeks
value

21da 21db

23

value

2. Ilustrasi Array 1 Dimensi char


0

indeks

alama
t

4. Pengaksesan Elemen Array


Elemen-elemen array dapat diakses oleh program menggunakan suatu
indeks tertentu secara random ataupun berurutan
Pengisian dan pengambilan nilai pada indeks tertentu dapat dilakukan
dengan mengeset nilai atau menampilkan nilai pada indeks yang
dimaksud.
Dalam C, tidak terdapat error handling terhadap batasan nilai indeks,
apakah indeks tersebut berada di dalam indeks array yang sudah
didefinisikan atau belum.
Hal ini merupakan tanggung jawab
programmer. Sehingga jika programmer mengakses indeks yang salah,
maka nilai yang dihasilkan akan berbeda atau rusak karena mengakses
alamat memori yang tidak sesuai.
5. Contoh array 1 dimensi
char huruf[9];
int umur[10];
int kondisi[2] = {0,1}
int arr_dinamis[] = {1,2,3}
Tanda [] disebut juga elemen yang ke- .... Misalnya kondisi[0] berarti

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

array kondisi elemen yang ke nol.


Array yang sudah dipesan, misalnya 10 tempat tidak harus diisi
semuanya, bisa saja hanya diisi 5 elemen saja, baik secara berurutan
maupun tidak. Namun pada kondisi yang tidak sepenuhnya terisi
tersebut, tempat pemesanan di memori tetap sebanyak 10 tempat, jadi 24
tempat yang tidak terisi tetap akan terpesan dan dibiarkan kosong.
Kita tidak dapat mendeklarasikan array dinamis tanpa inisialisasi!

9. Inisialisasi
25

6. Contoh-contoh lain
Bagaimana menginputkan dan menampilkan array?
Manipulasi array 1 dimensi?
Array tanpa inisialisasi langsung ditampilkan?
Array inisialisasi dengan 0?
Array inisialisasi hanya 2 elemen pertama?
7. Input output array

10. Operasi-operasi Array


Penambahan elemen array
Menampilkan elemen array
Pencarian elemen array
Cari, jika ditemukan, katakan KETEMU!
Penghapusan elemen array
Cari, jika ditemukan kemudian dihapus!
Pengeditan elemen array
Cari, jika ditemukan kemudian diedit!
8. Manipulasi array
11. Arrray 2 dimensi
char a[3][5]
Sama dengan matriks berukuran 3x5
Pada kenyataan di memory:

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Tempat pencarian data dapat berupa array dalam memori, bisa juga pada
file pada external storage.
12. Ilustrasi array 2 dimensi

26

13. Soal alamat array


Soal: int A[10], diket. &A[0] = H1000
Berapa &A[7]?
Jawab:
int berukuran 2 byte
Perpindahan 7-0 = 7 * 2 byte = 14 byte
Maka H1000 + 7 = H100E
Soal: int A[3][5], &A[0][0] = H1000
Berapa &A[2][3]?
Jawab:
int 2 byte
Perpindahan baris: 2-0 = 2 * 5 (kolomnya) = 10
Perpindahan kolom: 3-0 = 3
Total perpindahan: 10 + 3 = 13 * 2 byte = 26 byte
Maka H1000 + H101A = H101A

15. Sequential Search


Adalah suatu teknik pencarian data dalam array ( 1 dimensi ) yang akan27
menelusuri semua elemen-elemen array dari awal sampai akhir, dimana
data-data tidak perlu diurutkan terlebih dahulu.
Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di
indeks array terdepan (elemen array pertama) sehingga waktu yang
dibutuhkan untuk pencarian data sangat sebentar (minimal).
Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak
di indeks array terakhir (elemen array terakhir) sehingga waktu yang
dibutuhkan untuk pencarian data sangat lama (maksimal).
Misalnya terdapat array satu dimensi sebagai berikut:
0
8

2
10

21da 21db

-2

21dc

21dd

5
11

21de

6
7

21df

21e0

indeks
100

21e1

value
alamat

Kemudian program akan meminta data yang akan dicari, misalnya 6.


Jika ada maka akan ditampilkan tulisan ADA, sedangkan jika tidak
ada maka akan ditampilkan tulisan TIDAK ADA.
16. Detail Program

14. Searching
Pada suatu data seringkali dibutuhkan pembacaan kembali informasi
(retrieval information) dengan cara searching.
Searching adalah pencarian data dengan cara menelusuri data-data
tersebut.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

17. Pembahasan Program


Program menggunakan sebuah variabel flag yang berguna untuk
menadai ada atau tidaknya data yang dicari dalam array data. Hanya 28
bernilai 0 atau 1.
Flag pertama kali diinisialiasasi dengan nilai 0.
Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka
flag akan tetap bernilai 0.
Semua elemen array data akan dibandingkan satu persatu dengan data
yang dicari dan diinputkan oleh user.
Question: Bagaimana jika data yang dicari ditemukan dan ditanyakan
terletak di indeks ke berapa?
18. Q & A
Problem: Apakah cara di atas efisien? Jika datanya ada 10000 dan
semua data dipastikan unik?
Solution: Untuk meningkatkan efisiensi, seharusnya jika data yang
dicari sudah ditemukan maka perulangan harus dihentikan!
Hint: Gunakan break!
Question: Bagaimana cara menghitung ada berapa data dalam array
yang tidak unik, yang nilainya sama dengan data yang dicari oleh user?
Hint: Gunakan variabel counter yang nilainya akan selalu bertambah
jika ada data yang ditemukan!
Contoh :

Teknik Informatika
Universitas Muhammadiyah Ponorogo

19. Sequential Search with Sentinel


Perhatikan array data berikut ini:
0

12

-4

indeks

21

value

29

Terdapat 6 buah data dalam array (dari indeks 0 s/d 5) dan terdapat 1
indeks array tambahan (indeks ke 6) yang belum berisi data (disebut
sentinel)
Array pada indeks ke 6 berguna untuk menjaga agar indeks data berada
pada indeks 0 s/d 5 saja. Bila pencarian data sudah mencapai array
indeks yang ke-6 maka berarti data TIDAK ADA, sedangkan jika
pencarian tidak mencapai indeks ke-6, maka data ADA.
Program :

Teknik Informatika
Universitas Muhammadiyah Ponorogo

20. Binary Search


Data yang ada harus diurutkan terlebih dahulu berdasarkan suatu urutan
tertentu yang dijadikan kunci pencarian.
Adalah teknik pencarian data dalam dengan cara membagi data menjadi
dua bagian setiap kali terjadi proses pencarian.
Prinsip pencarian biner adalah:
Data diambil dari posisi 1 sampai posisi akhir N
Kemudian cari posisi data tengah dengan rumus: (posisi awal +
posisi akhir) / 2
Kemudian data yang dicari dibandingkan dengan data yang di 30
tengah, apakah sama atau lebih kecil, atau lebih besar?
Jika lebih besar, maka proses pencarian dicari dengan posisi awal
adalah posisi tengah + 1
Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir
adalah posisi tengah 1
Jika data sama, berarti ketemu.
Ilustrasi :

Program :
31

Contoh Data:
Misalnya data yang dicari 17

01

39

11

12

15

17

23

31

35

Karena 17 > 15 (data tengah), maka: awal = tengah + 1


01

39

11

12

15

17

23

31

35

Karena 17 < 23 (data tengah), maka: akhir = tengah 1


01

39

11

12

15

17

23

31

35

A=B=C

21. Interpolation Search


Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci
tertentu
Teknik searching ini dilakukan dengan perkiraan letak data.
Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku
telepon, misal yang berawalan dengan huruf T, maka kita tidak akan
mencarinya dari awal buku, tapi kita langsung membukanya pada 2/3

Karena 17 = 17 (data tengah), maka KETEMU!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

atau dari tebal buku.


Rumus posisi relatif kunci pencarian dihitung dengan rumus:
Posisi

kunci data[low]
x( high low) low
data[ high] data[low]

Jika data[posisi] > data yg dicari, high = pos 1


Jika data[posisi] < data yg dicari, low = pos + 1

Kasus :
Misal terdapat data sebagai berikut :
Kode
Judul Buku

Program :
Pengarang

025

The C++ Programming

James Wood

034

Mastering Delphi 6

Marcopolo

041

Professional C#

Simon Webe

056

Pure JavaScript v2

Michael Bolton

063

Advanced JSP & Servlet

David Dunn

072

Calculus Make it Easy

088

Visual Basic 2005 Express

Gunner
Christian
Antonie

096

Artificial Life : Volume 1

Gloria Virginia

Penyelesaian :
Kunci Pencarian ? 088
Low ? 0
High ? 7
Posisi = (088 - 025) / (096 - 025) * (7 - 0) + 0 = [6]
Kunci[6] = kunci pencarian, data ditemukan : Visual Basic 2005
Kunci Pencarian ? 060
Low ? 0
Teknik Informatika
Universitas Muhammadiyah Ponorogo

High ? 7
Posisi = (060 025) / (096 025) * (7 0) + 0 = [3]
Kunci[3] < kunci pencarian, maka teruskan
Low = 3 + 1 = 4
High = 7
Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060.
Berarti tidak ada kunci 060.

32

33

22. Soal-soal
Cari tahu tentang cara penggunaan dan teknologi dari website-website
pencari (search engine) yang ada di Internet!
Cari tahu tentang Fibonacci Search!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

int t=*a;
*a=*b;
*b=t;

SORTING ARRAY
34
1. Sorting
Pengurutan data dalam struktur data sangat penting untuk data yang
beripe data numerik ataupun karakter.
Pengurutan dapat dilakukan secara ascending (urut naik) dan
descending (urut turun)
Pengurutan (Sorting) adalah proses menyusun kembali data yang
sebelumnya telah disusun dengan suatu pola tertentu, sehingga tersusun
secara teratur menurut aturan tertentu.
Contoh:
Data Acak
: 5 6 8 1 3 25 10
Ascending
: 1 3 5 6 8 10 25
Descending
: 25 10 8 6 5 3 1
2. Metode Pengurutan Data
Pengurutan berdasarkan perbandingan (comparison-based sorting)
Bubble sort, exchange sort
Pengurutan berdasarkan prioritas (priority queue sorting method)
Selection sort, heap sort (menggunakan tree)
Pengurutan berdasarkan penyisipan dan penjagaan terurut (insert and
keep sorted method)
Insertion sort, tree sort
Pengurutan berdasarkan pembagian dan penguasaan (devide and
conquer method)
Quick sort, merge sort
Pengurutan berkurang menurun (diminishing increment sort method)
Shell sort (pengembangan insertion)

4. Bubble Sort
Metode sorting termudah
Diberi nama Bubble karena proses pengurutan secara berangsurangsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung
yang keluar dari sebuah gelas bersoda.
Bubble Sort mengurutkan data dengan cara membandingkan elemen
sekarang dengan elemen berikutnya.
Pengurutan Ascending :Jika elemen sekarang lebih besar dari elemen
berikutnya maka kedua elemen tersebut ditukar.
Pengurutan Descending: Jika elemen sekarang lebih kecil dari elemen
berikutnya, maka kedua elemen tersebut ditukar.
Algoritma ini seolah-olah menggeser satu per satu elemen dari kanan ke
kiri atau kiri ke kanan, tergantung jenis pengurutannya, asc atau desc.
Ketika satu proses telah selesai, maka bubble sort akan mengulangi
proses, demikian seterusnya sampai dengan iterasi sebanyak n-1.
Kapan berhentinya? Bubble sort berhenti jika seluruh array telah
diperiksa dan tidak ada pertukaran lagi yang bisa dilakukan, serta
tercapai perurutan yang telah diinginkan.

3. Deklarasi Array
Deklarasikan:
int data[100];
int n; //untuk jumlah data
Fungsi untuk Tukar 2 Buah Data (by reference):
void tukar(int *a,int *b){
Teknik Informatika
Universitas Muhammadiyah Ponorogo

35

Teknik Informatika
Universitas Muhammadiyah Ponorogo

36

Dengan prosedur diatas, data terurut naik (ascending), untuk urut


turun (descending) silahkan ubah bagian:
37
if (data[j]<data[j-1]) tukar(&data[j],&data[j-1]);
Menjadi:
if (data[j]>data[j-1]) tukar(&data[j],&data[j-1]);
The bubble sort is an easy algorithm to program, but it is slower than
many other sorts
5. Exchange Sort
Sangat mirip dengan Bubble Sort
Banyak yang mengatakan Bubble Sort sama dengan Exchange Sort
Pebedaan : dalam hal bagaimana membandingkan antar elemenelemennya.
Exchange sort membandingkan suatu elemen dengan elemenelemen lainnya dalam array tersebut, dan melakukan pertukaran
elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen
pusat (pivot).
Sedangkan Bubble sort akan membandingkan elemen
pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian
elemen tersebut itu akan menjadi pusat (pivot) untuk dibandingkan
dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya.

Versi 1

Versi 2

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

38

6. Selection Sort
Merupakan kombinasi antara sorting dan searching
39
Untuk setiap proses, akan dicari elemen-elemen yang belum diurutkan
yang memiliki nilai terkecil atau terbesar akan dipertukarkan ke posisi
yang tepat di dalam array.
Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil
dan data ini akan ditempatkan di indeks terkecil (data[0]), pada putaran
kedua akan dicari data kedua terkecil, dan akan ditempatkan di indeks
kedua (data[1]).
Selama proses, pembandingan dan pengubahan hanya dilakukan pada
indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir
proses.

Prosedur Exchange Sort

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Prosedur Selection Sort


40

7. Insertion Sort
Mirip dengan cara orang mengurutkan kartu, selembar demi selembar
kartu diambil dan disisipkan (insert) ke tempat yang seharusnya.
Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika
ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert)
diposisi yang seharusnya.
Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke
belakang

41

8. Perbandingan
Tabel Perbandingan Kecepatan Metode Pengurutan Data
Untuk data sejumlah 10.000 data pada komputer Pentium II 450 MHz

9. Masih banyak lagi


Merge Sort

Heap Sort

10. Soal

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Quick Sort

Carilah 3 metode sorting lainnya dan tuliskan dalam paper beserta


source code, cara dan analisis dan tiap-tiap metode sorting yang ada!
Buatlah semua procedure-procedure yang ada di atas dalam program
utuh!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

ARRAY STACK DAN QUEUE


1. Stack = tumpukan
Suatu susunan koleksi data dimana data dapat ditambahkan dan
dihapus selalu dilakukan pada bagian akhir data, yang disebut dengan
top of stack
Stack bersifat LIFO (Last In First Out)
Benda yang terakhir masuk ke dalam stack akan menjadi yang pertama
keluar dari stack

2. Operasi Stack
Push : digunakan untuk menambah item pada stack pada tumpukan
paling atas
Pop : digunakan untuk mengambil item pada stack pada tumpukan
paling atas
Clear : digunakan untuk mengosongkan stack
IsEmpty : fungsi yang digunakan untuk mengecek apakah stack sudah
kosong
IsFull : fungsi yang digunakan untuk mengecek apakah stack sudah
penuh

Teknik Informatika
Universitas Muhammadiyah Ponorogo

42

3. Stack with Array of Struct


Definisikan Stack dengan menggunakan suatu struct
Definisikan konstanta MAX_STACK untuk menyimpan maksimum isi
stack
Elemen struct Stack adalah array data dan top untuk menadakan posisi
data teratas
Buatlah variabel tumpuk sebagai implementasi dari struct Stack
Deklarasikan operasi-operasi/function di atas dan buat implemetasinya
4. Program Stack
Contoh deklarasi MAX_STACK
#define MAX_STACK 10
Contoh deklarasi STACK dengan struct dan array data
typedef struct STACK{
int top;
int data[10];
};
Deklarasi/buat variabel dari struct
STACK tumpuk;
Inisialisasi Stack :
Pada mulanya isi top dengan -1, karena array dalam bahasa C dimulai
dari 0, yang berarti bahwa data stack adalah KOSONG!
Top adalah suatu variabel penanda dalam Stack yang menunjukkan
elemen teratas data Stack sekarang. Top Of Stack akan selalu bergerak
hingga mencapai MAX of STACK yang menyebabkan stack PENUH!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

43

Ilustrasi Stack pada saat inisialisasi!


Fungsi IsFull :
Untuk memeriksa apakah stack sudah penuh?
Dengan cara memeriksa top of stack, jika sudah sama dengan 44
MAX_STACK-1 maka full, jika belum (masih lebih kecil dari
MAX_STACK-1) maka belum full
Ilustrasi Stack pada kondisi Full

di-increment sebelumnya.
Jika tidak, outputkan Penuh

Fungsi IsEmpty :
Untuk memeriksa apakah data Stack masih kosong?
Dengan cara memeriksa top of stack, jika masih -1 maka berarti data
Stack masih kosong!

Fungsi Pop :
Untuk mengambil data Stack yang terletak paling atas (data yang
ditunjuk oleh TOS).
Tampilkan terlebih dahulu nilai elemen teratas stack dengan mengakses
indeksnya sesuai dengan top of stacknya, baru dilakukan di-decrement
nilai top of stacknya sehingga jumlah elemen stack berkurang.

45

Fungsi Push :
Untuk memasukkan elemen ke data Stack. Data yang diinputkan selalu
menjadi elemen teratas Stack (yang ditunjuk oleh ToS)
Jika data belum penuh,
Tambah satu (increment) nilai top of stack lebih dahulu setiap kali
ada penambahan ke dalam array data Stack.
Isikan data baru ke stack berdasarkan indeks top of stack yang telah
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Fungsi Print :
Untuk menampilkan semua elemen-elemen data Stack
Dengan cara me-loop semua nilai array secara terbalik, karena kita 46
harus mengakses dari indeks array tertinggi terlebih dahulu baru ke
indeks yang lebih kecil!

Baca soal dari depan ke belakang


Jika berupa operand, maka masukkan ke posftix
47
Jika berupa operator, maka:
Jika stack masih kosong, push ke stack
Jika derajat operator soal > derajat operator top of stack
Push operator soal ke stack
Selama derajat operator soal <= derajat operator top of stack
Pop top of stack dan masukkan ke dalam posfix
Setelah semua dilakukan, push operator soal ke stack
Jika sudah semua soal dibaca, pop semua isi stack dan push ke postfix
sesuai dengan urutannya

5. Fungsi Peek
Digunakan untuk melihat top of stack

6. Studi Kasus Stack


Pembuatan Kalkulator SCIENTIFIC
Misalkan operasi: 3 + 2 * 5
Operasi di atas disebut notasi infiks, notasi infiks tersebut harus
diubah lebih dahulu menjadi notas postfix
3 + 2 * 5 notasi postfiksnya adalah 3 2 5 * +

Teknik Informatika
Universitas Muhammadiyah Ponorogo

7. Contoh lain
a+b*c-d
Stack (kosong) dan Postfik (kosong)
Scan a
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Postfik: a
Scan +
Stack: +
Scan b
Postfik: ab
Scan *, karena ToS (+) < *, maka add ke Stack
Stack: +*
Scan c
48
Postfik: abc
Scan , karena * > -, maka pop Stack, dan add ke Postfik
Stack: +
Postfik: abc*
Karena + >= -, maka pop Stack, dan add ke Postfik, karena Stack
kosong, maka push ke stack
Stack: Postfik: abc*+
Scan d
Postfik: abc*+d
Karena sudah habis, push ToS stack ke Posfix
Postfix: abc*+d8. Postfix Evaluator
Scan Postfix string dari kiri kekanan.
Siapkan sebuah stack kosong.
Jika soal adalah operand, tambahkan ke stack. Jika operator, maka pasti
akan ada minimal 2 operand pada stack
Pop dua kali stack, pop pertama disimpan dalam y, dan pop kedua
ke dalam x. Lalu evaluasi x <operator> y. Simpan hasilnya dan push
ke dalam stack lagi.
Ulangi hingga seluruh soal discan.
Jika sudah semua, elemen terakhir pada stack adalah hasilnya.
Jika lebih dari satu elemen, berarti error!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

9. Queue Dengan Array


Bersifat FIFO (First In First Out)
49
Elemen yang pertama masuk ke antrian akan keluar pertama kalinya
DEQUEUE adalah mengeluarkan satu elemen dari suatu Antrian
Antrian dapat dibuat dengan menggunakan: Liniear Array dan Circular
Array

10. Queue Linier Array


Terdapat satu buah pintu masuk di suatu ujung dan satu buah pintu
keluar di ujung satunya
Sehingga membutuhkan 2 variabel: Head dan Tail

Teknik Informatika
Universitas Muhammadiyah Ponorogo

adalah batas elemen array pada C) berarti sudah penuh


Operasi-operasi:
Create()
Untuk menciptakan dan menginisialisasi Queue
Dengan cara membuat Head dan Tail = -1

50

Enqueue :
Untuk menambahkan elemen ke dalam Antrian, penambahan elemen51
selalu ditambahkan di elemen paling belakang
Penambahan elemen selalu menggerakan variabel Tail dengan cara
increment counter Tail terlebih dahulu

IsEmpty()
Untuk memeriksa apakah Antrian sudah penuh atau belum
Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty
Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala
antrian (elemen pertama dalam antrian) yang tidak akan berubahubah
Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian
kebelakang, yaitu menggunakan nilai Tail

Dequeue() :
Digunakan untuk menghapus elemen terdepan/pertama (head) dari
Antrian
Dengan cara menggeser semua elemen antrian kedepan dan mengurangi
Tail dgn 1
Penggeseran dilakukan dengan menggunakan looping
Fungis IsFull :
Untuk mengecek apakah Antrian sudah penuh atau belum
Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

11. Soal
Tambahkanlah function untuk mencari suatu elemen dalam queue &
stack
Tambahkan function untuk mengedit suatu elemen dalam queue & stack
Carilah nilai total, rata-rata, terbesar dan terkecil dari elemen-elemen
queue dalam function tersendiri
Clear() :
Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail
dan Head = -1
52
Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus
arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1
sehingga elemen-elemen Antrian tidak lagi terbaca

Tampil()
Untuk menampilkan nilai-nilai elemen Antrian
Menggunakan looping dari head s/d tail

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

POINTER DAN FUNCTION

Format %p dignkn utk menampilkan alamat pointer!


4. Pointer vs Variabel Biasa

1. Pointer
53
Pointer adalah suatu variabel penunjuk, berisi nilai yang menunjuk
alamat suatu lokasi memori tertentu.
Jadi pointer tidak berisi nilai data, melainkan berisi suatu alamat
memori atau null jika tidak berisi data.
Pointer yang tidak diinisialisasi disebut dangling pointer
Lokasi memori tersebut bisa diwakili sebuah variabel atau dapat juga
berupa nilai alamat memori secara langsung.

54

2. Ilustrasi Pointer

Kita memiliki variabel X yang berisi nilai karakter a


Oleh kompiler C, nilai a ini akan disimpan di suatu alamat tertentu di
memori.
Alamat variabel X dapat diakses dengan menggunakan statemen &X.
Jika kita ingin menyimpan alamat dari variabel X ini, kita dapat
menggunakan suatu variabel
misalnya char alamat_x = &X;
alamat_x adalah suatu variabel yang berisi alamat dimana nilai X, yaitu
a disimpan.
Variabel alamat_x disebut variabel pointer atau sering disebut pointer
saja.

5. Operator Pointer

Pointer dideklarasikan dengan cara:


tipe_data *nama_variabel_pointer;
Contoh inisialisasi pointer, contoh:

3. Contoh Program

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Contoh 3: Mengoperasikan isi variabel dengan menyebut alamatnya


dengan pointer
Contoh 4: Mengisi dan mengganti variabel yang ditunjuk oleh
pointer
56
Assigment, sebuah alamat dapat ditunjuk oleh lebih dari satu pointer

6. Aturan
variabel pointer dapat dideklarasikan dengan tipe data apapun.
Pendeklarasian variabel pointer dengan tipe data tertentu digunakan 55
untuk menyimpan alamat memori yang berisi data sesuai dengan tipe
data yang dideklarasikan, bukan untuk berisi nilai bertipe data tertentu.
Tipe data digunakan sebagai lebar data untuk alokasi memori (misal
char berarti lebar datanya 1 byte, dst)
jika suatu variabel pointer dideklarasikan bertipe float, berarti
variabel pointer tersebut hanya bisa digunakan untuk menunjuk
alamat memori yang berisi nilai bertipe float juga.
7. Contoh yang salah

Mengisi variabel dengan nilai yang ditunjuk oleh sebuah variabel


pointer

8. Operasi pada Pointer


Operasi assignment
Antar variabel pointer dapat dilakukan operasi assignment.
Contoh 1: Assignment dan sebuah alamat dapat ditunjuk oleh lebih
dari satu pointer
Contoh 2: Mengisi variabel dengan nilai yang ditunjuk oleh sebuah
variabel pointer
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Mengoperasikan isi variabel dengan menyebut alamatnya dengan


pointer
57

Operasi aritmatika :
Pada pointer dapat dilakukan operasi aritmatika yang akan menunjuk58
suatu alamat memori baru.
Hanya nilai integer saja yang bisa dioperasikan pada variabel pointer.
Biasanya hanya operasi penambahan/pengurangan saja.
Misal pointer X bertipe int (2 bytes), maka X+1 akan menunjuk pada
alamat memori sekarang (mis. 1000) ditambah sizeof(X), yaitu 2, jadi
1002.
Lihat contoh

Mengisi dan mengganti variabel yang ditunjuk oleh pointer

9. Pointer pada Array


Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Pada array, pointer hanya perlu menunjuk pada alamat elemen pertama
saja karena letak alamat array sudah berurutan pada memori.
Variabel pointer hanya perlu increment
Lihat contoh-contoh!
59

10. Review: Function


Fungsi/function adalah bagian dari program yang memiliki nama tertentu60
yang unik, digunakan untuk mengerjakan suatu pekerjaan tertentu, serta
letaknya dipisahkan dari bagian program yang menggunakan/memanggil
fungsi tersebut.
11. Review: Keuntungan Function
Dapat melakukan pendekatan top-down dan divide-and-conquer:
program besar dapat dipisah menjadi program-program kecil.
Dapat dikerjakan oleh beberapa orang sehingga koordinasi mudah.
Kemudahan dalam mencari kesalahan-kesalahan karena alur logika jelas
dan kesalahan dapat dilokalisasi dalam suatu modul tertentu saja.
Modifikasi program dapat dilakukan pada suatu modul tertentu saja
tanpa mengganggu program keseluruhan.
Mempermudah dokumentasi.
Reusability: Suatu fungsi dapat digunakan kembali oleh program atau
fungsi lain
12. Review: Kategori Function pada C
Standard Library Function :
Yaitu fungsi-fungsi yang telah disediakan oleh C dalam file-file header
atau librarynya.
Misalnya: clrscr(), printf(), getch()
Untuk function ini kita harus mendeklarasikan terlebih dahulu library
yang akan digunakan, yaitu dengan menggunakan preprosesor direktif:
#include <conio.h>
Programmer-Defined Function :
Adalah function yang dibuat oleh programmer sendiri. Function ini
memiliki nama tertentu yang unik dalam program, letaknya terpisah dari
program utama, dan bisa dijadikan satu ke dalam suatu library buatan
programmer itu sendiri yang kemudian juga di-include-kan untuk
penggunaanya.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Pada saat program C dijalankan, maka compiler C akan mencari


function main() dan melaksanakan instruksi-instruksi yang ada di sana.
Di dalam function main, sering dideklarasikan dalam 2 bentuk:
int main()
void main()
13. Review: Jenis function
Function yang Void :
Fungsi yang void sering disebut juga prosedur
Disebut void karena fungsi tersebut tidak mengembalikan suatu nilai
61
keluaran yang didapat dari hasil proses fungsi tersebut.
Ciri: tidak adanya keyword return.
Ciri: tidak adanya tipe data di dalam deklarasi fungsi.
Ciri: menggunakan keyword void.
Tidak dapat langsung ditampilkan hasilnya
Tidak memiliki nilai kembalian fungsi
Contoh: clrscr(), printf()
Contoh program?
Fungsi yang Non-Void :
Fungsi non-void disebut juga function
Disebut non-void karena mengembalikan nilai kembalian yang berasal
dari keluaran hasil proses function tersebut
Ciri: ada keyword return
Ciri: ada tipe data yang mengawali deklarasi fungsi
Ciri: tidak ada keyword void
Memiliki nilai kembalian
Dapat dianalogikan sebagai suatu variabel yang memiliki tipe data
tertentu sehingga dapat langsung ditampilkan hasilnya.
Contoh: sin(), getch()
Contoh program?
14. Review: The main function
Sebuah program yang paling sederhana dalam C, AGAR DAPAT
DIEKSEKUSI harus terdiri dari minimal 1 buah fungsi, yaitu function
main()
Teknik Informatika
Universitas Muhammadiyah Ponorogo

15. Review: int dan void main()


int main() berarti di dalam function main tersebut harus terdapat62
keyword return di bagian akhir fungsi dan mengembalikan nilai bertipe
data int,
Mengapa hasil return harus bertipe int juga? karena tipe data yang
mendahului fungsi main() diatas dideklarasikan int
Jika sebuah program C dieksekusi, maka akan dikembalikan status
eksekusi program,
jika terminated successfully maka, akan
dikembalikan status 0, sedangkan jika terminated unsuccessfully akan
dikembalikan nilai status tidak 0
void main() berarti function yang void dan tidak mengembalikan nilai
status program sehingga nilai status program tidak bisa diketahui
16. Review: Argumen pada Function
Sebuah fungsi bisa memiliki argumen-argumen yang bersifat opsional.
Argumen-argumen tersebut berfungsi sebagai parameter inputan yang
berupa variabel-variabel bagi fungsi tersebut (bersifat lokal).
Argumen harus bertipe data tertentu.
Terdapat 2 jenis parameter:
Parameter formal: parameter yang ditulis pada deklarasi fungsi.
Parameter aktual: parameter yang diinputkan dalam program pemanggil
fungsi tersebut. Dapat berupa variabel atau langsung berupa nilai
tertentu sesuai dengan tipe data yang dideklarasikan untuk masingmasing parameter fungsi.
Contoh argumen function :

Teknik Informatika
Universitas Muhammadiyah Ponorogo

17. Review: Ruang Lingkup Variabel


Variabel Global: dikenal disemua bagian
Variabel Lokal: dikenal hanya di bagian tertentu saja
63
Variabel Static: nilainya tetap dan nilai terakhir akan tetap disimpan.
Ruang lingkup di atas tergantung cara pandangnya (ruang
lingkupnya)
18. Review: Pengiriman by value
Yang dikirimkan ke fungsi adalah nilainya, bukan alamat memori letak
dari datanya
Fungsi yang menerima kiriman nilai ini akan menyimpan nilainya di
alamat terpisah dari nilai asli yang digunakan oleh program yang
memanggil fungsi tersebut
Karena itulah pengubahan nilai di dalam fungsi tidak akan berpengaruh
pada nilai asli di program yang memanggil fungsi walaupun keduanya
menggunakan nama variabel yang sama
Sifat pengiriman satu arah, dari program pemanggil ke fungsi yang
dipanggil saja.
Parameter bisa berupa ungkapan (statemen)
Lihat Contoh!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Hasil dan kondisi memory :


64

19. Pengiriman by reference


Yang dikirimkan adalah alamat memori letak dari nilai datanya, bukan
nilai datanya
Fungsi yang menerima parameter ini akan menggunakan/mengakses
data dengan alamat yang sama dengan alamat nilai datanya
Karena itulah pengubahan nilai di fungsi akan mengubah juga nilai asli
di program pemanggil fungsi tersebut
Pengiriman parameter by reference adalah pengiriman dua arah, yaitu
dari program pemanggil ke fungsi dan sebaliknya dari fungsi ke
program pemanggilnya
Pengiriman parameter by reference tidak dapat digunakan untuk suatu
ungkapan (statemen), hanya bisa untuk variabel, konstanta atau elemen
array saja
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Lihat Contoh!
65

20. Parameter berupa array


Pengiriman parameter berupa array sebenarnya adalah pengiriman by66
reference, yang dikirimkan adalah alamat elemen pertama dari array,
bukan seluruh nilai-nilai arraynya.
Pada parameter formal, alamat elemen pertama dari array dapat ditulis
berupa nama array saja tanpa ditulis indeksnya (kosong)
Pada parameter aktual, penulisan dilakukan dengan menuliskan nama
arraynya saja
Contoh :

Hasil dan kondisi memori :

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

21. Soal-soal
Buatlah function untuk menghitung faktorial!
Buatlah function untuk menghitung pangkat (XY)!
Buatlah function untuk mengetahui apakah suatu bilangan adalah
bilangan prima atau bukan, kemudian buatlah function untuk
menampilkan semua bilangan prima dari suatu range data tertentu dan
gunakanlah function pemeriksa bilangan prima yang sudah dibuat
sebelumnya!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

SINGLE LINKED LIST NON CIRCULAR


1. History of Linked List
67
Dikembangkan tahun 1955-1956 oleh Allen Newell, Cliff Shaw dan
Herbert Simon di RAND Corporation sebagai struktur data utama untuk
bahasa Information Processing Language (IPL).
IPL dibuat untuk mengembangkan program artificial intelligence,
seperti pembuatan Chess Solver.
Victor Yngve di Massachusetts Institute of Technology (MIT) juga
menggunakan linked list pada natural language processing dan machine
transitions pada bahasa pemrograman COMMIT.
2. 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.
3. Array VS Linked List

4. Bentuk Node Single Linked List non Circular


Single : artinya field pointer-nya hanya satu buah saja dan satu arah
serta pada akhir node, pointernya menunjuk NULL
Linked List : artinya node-node tersebut saling terhubung satu sama
lain.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Setiap node pada linked list mempunyai field yang berisi pointer ke
node berikutnya, dan juga memiliki field yang berisi data.
Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai68
kondisi berhenti pada saat pembacaan isi linked list.
5. Pembuatan Single Linked List non Circular
Deklarasi Node
typedef struct TNode{
int data;
TNode *next;
};
Penjelasan:
Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data
bertipe integer dan field next yang bertipe pointer dari TNode
Setelah pembuatan struct, buat variabel head yang bertipe pointer dari
TNode yang berguna sebagai kepala linked list.
Digunakan keyword new yang berarti mempersiapkan sebuah node baru
berserta alokasi memorinya, kemudian node tersebut diisi data dan
pointer nextnya ditunjuk ke NULL.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
6. Cara lain alokasi pointer
Menggunakan alokasi memori secara manual
Menggunakan header stdlib.h atau malloc.h
Menggunakan fungsi:
<pointer type> *malloc(int size);

Teknik Informatika
Universitas Muhammadiyah Ponorogo

TNode *head;

69

Fungsi Inisialisasi Single LinkedList


void init(){
head = NULL;
}
Function untuk mengetahui kosong tidaknya Single LinkedList
Jika pointer head tidak menunjuk pada suatu node maka kosong
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}

70

8. SLLNC dengan HEAD


Penambahan data di depan :
Penambahan node baru akan dikaitan di node paling depan, namun pada
saat pertama kali (data masih kosong), maka penambahan data
dilakukan dengan cara: node head ditunjukkan ke node baru tersebut.
Pada prinsipnya adalah mengkaitkan node baru dengan head, kemudian
head akan menunjuk pada data baru tersebut sehingga head akan tetap
selalu menjadi data terdepan.

7. SLLNC Menggunakan Head


Dibutuhkan satu buah variabel pointer: head
Head akan selalu menunjuk pada node pertama

Deklarasi Pointer Penunjuk Kepala Single Linked List


Manipulasi linked list tidak bisa dilakukan langsung ke node yang
dituju, melainkan harus menggunakan suatu pointer penunjuk ke node
pertama dalam linked list (dalam hal ini adalah head). Deklarasinya
sebagai berikut:

Teknik Informatika
Universitas Muhammadiyah Ponorogo

void insertDepan(int databaru){


TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
}
else {
baru->next = head;
head = baru;
}
printf(Data masuk\n);

Teknik Informatika
Universitas Muhammadiyah Ponorogo

bantu->next = baru;
}
printf("Data masuk\n);
}
71

72

Penambahan data di belakang :


Penambahan data dilakukan di belakang, namun pada saat pertama kali,
node langsung ditunjuk oleh head.
Penambahan di belakang lebih sulit karena kita membutuhkan pointer
bantu untuk mengetahui node terbelakang, kemudian setelah itu,
dikaitkan dengan node baru. Untuk mengetahui data terbelakang perlu
digunakan perulangan.
void insertBelakang (int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
}
else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

73

Function di atas digunakan untuk menampilkan semua isi list, di mana


linked list ditelusuri satu-persatu dari awal node sampai akhir node.
Penelusuran ini dilakukan dengan menggunakan suatu pointer bantu,
karena pada prinsipnya pointer head yang menjadi tanda awal list tidak
boleh berubah/berganti posisi.
Penelusuran dilakukan terus sampai node terakhir ditemukan menunjuk
ke nilai NULL. Jika tidak NULL, maka node bantu akan berpindah ke
node selanjutnya dan membaca isi datanya dengan menggunakan field
next sehingga dapat saling berkait.
Jika head masih NULL berarti data masih kosong!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Function di atas akan menghapus data teratas (pertama) yang ditunjuk


oleh head pada linked list
74
Penghapusan node tidak boleh dilakukan jika keadaan node sedang
ditunjuk oleh pointer, maka harus dilakukan penggunakan suatu pointer
lain yang digunakan untuk menunjuk node yang akan dihapus, misalnya
pointer hapus dan barulah kemudian menghapus pointer hapus dengan
menggunakan perintah delete.
Sebelum data terdepan dihapus, head harus ditunjukkan ke node
sesudahnya terlebih dahulu agar list tidak putus, sehingga node setelah
head lama akan menjadi head baru (data terdepan yang baru).
Jika head masih NULL maka berarti data masih kosong!
Hapus Belakang
void hapusBelakang(){
TNode *hapus,*bantu;
int d;
if (isEmpty()==0){
if(head->next != NULL){
bantu = head;
while(bantu->next->next!=NULL){
bantu = bantu->next;
}
hapus = bantu->next;
d = hapus->data;
bantu->next = NULL;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(%d terhapus\n,d);
} else printf(Masih kosong\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Membutuhkan pointer bantu dan hapus.


Pointer hapus digunakan untuk menunjuk node yang akan dihapus, dan
pointer bantu digunakan untuk menunjuk node sebelum node yang
dihapus yang kemudian selanjutnya akan menjadi node terakhir.
Pointer bantu akan digunakan untuk menunjuk ke nilai NULL.
Pointer bantu akan selalu bergerak sampai sebelum node yang akan
dihapus, baru kemudian pointer hapus diletakkan setelah pointer bantu.
Setelah itu pointer hapus akan dihapus, pointe bantu akan menunjuk ke
75
NULL.

Function untuk menghapus semua elemen Linked List


void clear()
{
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL)
{
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;

Teknik Informatika
Universitas Muhammadiyah Ponorogo

}
9. SLLNC dengan HEAD & TAIL
Dibutuhkan dua buah variabel pointer: head dan tail
Head akan selalu menunjuk pada node pertama, sedangkan tail akan
selalu menunjuk pada node terakhir
76
Inisialisasi LinkedList
TNode *head, *tail;
Fungsi Inisialisasi LinkedList
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya LinkedList
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
Pengkaitan node baru ke linked list di depan
Penambahan data baru di depan akan selalu menjadi head.
void insertDepan(int databaru)
{
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1)
{
head=tail=baru;
tail->next=NULL;
}
else
Teknik Informatika
Universitas Muhammadiyah Ponorogo

{
baru->next = head;
head = baru;
}
printf(Data masuk\n);

else {
tail->next = baru;
tail=baru;
}
printf("Data masuk\n);

77

Penambahan Data di belakang


void tambahBelakang(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=baru;
tail=baru;
tail->next = NULL;
}
Teknik Informatika
Universitas Muhammadiyah Ponorogo

78

Kelebihan dari Single Linked List dengan Head & Tail adalah pada
penambahan data di belakang, hanya dibutuhkan tail yang mengikat
node baru saja tanpa harus menggunakan perulangan pointer bantu.
Function untuk menampilkan isi linked list:
void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
while(bantu!=NULL){
printf(%d\n,bantu->data);
bantu=bantu->next;
}
printf(\n);
} else printf(Masih kosong\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Function untuk menghapus data di depan


void hapusDepan()
{
TNode *hapus;
int d;
if (isEmpty()==0){
if(head!=tail){
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;
} else {
d = tail->data;
head=tail=NULL;
}
printf(%d terhapus\n,d);
} else printf("Masih kosong\n);
}
Function di atas akan menghapus data terdepan (pertama) yang ditunjuk
oleh head pada linked list
Penghapusan node tidak boleh dilakukan jika keadaan node sedang
ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih
dahulu dengan pointer hapus pada head, kemudian dilakukan pergeseran
head ke node berikutnya sehingga data setelah head menjadi head baru,
kemudian menghapus pointer hapus dengan menggunakan perintah
delete.
Jika tail masih NULL maka berarti list masih kosong!
Function untuk menghapus data di belakang:

Teknik Informatika
Universitas Muhammadiyah Ponorogo

79

void hapusBelakang(){
TNode *bantu,*hapus;
int d;
if (isEmpty()==0){
bantu = head;
if(head!=tail){
while(bantu->next!=tail){
bantu = bantu->next;
}
hapus = tail;
tail=bantu;
d = hapus->data;
delete hapus;
tail->next = NULL;
}else {
d = tail->data;
head=tail=NULL;
}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
}

80

Function di atas akan menghapus data terbelakang (terakhir) yang


ditunjuk oleh tail pada linked list
Penghapusan node tidak boleh dilakukan jika keadaan node sedang
ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih
dahulu dengan variabel hapus pada tail, kemudian dibutuhkan pointer
Teknik Informatika
Universitas Muhammadiyah Ponorogo

bantu untuk membantu pergeseran dari head ke node berikutnya sampai


sebelum tail, sehingga tail dapat ditunjukkan ke bantu tersebut, dan
bantu tersebut akan menjadi tail yang baru. Setelah itu hapus pointer
hapus dengan menggunakan perintah delete.
Jika tail masih NULL maka berarti list masih kosong!

Function untuk menghapus semua elemen LinkedList


void clear(){
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
10. SOAL LATIHAN
Buatlah program lengkap dari semua algoritma dan function di atas
dalam bentuk menu untuk menambah data, melihat data, dan
menghapus data!
Buatlah function tambahan yang berguna untuk mencari data yang ada
dalam linked list baik secara ber-Head maupun ber-Head dan Tail!
Buatlah function untuk menghapus data tertentu dalam linked list!
Buatlah penyisipan node setelah atau sebelum data tertentu.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

81

SINGLE LINKED LIST CIRCULAR


1. Single Linked List Circular
SLLC adalah Single Linked List yang pointer nextnya menunjuk pada
dirinya sendiri. Jika Single Linked List tersebut terdiri dari beberapa
node, maka pointer next pada node terakhir akan menunjuk ke node
terdepannya.
Pengertian:
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Linked List : artinya node-node tersebut saling terhubung satu sama
lain.
Circular : artinya pointer next-nya akan menunjuk pada dirinya
sendiri sehingga berputar

2. Ilustrasi SLLC

Setiap node pada linked list mempunyai field yang berisi pointer ke
node berikutnya, dan juga memiliki field yang berisi data.
Pada akhir linked list, node terakhir akan menunjuk ke node terdepan
sehingga linked list tersebut berputar.
3. Deklarasi dan node baru SLLC
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
};
Pembentukan node baru
Digunakan keyword new yang berarti mempersiapkan sebuah node baru

Teknik Informatika
Universitas Muhammadiyah Ponorogo

82

berserta alokasi memorinya.


TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
4. SLLC dengan HEAD
Dibutuhkan satu buah variabel pointer: head
Head akan selalu menunjuk pada node pertama

Deklarasi Pointer Penunjuk Kepala Single Linked List


Manipulasi linked list tidak bisa dilakukan langsung ke node yang
dituju, melainkan harus melalui node pertama dalam linked list.
Deklarasinya sebagai berikut:
TNode *head;
Fungsi Inisialisasi Single LinkedList Circular
void init(){
head = NULL;
}
Function untuk mengetahui kosong tidaknya SLLC
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}
Penambahan data di depan
Penambahan node baru akan dikaitan di node paling depan, namun
pada saat pertama kali (data masih kosong), maka penambahan data
dilakukan pada head nya.
Pada prinsipnya adalah mengkaitkan data baru dengan head,
kemudian head akan menunjuk pada data baru tersebut sehingga
head akan tetap selalu menjadi data terdepan.
Untuk
menghubungkan node terakhir dengan node terdepan dibutuhkan
pointer bantu.
Teknik Informatika
Universitas Muhammadiyah Ponorogo

83

SLLC menggunakan Head


void insertDepan(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
baru->next = head;
head = baru;
bantu->next = head;
}
printf("Data masuk\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

84

Penambahan data di belakang


Penambahan data dilakukan di belakang, namun pada saat pertama kali85
data langsung ditunjuk pada head-nya.
Penambahan di belakang lebih sulit karena kita membutuhkan pointer
bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan
data baru. Untuk mengetahui data terbelakang perlu digunakan
perulangan.
void insertBelakang (int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next != head){
bantu=bantu->next;
}
bantu->next = baru;
baru->next = head;
}
printf("Data masuk\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

86

Function untuk menampilkan isi single linked list


void tampil(){
TNode *b;
b = head;
if(isEmpty()==0){
do{
printf(%d ,b->data);
b=b->next;
}while(b!=head);
printf(\n);
} else printf("Masih kosong\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

void hapusDepan (){


TNode *hapus,*bantu;
if (isEmpty()==0){
int d;
hapus = head;
d = head->data;
if(head->next != head){
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
head = head->next;
delete hapus;
bantu->next = head;
}else{
head=NULL;
}
printf(%d terhapus\n,d);
} else printf("Masih kosong\n);
}
void hapusBelakang(){
TNode *hapus,*bantu;
if (isEmpty()==0){
int d;
hapus = head;
if(head->next == head){
head = NULL;
}else{
bantu = head;
while(bantu->next->next != head){
bantu = bantu->next;
}
hapus = bantu->next;
d = bantu->data;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

87

bantu->next = head;
delete hapus;
}
printf(%d terhapus\n,d);
} else printf("Masih kosong\n);
}

Function untuk menghapus semua elemen Linked List


void clear(){
TNode *bantu,*hapus;
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}
5. SLLC dengan HEAD dan TAIL
Dibutuhkan dua buah variabel pointer: head dan tail
Head akan selalu menunjuk pada node pertama, sedangkan tail akan
selalu menunjuk pada node terakhir.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

88

Inisialisasi SLLC
TNode *head, *tail;
Fungsi Inisialisasi SLLC
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya SLLC
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
Pengkaitan node baru ke linked list di depan
Penambahan data baru di depan akan selalu menjadi head.
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else {
baru->next = head;
head = baru;
tail->next = head;
}
printf("Data masuk\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

89

void tambah Belakang(int databaru){


TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else {
tail->next = baru;
tail = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

90

Function untuk menampilkan isi linked list:


void tampil(){
TNode *b;
b = head;
if(isEmpty()==0){
do{
printf(%d,b->data);
b=b->next;
}while(b!=tail->next);
printf(\n);
} else printf("Masih kosong\n);
}
Function untuk menghapus data di depan
void hapusDepan(){
TNode *hapus;
if (isEmpty()==0){
int d;
hapus = head;
d = head->data;
if(head != tail){
hapus = head;
head = head->next;
tail->next = head;
delete hapus;
}else{
head=NULL;
tail=NULL;
}
printf(%d terhapus\n,d);
} else printf("Masih kosong\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

91

Function di atas akan menghapus data terdepan (pertama) yang ditunjuk


oleh head pada linked list
92
Penghapusan node tidak boleh dilakukan jika keadaan node sedang
ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih
dahulu dengan variabel hapus pada head, kemudian dilakukan
pergeseran head ke node berikutnya sehingga data setelah head menjadi
head baru, kemudian menghapus variabel hapus dengan menggunakan
perintah delete.
Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus data di belakang:
void hapusBelakang(){
TNode *hapus,*bantu;
if (isEmpty()==0){
int d;
if(head == tail){
d = tail->data;
head = NULL;
tail = NULL;
}else{
bantu = head;
while(bantu->next != tail){
bantu = bantu->next;
}
hapus = tail;
tail = bantu;
d = hapus->data;
tail->next = head;
delete hapus;
}
printf(%d terhapus\n,d);
} else printf("Masih kosong\n);
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

93

Function di atas akan menghapus data terbelakang (terakhir) yang


ditunjuk oleh tail pada linked list
Penghapusan node tidak boleh dilakukan jika keadaan node sedang
ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih
dahulu dengan variabel hapus pada tail, kemudian dibutuhkan pointer
bantu untuk membantu pergeseran dari head ke node berikutnya sampai
sebelum tail, sehingga tail dapat ditunjukkan ke bantu tersebut, dan
bantu tersebut akan menjadi tail yang baru. Setelah itu hapus variabel
hapus dengan menggunakan perintah delete.
Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus semua elemen LinkedList
void clear(){
TNode *bantu,*hapus;
if(isEmpty() == 0){
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
}
Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang
list, dan menggunakan pointer hapus yang digunakan untuk menunjuk
Teknik Informatika
Universitas Muhammadiyah Ponorogo

node-node yang akan dihapus.


Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer
bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus
akan didelete.
6. SOAL-SOAL
Buatlah program lengkap dari semua algoritma dan function di atas
dalam bentuk menu untuk menambah data, melihat data, dan
menghapus data!
Buatlah function tambahan yang berguna untuk mencari data yang ada
dalam linked list baik secara ber-Head maupun ber-Head dan Tail!
Buatlah function untuk menghapus data tertentu dalam linked list!
Buatlah penyisipan node setelah atau sebelum data tertentu.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

94

DOUBLE LINKED LIST NON CIRCULAR


1. Double Linked List Non Circular
95
DLLNC adalah Double Linked List yang memiliki 2 buah pointer yaitu
pointer next dan prev. Pointer next menunjuk pada node setelahnya dan
pointer prev menunjuk pada node sebelumnya.
Pengertian:
Double : artinya field pointer-nya dua buah dan dua arah, ke node
sebelum dan sesudahnya.
Linked List : artinya node-node tersebut saling terhubung satu sama
lain.
Non Circular : artinya pointer prev dan next-nya akan menunjuk
pada NULL.

2. Ilustrasi DLLNC

Setiap node pada linked list mempunyai field yang berisi data dan
pointer ke node berikutnya & ke node sebelumnya
Untuk pembentukan node baru, mulanya pointer next dan prev akan
menunjuk ke nilai NULL.
Selanjutnya pointer prev akan menunjuk ke node sebelumnya, dan
pointer next akan menunjuk ke node selanjutnya pada list.
3. Deklarasi dan node baru DLLNC
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
Tnode *prev;
};
Pembentukan node baru

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Digunakan keyword new yang berarti mempersiapkan sebuah node baru


berserta alokasi memorinya.
TNode *baru;
96
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
4. DLLNC dengan HEAD
Dibutuhkan satu buah variabel pointer: head
Head akan selalu menunjuk pada node pertama

Deklarasi Pointer Penunjuk Kepala Double Linked List


Manipulasi linked list tidak bisa dilakukan langsung ke node yang
dituju, melainkan harus melalui node pertama dalam linked list.
Deklarasinya sebagai berikut:
TNode *head;
Fungsi Inisialisasi Single LinkedList Circular
void init(){
head = NULL;
}
Function untuk mengetahui kosong tidaknya DLLNC
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}
Penambahan data di depan
Penambahan node baru akan dikaitan di node paling depan, namun pada
saat pertama kali (data masih kosong), maka penambahan data
dilakukan pada head nya.
Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian
head akan menunjuk pada data baru tersebut sehingga head akan tetap
selalu menjadi data terdepan. Untuk menghubungkan node terakhir
Teknik Informatika
Universitas Muhammadiyah Ponorogo

dengan node terdepan dibutuhkan pointer bantu.


void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
head->prev = NULL;
}
else {
baru->next = head;
head->prev = baru;
head = baru;
}
printf(Data masuk\n);
}
Penambahan data di belakang
Penambahan data dilakukan di belakang, namun pada saat pertama kali
data langsung ditunjuk pada head-nya.
Penambahan di belakang lebih sulit karena kita membutuhkan pointer
bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan
data baru. Untuk mengetahui data terbelakang perlu digunakan
perulangan.
void insertBelakang (int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
head->prev = NULL;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

}
else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next = baru;
baru->prev = bantu;
}
printf("Data masuk\n);

97

Function untuk menampilkan isi DLLNC


void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
while(bantu!=NULL){
printf(%d ,bantu->data);
bantu=bantu->next;
}
printf(\n);
} else printf("Masih kosong\n);
Teknik Informatika
Universitas Muhammadiyah Ponorogo

98

head = NULL;

99
void hapusDepan (){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = head;
d = hapus->data;
head = head->next;
head->prev = NULL;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(%d terhapus\n,d);
} else printf(Masih kosong\n);
}
Function untuk menghapus node terbelakang
void hapusBelakang(){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = head;
while(hapus->next!=NULL){
hapus = hapus->next;
}
d = hapus->data;
hapus->prev->next = NULL;
delete hapus;
} else {
d = head->data;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
}

100

Tidak diperlukan pointer bantu yang mengikuti pointer hapus yang


berguna untuk menunjuk ke NULL
Karena pointer hapus sudah bisa menunjuk ke pointer sebelumnya
dengan menggunakan elemen prev ke node sebelumnya, yang akan diset
agar menunjuk ke NULL setelah penghapusan dilakukan.

Function untuk menghapus semua elemen


void clear(){
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}
5. DLLNC dengan HEAD dan TAIL
Dibutuhkan dua buah variabel pointer: head dan tail
Head akan selalu menunjuk pada node pertama, sedangkan tail akan
selalu menunjuk pada node terakhir.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Inisialisasi DLLNC
TNode *head, *tail;
Fungsi Inisialisasi DLLNC
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya DLLNC
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
Tambah Depan
void insertDepan (int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
tail=head;
head->next = NULL;
head->prev = NULL;
tail->prev = NULL;
tail->next = NULL;
}
else {
baru->next = head;
head->prev = baru;
head = baru;
}
cout<<"Data masuk\n";
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

101

Penambahan node di belakang


Penambahan node di belakang akan selalu dikaitkan dengan tail dan
102
kemudian node baru tersebut akan menjadi tail
void insertBelakang(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
tail=head;
head->next = NULL;
head->prev = NULL;
tail->prev = NULL;
tail->next = NULL;
}
else {
tail->next = baru;
baru->prev = tail;
tail = baru;
tail->next = NULL;
}
cout<<"Data masuk\n";
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
Function untuk menampilkan isi linked list
void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
while(bantu!=tail->next){
cout<<bantu->data<<" ";
bantu=bantu->next;
}
cout<<endl;
} else cout<<"Masih kosong\n";
}

Function untuk menghapus node terbelakang


void hapusBelakang(){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = tail;
d = tail->data;
tail = tail->prev;
tail->next = NULL;
delete hapus;
} else {
d = head->data;
head = NULL;
tail = NULL;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

103

}
Pointer hapus tidak perlu di loop untuk mencari node terakhir. Pointer
hapus hanya perlu menunjuk pada pointer tail saja.
104
Karena pointer hapus sudah bisa menunjuk ke pointer sebelumnya
dengan menggunakan elemen prev, maka pointer prev hanya perlu diset
agar menunjuk ke NULL. Lalu pointer hapus didelete.

Function untuk menghapus semua elemen LinkedList


void clear(){
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang
list, dan menggunakan pointer hapus yang digunakan untuk menunjuk
node-node yang akan dihapus.
Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer
bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus
akan didelete.
6. SOAL-SOAL
Buatlah program double linked list non circular dengan menggunakan
head, namun head yang ada tidak digunakan untuk menyimpan data,
Teknik Informatika
Universitas Muhammadiyah Ponorogo

melainkan untuk menyimpan jumlah seluruh elemen dalam linked list.


Buatlah fungsi lengkap untuk tambah, hapus, lihat, dan edit!
Buatlah pula function untuk menampilkan data list secara terbalik!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

DOUBLE LINKED LIST CIRCULAR


1. Double Linked List Circular
105
Double Linked List Circular adalah linked list dengan menggunakan
pointer, dimana setiap node memiliki 3 field, yaitu 1 field pointer yang
menunjuk pointer berikutnya (next), 1 field menunjuk pointer
sebelumnya (prev), serta sebuah field yang berisi data untuk node
tersebut.
Double Linked List Circular pointer next dan prev nya menunjuk ke
dirinya sendiri secara circular.
Pengertian:
Double: artinya field pointer-nya terdiri dari dua buah dan dua arah,
yaitu prev dan next
Linked List: artinya node-node tersebut saling terhubung satu sama
lain.
Circular: artinya pointer next dan prev-nya menunjuk ke dirinya
sendiri

2. Ilustrasi DLLC

Setiap node pada linked list mempunyai field yang berisi data dan
pointer ke node berikutnya & ke node sebelumnya
Untuk pembentukan node baru, mulanya pointer next dan prev akan
menunjuk ke dirinya sendiri.
Jika sudah lebih dari satu node, maka pointer prev akan menunjuk ke
node sebelumnya, dan pointer next akan menunjuk ke node sesudahnya.
3. Deklarasi dan node baru DLLC
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;

Teknik Informatika
Universitas Muhammadiyah Ponorogo

TNode *next;
Tnode *prev;
};
106
Pembentukan node baru
Digunakan keyword new yang berarti mempersiapkan sebuah node baru
berserta alokasi memorinya.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
4. DLLC dengan HEAD
Dibutuhkan satu buah variabel pointer: head
Head akan selalu menunjuk pada node pertama

Deklarasi Pointer Penunjuk Kepala DLLC


Manipulasi linked list tidak bisa dilakukan langsung ke node yang
dituju, melainkan harus melalui node pertama dalam linked list.
Deklarasinya sebagai berikut:
TNode *head;
Fungsi Inisialisasi Single LinkedList Circular
void init(){
head = NULL;
}
Function untuk mengetahui kosong tidaknya DLLC
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}
Penambahan data di depan
Penambahan node baru akan dikaitan di node paling depan, namun pada
saat pertama kali (data masih kosong), maka penambahan data
Teknik Informatika
Universitas Muhammadiyah Ponorogo

dilakukan pada head nya.


Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian
head akan menunjuk pada data baru tersebut sehingga head akan tetap
selalu menjadi data terdepan. Untuk menghubungkan node terakhir
dengan node terdepan dibutuhkan pointer bantu.
107
void insertDepan(int databaru){
TNode *baru, *bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
if(isEmpty()==1){
head=baru;
head->next = head;
head->prev = head;
}
else {
bantu = head->prev;
baru->next = head;
head->prev = baru;
head = baru;
head->prev = bantu;
bantu->next = head;
}
cout<<"Data masuk\n";
}

Penambahan data di belakang


Penambahan data dilakukan di belakang, namun pada saat pertama kali
data langsung ditunjuk pada head-nya.
Penambahan di belakang lebih sulit karena kita membutuhkan pointer
bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan
data baru. Untuk mengetahui data terbelakang perlu digunakan
perulangan.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

void insertBelakang (int databaru){


TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
if(isEmpty()==1){
head=baru;
head->next = head;
head->prev = head;
}
else {
bantu=head->prev;
bantu->next = baru;
baru->prev = bantu;
baru->next = head;
head->prev = baru;
}
cout<<"Data masuk\n";
}

Function untuk menampilkan isi linked list


void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
do{
cout<<bantu->data<<" ";
bantu=bantu->next;
}while(bantu!=head);
Teknik Informatika
Universitas Muhammadiyah Ponorogo

108

cout<<endl;
} else cout<<"Masih kosong\n";

d = hapus->data;
bantu->next = head;
delete hapus;

} else {
d = head->data;
head = NULL;
}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";

109
void hapusDepan (){
TNode *hapus,*bantu;
int d;
if (isEmpty()==0){
if(head->next != head){
hapus = head;
d = hapus->data;
bantu = head->prev;
head = head->next;
bantu->next = head;
head->prev = bantu;
delete hapus;
} else {
d = head->data;
head = NULL;
}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
}
Function untuk menghapus node terbelakang
void hapusBelakang(){
TNode *hapus,*bantu;
int d;
if (isEmpty()==0){
if(head->next != head){
bantu = head;
while(bantu->next->next != head){
bantu = bantu->next;
}
hapus = bantu->next;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

110

}
Diperlukan pointer bantu yang mengikuti pointer hapus yang berguna
untuk menunjuk ke node sebelum terakhir.
Kemudian pointer hapus ditunjukkan ke node setelah pointer bantu,
kemudian hapus pointer hapus dengan perintah delete.

Function untuk menghapus semua elemen


void clear(){
TNode *bantu,*hapus;
if (isEmpty()==0){
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;

Teknik Informatika
Universitas Muhammadiyah Ponorogo

tail->next = tail;
tail->prev = tail;

}
}
else {
5. DLLC dengan HEAD dan TAIL
Dibutuhkan dua buah variabel pointer: head dan tail
Head akan selalu menunjuk pada node pertama, sedangkan tail akan 111
selalu menunjuk pada node terakhir.

baru->next = head;
head->prev = baru;
head = baru;
head->prev = tail;
tail->next = head;

112

}
cout<<"Data masuk\n";
}
Inisialisasi DLLNC
TNode *head, *tail;
Fungsi Inisialisasi DLLNC
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya DLLNC
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
void insertDepan (int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next = head;
head->prev = head;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Penambahan node di belakang


Penambahan node di belakang akan selalu dikaitkan dengan tail dan
kemudian node baru tersebut akan menjadi tail
void insertBelakang(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next = head;
head->prev = head;
tail->next = tail;
tail->prev = tail;
}
else {
tail->next = baru;
baru->prev = tail;
tail = baru;
tail->next = head;
head->prev = tail;
}
Teknik Informatika
Universitas Muhammadiyah Ponorogo

cout<<"Data masuk\n";

} else cout<<"Masih kosong\n";

Function untuk menampilkan isi linked list


void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
do{
cout<<bantu->data<<" ";
bantu=bantu->next;
}while(bantu!=tail->next);
cout<<endl;
} else cout<<"Masih kosong\n";
}

Function untuk menghapus data di data terdepan


void hapusDepan(){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head != tail){
hapus = head;
d = hapus->data;
head = head->next;
tail->next = head;
head->prev = tail;
delete hapus;
} else {
d = head->data;
head = NULL;
tail = NULL;
}
cout<<d<<" terhapus\n";
Teknik Informatika
Universitas Muhammadiyah Ponorogo

113

Function untuk menghapus node terbelakang


void hapusBelakang(){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head != tail){
hapus = tail;
d = hapus->data;
tail = tail->prev;
tail->next = head;
head->prev = tail;
delete hapus;
} else {
d = head->data;
head = NULL;
tail = NULL;
}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
}

114

Pointer hapus tidak perlu di loop untuk mencari node terakhir. Pointer
hapus hanya perlu menunjuk pada pointer tail saja.
Karena pointer hapus sudah bisa menunjuk ke pointer sebelumnya
dengan menggunakan elemen prev ke node sebelumnya. Kemudian
pointer tail akan berpindah ke node sebelumnya.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Function untuk menghapus semua elemen LinkedList


void clear(){
TNode *bantu,*hapus;
if (isEmpty()==0){
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}
}
Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang
list, dan menggunakan pointer hapus yang digunakan untuk menunjuk
node-node yang akan dihapus.
Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer
bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus
akan didelete.
6. SOAL-SOAL
Buatlah program lengkap dari semua algoritma dan function di atas
dalam bentuk menu untuk menambah data, melihat data, dan
menghapus data!
Buatlah function tambahan yang berguna untuk mencari data yang ada
dalam linked list baik dengan head maupun head & tail!
Buatlah function untuk menghapus data tertentu dalam linked list!
Buatlah function untuk menampilkan data secara terbalik!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

115

RECURSIVE FUNCTION
1. Contoh fungsi yang didefinisikan secara rekursif
f(0) = 3
f(n + 1) = 2f(n) + 3
Maka :
f(0) = 3
f(1) = 2f(0) + 3 = 23 + 3 = 9
f(2) = 2f(1) + 3 = 29 + 3 = 21
f(3) = 2f(2) + 3 = 221 + 3 = 45
f(4) = 2f(3) + 3 = 245 + 3 = 93
2. Fungsi Rekursif
Fungsi yang berisi definisi dirinya sendiri
Fungsi yang memanggil dirinya sendiri
Prosesnya terjadi secara berulang-ulang
Yang perlu diperhatikan adalah stopping role
3. Plus Minus
+Karena program lebih singkat dan ada beberapa kasus yang lebih
mudah menggunakan fungsi yang rekursif
-Memakan memori yang lebih besar, karena setiap kali bagian dirinya
dipanggil, dibutuhkan sejumlah ruang memori tambahan.
-Mengorbankan efisiensi dan kecepatan
-Problem: rekursi seringkali tidak bisa berhenti sehingga memori
akan terpakai habis dan program bisa hang.
-Program menjadi sulit dibaca
Saran: jika memang bisa diselesaikan dengan iteratif, gunakanlah
iteratif!
4. Bentuk Umum Fungsi Rekursif
return_data_type function_name(parameter_list){
...
function_name(...);
...
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

116

5. Problems
Faktorial
117
5! = 5 x 4 x 3 x 2 x 1
4! = 4 x 3 x 2 x 1
Berarti 5! = 5 x 4!
Metode Iteratif
Salah satu cara untuk menghitung adalah dengan menggunakan loop,
yang mengalikan masing-masing bilangan dengan hasil sebelumnya.
Penyelesaian dengan cara ini dinamakan iteratif, yang mana secara
umum dapat didefinisikan sebagai berikut:
n! = (n)(n-1)(n-2) (1)
6. Program Iteratif
#include <stdio.h>
int fact_it (int n)
{
int i,fak;
/******************************************************
* Menghitung sebuah faktorial dengan proses looping *
******************************************************/
temp = 1;
for (i=1; i<=n; i++)
fak = fak * i;
return (fak);
}
void main()
{
int fac;
printf("Masukkan berapa faktorial : ");
scanf("%d",&fac);
printf("Hasil faktorial dari adalah : %d\n", fact_it(fac));
}
7. Faktorial Rekursif
Metode Rekursif
Cara lain untuk menyelesaikan permasalahan di atas adalah dengan cara

Teknik Informatika
Universitas Muhammadiyah Ponorogo

rekursi, dimana n! adalah hasil kali dari n dengan (n-1)!.


Untuk menyelesaikan (n-1)! adalah sama dengan n!, sehingga (n-1)!
adalah n-1 dikalikan dengan (n-2)!, dan (n-2)! adalah n-2 dikalikan
dengan (n-3)! dan seterusnya sampai dengan n = 1, kita menghentikan 118
penghitungan n!
n! = 1
if n=0 anchor
n! = n*(n-1)!
if n>0 inductive step
0!
=1
1!
= 1*(1-1)!
= 1*0!
= 1*1
=1
2!
= 2*(2-1)!
= 2*1!
= 2*1
=2
3!
= 3*(3-1)!
= 3*2!
= 3*2
=6

}
void main()
{
int fac;
printf("Masukkan berapa faktorial : ");
scanf("%d",&fac);
printf("Hasil faktorial dari adalah : %d\n", fact_rec(fac));
}

119

9. Fibonacci
Sepasang kelinci yang baru lahir (jantan dan betina) ditempatkan pada
suatu pembiakan.
Setelah dua bulan pasangn kelinci tersebut
melahirkan sepasang kelinci kembar (jantan dan betina). Setiap
pasangan kelinci yang lahir juga akan melahirkan sepasang kelinci juga
setiap 2 bulan. Berapa pasangan kelinci yang ada pada akhir bulan ke12?

8. Program Rekursif
#include <stdio.h>
int fact_rec(int n)
{
/*********************************************************
*
Menghitung sebuah faktorial secara rekursif
***********************************************************/
if (n < 0)
return 0;
else if (n == 0)
return 1;
else if (n == 1)
return 1;
else
return n * fact_rec(n-1);
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Deret Fibonacci adalah suatu deret matematika yang berasal dari


penjumlahan dua bilangan sebelumnya.
1, 1, 2, 3, 5, 7, 12, 19,
10. Fibo Iteratif
Secara iteratif
int fibonacci(int n){
int f1=1, f2=1, fibo;
if(n==1 || n==2) fibo=1;

Teknik Informatika
Universitas Muhammadiyah Ponorogo

else{

return result[n];
for(int i=2;i<=n;i++){
fibo = f1 + f2;
f1 = f2;
f2 = fibo;
}
}
return fibo;
}
11. Fibo Rekursif
int fibo_r (int n){
if(n==1) return 1;
else if(n==2) return 1;
else return fibo_r(n-1) + fibo_r(n-2);
}
12. Bilangan Fibonacci
Untuk N = 40, FN melakukan lebih dari 300 juta pemanggilan rekursif.
F40 = 102.334.155
Berat!!!
Aturan: Jangan membiarkan ada duplikasi proses yang mengerjakan
input yang sama pada pemanggilan rekursif yang berbeda.
Ide: simpan nilai fibonacci yang sudah dihitung dalam sebuah array
13. Dynamic Programming
Dynamic Programming menyelesaikan sub-permasalahan dengan
menyimpan hasil sebelumnya.
int fibo2 (int n){
if (n <= 1) return n;
int result[10];
result[0] = 1;
result[1] = 1;
for (int ii = 2; ii <= n; ii++) {
result[ii] = result[ii - 2]
+ result[ii - 1];
}
Teknik Informatika
Universitas Muhammadiyah Ponorogo

120

14. Tail Rekursif


Implementasi rekursif yang lebih efficient.
Pendekatan Tail Recursive.
public static long fib4 (int n){
return fiboHelp(0,1,n);
}
static long fiboHelp(long x, long y, int n){
if (n==0) return x;
else if (n==1) return y;
else return fiboHelp(y, x+y, n-1);
}
15. FPB (Faktor Persekutuan Terbesar)
Misal FPB 228 dan 90:
228/90 = 2 sisa 48
90/48 = 1 sisa 42
48/42 = 1 sisa 6
42/6 = 7 sisa 0
FPB adalah hasil terakhir sebelum sisa = 0 adalah 6
Iteratif: FPB, m=228 dan n = 90
do{
r = m % n;
if (r!=0){
m = n;
n = r;
}
} while(r==0);
Tampilkan n
Rekursif:
int FPB(int m,int n){
if(m==0) return n;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

121

else if(m<n) return FPB(n,m);


else return FPB(m%n,n);
}
16. Ilustrasi FPB rekursif
FPB(228,90)
FPB(48,90)
FPB(90,48)
FPB(42,48)
FPB(48,42)
FPB(6,42)
FPB(42,6)
FPB(0,6)

m>n
m<n
m>n
m<n
m>n
m<n
m>n
m=0

17. Legenda Menara Hanoi (oleh Edouard Lucas abad 19)


Seorang biarawan memiliki 3 menara.
Diharuskan memindahkan 64 piringan emas.
Diameter piringan tersebut tersusun dari ukuran kecil ke besar.
Biarawan berusaha memindahkan semua piringan dari menara pertama
ke menara ketiga tetapi harus melalui menara kedua sebagai menara
tampungan.
Kondisi:
Piringan tersebut hanya bisa dipindahkan satu-satu.
Piringan yang besar tidak bisa diletakkan di atas piringan yang lebih
kecil.
Ternyata : mungkin akan memakan waktu sangat lama (sampai dunia
kiamat).
Secara teori, diperlukan 264-1 perpindahan. Jika kita salah
memindahkan, maka jumlah perpindahan akan lebih banyak lagi.
Jika satu perpindahan butuh 1 detik, maka total waktu yang dibutuhkan
lebih dari 500 juta tahun !!.
18. Tower of Hanoi

Teknik Informatika
Universitas Muhammadiyah Ponorogo

122

Algoritma:
Jika n==1, pindahkan pringan dari A ke C
123
Jika tidak:
Pindahkan n-1 piringan dari A ke B menggunakan C sebagai
tampungan
Pindahkan n-1 piringan dari B ke C menggunakan A sebagai
tampungan
Program :
#include <stdio.h>
void towers(int n, char awal, char akhir, char antara)
{
if(n==1)
printf("Pindahkan piringan 1 dari %c ke %c\n", awal,akhir);
else{
towers(n-1, awal, antara, akhir);
printf("Pindahkan piringan %d dari %c ke %c\n", n, awal, akhir);
towers(n-1, antara, akhir, awal);
}
}
void main()
{
int n;
printf("Berapa piringan ? ");scanf("%d", &n);
towers(n, 'A', 'C', 'B');
}
19. Capture Tower of Hanoi

Teknik Informatika
Universitas Muhammadiyah Ponorogo

int power2(int m,int n){


int p=1;
for(int i=1;i<=n;i++)
p*=m;
return p;
}
20. Ilustrasi Tower of Hanoi
124

21. Proses Kerja

22. Pemangkatan
Teknik Informatika
Universitas Muhammadiyah Ponorogo

int power(int m,int n){


if(n==1||n==0) return m;
else return m*power(m,n-1);
}

125

23. Analisis Algoritma


Algoritma adalah urutan langkah yang tepat dan pasti dalam
memecahkan suatu masalah secara logis.
Beberapa masalah dapat diselesaikan dengan algoritma yang bermacammacam asal hasilnya sama.
Setiap bahasa pemrograman memiliki kelebihan dan kekurangan dalam
mengimplementasikan algoritma dan setiap pemrogram dapat
mengimplementasikan suatu algoritma dengan cara yang berbeda-beda
pula.
Namun algoritma dapat dianalisis efisiensi dan kompleksitasnya.
Penilaian algoritma didasarkan pada:
Waktu eksekusi (paling utama)
Penggunaan memori/sumber daya
Kesederhanaan dan kejelasan algoritma
Analisis algoritma tidak mudah dilakukan secara pasti, maka hanya
diambil:
Kondisi rata-rata (average case)
Kondisi terburuk (worst case)
Waktu eksekusi dipengaruhi oleh:
Jenis data input
Jumlah data input
Pemilihan instruksi bahasa pemrograman
Faktor-faktor yang menyulitkan analisis disebabkan oleh:
Implementasi instruksi oleh bahasa pemrograman yang berbeda

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Ketergantungan algoritma terhadap jenis data


Ketidakjelasan algoritma yang diimplementasikan
Langkah-langkah analisis algoritma
Menentukan jenis/sifat data input.
Mengidentifikasi abstract operation dari data input.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

TREE MANIPULATION

4. Tree Example

1. Tree Manipulation
126
Kumpulan node yang saling terhubung satu sama lain dalam suatu
kesatuan yang membentuk layakya struktur sebuah pohon.
Struktur pohon adalah suatu cara merepresentasikan suatu struktur
hirarki (one-to-many) secara grafis yang mirip sebuah pohon, walaupun
pohon tersebut hanya tampak sebagai kumpulan node-node dari atas ke
bawah.
Suatu struktur data yang tidak linier yang menggambarkan hubungan
yang hirarkis (one-to-many) dan tidak linier antara elemen-elemennya.
Tree Statik : isi node-nodenya tetap karena bentuk pohonnya sudah
ditentukan.
Tree Dinamik : isi nodenya berubah-ubah karena proses penambahan
(insert) dan penghapusan (delete)

127

2. Node Root
Node root dalam sebuah tree adalah suatu node yang memiliki hiarki
tertinggi dan dapat juga memiliki node-node anak. Semua node dapat
ditelusuri dari node root tersebut.
Node root adalah node khusus yang tercipta pertama kalinya.
Node-node lain di bawah node root saling terhubung satu sama lain dan
disebut subtree
3. Implementasi Tree
Contoh penggunaan struktur pohon :
Silsilah keluarga
Parse Tree (pada compiler)
Struktur File
Pertandingan

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

5. Representasi Tree

7. Terminologi Tree
128

129

8. Sebuah Tree

6. Latihan

9. Jenis Tree
Binary Tree
Suatu tree dengan syarat bahwa tiap node hanya boleh memiliki
maksimal dua subtree dan kedua subtree tersebut harus terpisah.
Tiap node dalam binary tree hanya boleh memiliki paling banyak

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

dua child.

130

131

10. Node pada binary tree


Jumlah maksimum node pada setiap tingkat adalah 2n
Node pada binary tree maksimum berjumlah 2n-1

11. Implementasi Program


Tree dapat dibuat dengan menggunakan linked list secara rekursif.
Linked list yang digunakan adalah double linked list non circular
Data yang pertama kali masuk akan menjadi node root.
Data yang lebih kecil dari data node root akan masuk dan menempati
node kiri dari node root, sedangkan jika lebih besar dari data node root,
akan masuk dan menempati node di sebelah kanan node root.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

12. Operasi-operasi Tree


Create: membentuk sebuah tree baru yang kosong.
pohon = NULL;
Clear: menghapus semua elemen tree.
pohon = NULL;
Empty: mengetahui apakah tree kosong atau tidak
int isEmpty(Tree *pohon){
if(pohon == NULL) return 1;
else return 0;
}

14. Ilustrasi Insert


132

133

Insert: menambah node ke dalam Tree secara rekursif. Jika data yang
akan dimasukkan lebih besar daripada elemen root, maka akan
diletakkan di node sebelah kanan, sebaliknya jika lebih kecil maka akan
diletakkan di node sebelah kiri. Untuk data pertama akan menjadi
elemen root.
Find: mencari node di dalam Tree secara rekursif sampai node tersebut
ditemukan dengan menggunakan variable bantuan ketemu. Syaratnya
adalah tree tidak boleh kosong.
Traverse: yaitu operasi kunjungan terhadap node-node dalam pohon
dimana masing-masing node akan dikunjungi sekali.
Count: menghitung jumlah node dalam Tree
Height : mengetahui kedalaman sebuah Tree
Find Min dan Find Max : mencari nilai terkecil dan terbesar pada Tree
Child : mengetahui anak dari sebuah node (jika punya)
13. Jenis Transverse
PreOrder: cetak node yang dikunjungi, kunjungi left, kunjungi right
InOrder: kunjungi left, cetak node yang dikunjungi, kunjungi right
PostOrder: kunjungi left, kunjungi right, cetak node yang dikunjungi

Teknik Informatika
Universitas Muhammadiyah Ponorogo

15. Recursive Insert


void tambah(Tree **root,int databaru){
if((*root) == NULL){
Tree *baru;
baru = new Tree;
Teknik Informatika
Universitas Muhammadiyah Ponorogo

baru->data = databaru;
baru->left = NULL;
baru->right = NULL;
(*root) = baru;
(*root)->left = NULL;
(*root)->right = NULL;
}
else if(databaru < (*root)->data)
tambah(&(*root)->left,databaru);
else if(databaru > (*root)->data)
tambah(&(*root)->right,databaru);
else if(databaru == (*root)->data)
printf("Data sudah ada!");

134

135

}
16. Ilustrasi Kunjungan
Kunjungan LevelOrder :
Hasil kunjungan: ABCDEFGHI
Algoritma:
Siapkan antrian yang kosong
Inisialisasi: masukkan root ke dalam antrian
Iterasi: selama Antrian tidak kosong, lakukan:
Kunjungi elemen pada antrian
Masukkan node->kiri dan node->kanan ke dalam antrian asal
node tersebut tidak NULL.
Keluarkan elemen pertama pada antrian
17. Level Order

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

else if(data > root->data) return (cari(root->right,data));


else if(data == root->data) return root;
}
Level Order pseudocode
void LevelOrder(Tree *root)
{
Queue queue;
Enqueue(queue,root);
while(isEmpty(queue) != 1)
{
Tree n = GetQueue(); //visit
print(n->data);
if(n->left!=NULL)
Enqueue(n->left); //Enqueue if exists
if(n->right!=NULL)
Enqueue(n->right); //Enqueue if exists
Dequeue(queue); //out
}
}

136

Pencarian dilakukan secara rekursif, dimulai dari node root, jika data
yang dicari lebih kecil daripada data node root, maka pencarian
137
dilakukan di sub node sebelah kiri, sedangkan jika data yang dicari lebih
besar daripada data node root, maka pencarian dilakukan di sub node
sebelah kanan, jika data yang dicari sama dengan data suatu node berarti
kembalikan node tersebut dan berarti data ditemukan.

18. Contoh implementasi


Keterangan Searching
Root = 6 dan 8 > 6, maka akan dicari di sub node bagian kanan root.
Root = 10 dan 8 < 10, maka akan dicari di sub node bagian kiri root.
Root = 7 dan 8 > 7, maka akan dicari di sub node bagian kanan root.
Root = 8, berarti 8 = 8, maka akan dikembalikan node tersebut dan
dianggap ketemu!

Tree *cari(Tree *root,int data){


if(root==NULL) return NULL;
else if(data < root->data) return (cari(root->left,data));
Teknik Informatika
Universitas Muhammadiyah Ponorogo

19. Jumlah Node Tree


int count(Tree *root)
{
if (root == NULL) return 0;
return count(root->left) + count(root->right) + 1;
}

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Penghitungan jumlah node dalam tree dilakukan dengan cara


mengunjungi setiap node, dimulai dari root ke subtree kiri, kemudian ke
subtree kanan dan masing-masing node dicatat jumlahnya, dan terakhir
jumlah node yang ada di subtree kiri dijumlahkan dengan jumlah node
yang ada di subtree kanan ditambah 1 yaitu node root.
20. Kedalaman (height) Node Tree
int height(Tree *root)
{
if (root == NULL) return -1;
int u = height(root->left), v = height(root->right);
if (u > v) return u+1;
else return v+1;
}
Penghitungan kedalaman dihitung dari setelah root, yang dimulai dari
subtree bagian kiri kemudian ke subtree bagian kanan. Untuk masingmasing kedalaman kiri dan kanan akan dibandingkan, jika ternyata
subtree kiri lebih dalam, maka yang dipakai adalah jumlah kedalaman
subtree kiri, demikian sebaliknya. Hal ini didasarkan pada prinsip
binary tree, dimana tree-nya selalu memiliki maksimal 2 node anak.
21. Find Min Node
Tree *FindMin(Tree *root)
{
if(root == NULL)
return NULL;
else
if(root->left == NULL)
return root;
else
return FindMin(root->left);
}
Penggunaan:
Tree *t = FindMin(pohon);
22. Mencari Leaf (daun)
void leaf(Tree *root){
Teknik Informatika
Universitas Muhammadiyah Ponorogo

138

if(root == NULL) printf("kosong!");


if(root->left!=NULL) leaf(root->left);
if(root->right!=NULL) leaf(root->right);
if(root->right == NULL && root->left == NULL) printf("%d ",root>data);
}
23. Konversi Tree Biasa ke Binary Tree
139

24. Pembentukan Tree dari Preorder


Baca hasil Preorder dari paling kanan ke kiri untuk mencari node yang
derajatnya lebih dari 0, kemudian ambil node sebanyak derajatnya ke
kanan. Hilangkan node yang terambil tersebut dari hasil Preorder
Lanjutkan langkah 1, dan seterusnya sampai semua hasil traversal habis
Contoh :
Preorder: U V W X Y
Derajat: 2 2 0 0 0
Derajat bukan nol yang ditemukan pertama dari kanan adalah V, ambil 2
node kekanan, W dan X, hilangkan.
Lanjutkan, ketemu U berderajat 2, berarti U punya anak V dan Y
25. Soal-soal
Buatlah fungsi untuk menghapus suatu node pada Tree!
Buatlah program lengkap untuk memanipulasi dan mensimulasikan tree
Teknik Informatika
Universitas Muhammadiyah Ponorogo

dengan berbasis menu!

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

STRUKTUR DATA GRAF


1. GRAPH
Graph adalah kumpulan dari simpul dan busur yang secara matematis
dinyatakan sebagai :
G = (V, E)
Dimana :
G = Graph
V = Simpul atau Vertex, atau Node, atau Titik
E = Busur atau Edge, atau arc
Contoh graph :

Sebuah graph mungkin hanya terdiri dari satu simpul


Sebuah graph belum tentu semua simpulnya
terhubung dengan busur
Sebuah graph mungkin mempunyai simpul yang
tak terhubung dengan simpul yang lain
Sebuah graph mungkin semua simpulnya saling
berhubungan

Panjang busur (atau bobot) mungkin tidak


digambarkan secara panjang yang proposional
dengan bobotnya. Misal bobot 5 digambarkan
lebih panjang dari 7.
2. Istilah pada graph
Incident
Jika e merupakan busur dengan simpul-simpulnya adalah v dan w yang
ditulis e=(v,w), maka v dan w disebut terletak pada e, dan e disebut
incident dengan v dan w.
Degree (derajat), indegree dan outdegree
Degree sebuah simpul adalah jumlah busur yang
incident
dengan
simpul tersebut.
Indegree sebuah simpul pada graph berarah adalah jumlah busur yang
kepalanya incident dengan simpul tersebut, atau jumlah busur yang
masuk atau menuju simpul tersebut.
Outdegree sebuah simpul pada graph berarah
adalah
jumlah
busur yang ekornya incident dengan simpul tersebut, atau jumlah busur
yang keluar atau berasal dari simpul tersebut.
Adjacent
Pada graph tidah berarah, 2 buah simpul disebut adjacent bila ada busur
yang menghubungkan kedua simpul tersebut. Simpul v dan w disebut
adjacent.

Pada graph berarah, simpul v disebut adjacent dengan simpul w bila ada
busur dari w ke v.

Graph Berarah dan Graph Tak Berarah :


Successor dan Predecessor
Pada graph berarah, bila simpul v adjacent dengan simpul w, maka
simpul v adalah successor simpul w, dan simpul w adalah predecessor
dari simpul v.
Path
Sebuah path adalah serangkaian simpul-simpul yang berbeda, yang
Teknik Informatika
Universitas Muhammadiyah Ponorogo

140

Teknik Informatika
Universitas Muhammadiyah Ponorogo

141

adjacent secara berturut-turut dari simpul satu ke simpul berikutnya.


142

143

3. Representasi Graph dalam bentuk matrix

Define struct untuk sebuah simpul yang dapat digunakan sebagai vertex
maupun edge.
typedef struct tipeS {
tipeS *Left;
int INFO;
tipeS *Right;
};
tipeS *FIRST, *PVertex, *PEdge;
Contoh : untuk vertex A, memiliki 2 edge yang terhubung yaitu e1 dan
e2.

4. Representasi Graph dalam bentuk Linked List


Adjency List graph tak berarah
Digambarkan sebagai sebuah simpul yang memiliki 2 pointer.

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Gambar di atas dapat disusun dengan lebih sederhana, sbb :


144

5. Penyelesaian kasus Graph halaman sebelumnya :


Define simpul untuk vertex dan edge
Mengidentifikasi Simpul pertama sebagai vertex yang pertama
Tambahkan vertex sisanya
Tambahkan edge pada masing-masing vertex yang telah terbentuk
Tampilkan representasi graph berikut bobotnya

Adjency List graph berarah

Graph berarah dan berbobot

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

145

ISI BUKU
Struktur Data........................................................... 1
Pengantar Tipe Data, Obyek Data & Struktur Data . 12
Searching Array....................................................... 22
Sorting Array .......................................................... 34
Array Stack Dan Queue .......................................... 42
Pointer Dan Function .............................................. 53
Single Linked List Non Circular................................. 67
Single Linked List Circular........................................ 82

Hasil :

Double Linked List Non Circular .............................. 95


Double Linked List Circular......................................
................................................................................
105
Recursive Function .................................................
................................................................................
116
Tree Manipulation....................................................
................................................................................
126
Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

146

Struktur Data Graf ..................................................


................................................................................
140

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Teknik Informatika
Universitas Muhammadiyah Ponorogo

Anda mungkin juga menyukai