Anda di halaman 1dari 90

MODUL

ALGORITMA LANJUT
(CIL-230)

Materi :

Function
Rekursif
Matriks
Structure
Nested structure
File Stream
Sorting
Searching
Pointer
Singly Linked List
Singly Circular Linked List
Double Linked List
Double Circular Linked List

Disusun Oleh
Yessy Asri, ST. MMSi

UNIVERSITAS ESA UNGGUL


2013

Modul Algoritma Lanjut | 1


A. Pengantar

Algoritma lanjut adalah suatu mata kuliah yang menjelaskan struktur-struktur

dasar dari bahasa pemrograman C++ yang merupakan salah satu bahasa

pemrograman Objek Oriented murni dengan menggunakan software Borland C++

atau Turbo C++. Di dalam perkuliahan ini, Mahasiswa akan mendapatkan

pengetahuan mengenai langkah-langkah dan dasar-dasar untuk membuat suatu

aplikasi mulai dari aplikasi yang sederhana hingga yang sudah kompleks.

B. Kompetensi Dasar

Mahasiswa mampu memahami konsep Function, Rekursif, Matriks, Structure,

Pointer, Nested Structure, File stream, Sorting, Searching, dan Linked List dalam

pemrograman C dan C++.

C. Kemampuan Akhir yang Diharapkan

Mahasiswa dapat mengimplementasikan elemen-elemen pemrograman ke

dalam suatu aplikasi dengan menggunakan bahasa pemrograman C++

D. Materi Belajar

1. Function

a. Definisi Function

Fungsi (Function) merupakan sekumpulan instruksi yang membentuk satu

unit serta memiliki nama. Fungsi digunakan untuk membantu organisasi

program dan mengurangi besar (size ) program.

Modul Algoritma Lanjut | 2


b. Deklarasi dari Definisi Fungsi :

Syntax :

tipe Nama_Fungsi ( daftar_argumen )

blok pernyataan ;

Atau

tipe Nama_Fungsi ( tipe var_1, tipe var_2, … )

blok_pernyataan;

};

dimana:

tipe : tipe data dari return value ( int, float, double, char, void, signed, unsigned,

long, short).

Nama_Fungsi : nama fungsi sesuai aturan C++.

daftar_argumen : variable input / output.

blok_pernyataan “ kumpulan instruksi.

Contoh :

float Hitung ( float Panjang, float Lebar )


{
float Luas; // Deklarasi variabel lokal
Luas = Panjang * Lebar;
return Luas;
};
atau
float Hitung ( float Panjang, float Lebar )
{
return ( Panjang * Lebar );
};
atau
void Hitung ( float Panjang, float Lebar, float *Luas )
{

Modul Algoritma Lanjut | 3


*Luas = Panjang * Lebar ;
};

c. Prototipe Fungsi

Prototipe fungsi adalah deklarasi fungsi yang hanya memiliki tipe,

nama_fungsi,dan daftar_argumen, tetapi tidak memiliki badan_fungsi. Prototipe

fungsi harus dideklarasikan sebelum fungsi tersebut dipanggil.Biasanya prototipe

fungsi dideklarasikan sebelum main program (fungsi main()),dan definisi fungsinya

diletakkan setelah main program.

Manfaat dari prototipe fungsi adalah untuk menjamin tipe argumen yang

dilewatkan pada pemanggilan fungsi benar-benar sesuai. Tanpa adanya prototipe

fungsi,amatlah mudah bagi pemrogram untuk melakukan kesalahan tanpa sengaja

dalam melewatkan argumen.Misalnya,melewatkan argumen bertipe float pada

fungsi yang seharusnya meminta tipe data int. Deklarasi Prototipe Fungsi :

tipe Nama_Fungsi ( tipe var_1, tipe var_2, … );

atau

tipe Nama_Fungsi ( tipe , tipe , tipe, … );

Contoh :

void Tampil ( float Panjang, float Lebar );

atau

void Tampil ( float , float );

d. Argumen (Function Parameter)

Argumen merupakan data yang dikirim dari program ke fungsi dan

sebaliknya. Argumen dipergunakan untuk mengirim / menerima data

yang akan diproses.

Ada 2 jenis cara untuk mengirimkan argumen yaitu:

1. Passing by Value :

Modul Algoritma Lanjut | 4


Pada metode ini yang dikirimkan adalah nilai (value) dari variabel

yang dikirim sebagai argumen. Perubahan terhadap argumen yang terjadi di

dalam fungsi, tidak akan mempengaruhi nilai dari variabel tersebut dari

fungsi pemanggil (hanya 1 arah yaitu masuk ke fungsi).

Contoh Program C++ :

#include <iostream.h>

#include <conio.h>

void Tampil ( int Bil ); // Prototipe Fungsi

void main()

{ int Bil = 99;

clrscr();

cout << “Nilai Bil sebelum pemanggilan “ << “fungsi = “ << Bil << “\n”;

Tampil ( Bil ); // Pemanggilan Fungsi

cout << “Nilai Bil setelah pemanggilan “<< “ fungsi = “ << Bil << “\n”;

getch(); }

void Tampil ( int Bil )

cout << “Nilai Bil di dalam fungsi Tampil = “<< Bil << “\n”;

Bil++;

2. Passing by Reference :

Pada metode ini yang dikirimkan adalah alamat (reference atau pointer)

dari variabel yang dikirim sebagai argumen.

Perubahan argumen di dalam fungsi,akan mempengaruhi nilai variabel ada

variabel pemanggil. Karena yang dikirimkan adalah pointer.

Jenis data yang dikirim sebagai argumen harus berupa variabel,tidak dapat

berupa bilangan konstan.

Modul Algoritma Lanjut | 5


Pada C++ diperkenalkan reference parameter untuk menghindari peng-

gunaan pointer untuk melakukan passing by reference.

Syntax :

tipe Nama_Fungsi ( tipe &var_1, … )

blok_pernyataan;

Contoh Program C++ :

#include <iostream.h>
#include <conio.h>
void Upper_Case ( char &ch ); // Prototipe Fungsi
void main()
{ char ch;
clrscr();
while ( cin.get( ch ) )
{
Upper_Case ( ch ); // Pemanggilan fungsi
cout << ch;
}
getch();
}
void Upper_Case ( char &ch )
{
ch = (ch >= ‘a’ && ch <= ‘z’ ) ? (ch - 32) : ch;
}

e. Default Argumen

C++ mempunyai fasilitas default argument, yaitu suatu nilai tertentu yang

akan dipakai sebagai argumen bila fungsi tidak dipanggil dengan argumen

lengkap.

Pengisian default argument tersebut harus dimulai dari belakang, bila argumen

yang paling terakhir telah terisi, kemudian argument kedua dari akhir boleh diisi

Modul Algoritma Lanjut | 6


dengan default argument, dan seterusnya. Semua argumen fungsi boleh diisi

dengan default argument.

Syntax :

tipe Nama_Fungsi ( …, tipe Var_n = Nilai );

atau

tipe Nama_Fungsi ( …, tipe Var_n = Nilai )

blok pernyataan ;

Contoh :

void Cetak ( int a, int b, int c=0 );


Atau
void Cetak ( int a, int b=5, int c=0 );
Atau
void Cetak ( int a=9, int b=5, int c=0 );
Atau
void Cetak ( int a=9, int b=5, int c=0 )
{
blok_pernyataan;
}

// default ar gument di bawah ini adalah salah


void Tampil ( int a=9, int b, int c );
void Tampil ( int a=9, int b=5, int c );
void Tampil ( int a, int b=5, int c );
void Tampil ( int a=9, int b, int c=0 );
Contoh Program C++ :
#include <iostream.h>
#include <conio.h>
void Cetak ( int a, int b=5, int c=0 )
{
cout << “a = “ << a << “, b = “ << b << “, c = “ << c<< “\n”;
}
void main()
{
// Deklarasi Variabel

Modul Algoritma Lanjut | 7


int A=1, B=2, C=3 ;
clrscr(); // Hapus layar
// Pemanggilan Fungsi
Cetak ( A );
Cetak ( A, B );
Cetak ( A, B, C );
getch();
}

f. Return Value

Satu fungsi setelah melaksanakan pekerjaan, maka fungsi tersebut akan

mengembalikan hasil. Hasil dari fungsi dikembalikan dengan perintah (state -

ment) return. Setiap fungsi yang mempunyai tipe selain void harus

menggunakan perintah return untuk mengembalikan hasil. Setiap fungsi yang

mempunyai tipe datanya void, maka fungsi tidak bisa menggunakan perintah

return untuk mengembalikan hasil, tetapi bisa menggunakan variabel argumennya

dalam mengembalikan hasil.

Contoh Program C++ :

#include <iostream.h>

#include <conio.h>

float lbs_to_kg ( float ); // Prototipe fungsi

void main()

{ // Deklarasi variabel

float lbs, kgs;

clrscr();

cout << “Enter your weight in pounds : “; cin >> lbs;

kgs = lbs_to_kg ( lbs );

cout << “Your weight in Kilograms is “<< kgs << “\n”;

getch();

float lbs_to_kg ( float pounds ) // Definisi Fungsi

Modul Algoritma Lanjut | 8


{

float kilograms = 0.453592 * pounds;

return kilograms;

g. Function Overloading :

Satu fungsi yang dapat melakukan aktifitas yang berbeda tergantung dari

data yang diterima. Pada C++,fungsi dapat mempunyai nama yang sama namun

dengan tugas yang berbeda,hal ini disebut function overloading atau polimorfisme

semu (trivial polymorphism).

Function Overloading dapat diterapkan bila tiap fungsi mempunyai ciri khas fungsi

(function signature ) yang berbeda.

Ciri khas fungsi terdiri atas :

1. Jenis tipe data argumen

2. Jumlah argumen

3. Urutan letak argumen

Contoh Program C++ :

#include <iostream.h>
#include <conio.h>
void print ( int i );
void print ( char ch );
void print ( char ch, int i );
void print ( int I, char ch );
void main()
{ clrscr();
// Pemanggilan Fungsi
print ( 10 ); print ( ‘A’ ); print ( ‘B’, 10 ); print ( 9, ‘X’ ); getch();
}
void print ( int i )
{
cout << “Integer : “ << i << endl;

Modul Algoritma Lanjut | 9


}
void print ( char c h, int i )
{
for ( int j=0; j<i; j++ )
cout << ch;
cout << endl;
}
void print ( int i, char ch )
{
cout << “Integer : “ << i << endl;
cout << “Character : “ << ch << endl;
}

h. Inline Function

Fungsi ini bermanfaat menghemat memori (mengabaikan peletakan argumen-

argumen fungsi dalam stack pada saat pemanggilan fungsi),dengan cara

menggabungkan fungsi ke dalam program utama.

Inline function disarankan dipakai pada fungsi yang sering dipanggil dan

ukurannya kecil (terdiri dari satu atau dua pernyataan).

Pembuatan Inline function tersebut dilakukan dengan cara menambahkan

keyword inline di depan tipe fungsi pada saat mendefinisikan fungsi.

Syntax :

inline tipe Nama_Fungsi ( argumen )

blok_pernyataan;

return Nilai;

Contoh :

inline float Luas ( float Pj, float Lb )

{ return ( Pj * Lb ); }

Contoh Program C++ :

Modul Algoritma Lanjut | 10


#include <iostream.h>
#include <conio.h>
inline float inch_to_cm ( float inches )
{
return ( 2.54 * inches );
}
void main()
{ float inches; clrscr();
cout << “Enter your height in inches = “; cin >> inches;
cout << “Your height in cm is “<< inch_to_cm ( inches ) << endl;
getch();
}

i. Latihan Soal

1. Buatlah function yang akan memberikan nilai 1 jika nilai parameter yang

dimasukkan huruf ‘a’, dan akan memberikan nilai 0 jika nilai parameter yang

dimasukkan selain huruf ‘a’.

2. Buatlah function untuk mencari nilai fungsi f(x) = 2x2 – 3x + 1;

Parameter functionnya adalah nilai x (tipe data float/double). Return valuenya

adalah nilai f(x).

3. Buatlah function untuk membuat tampilan seperti di bawah ini:

**

***

**

Tampilan di atas muncul apabila dimasukkan n = 3.

**

Modul Algoritma Lanjut | 11


***

****

***

**

Tampilan di atas muncul apabila dimasukkan n = 4.

Parameter functionnya adalah n (tipe datanya integer).

30

2. Rekursif

a. Definisi Rekursif

Rekursif adalah suatu proes dari fungsi yang memanggil dirinya secara

berulang-ulang. Karena proses dilakukan berulang-ulang maka harus ada kondisi

yang mengakhiri prosesnya. Jika tidak maka proses tidak akan pernah berhenti

sampai memori yang digunakan tidak dapat menampung lagi.

Salah satu implementasi dari fungsi rekursif adalah pada masalah faktorial.

Faktorial dari bilangan bulat positif n didefinisikan sebagai berikut:

n! = n.(n-1)!, jika n > 1

n! = 1, jika n = 0 atau n = 1

contoh penggunaan fungsri rekursif dalam program untuk masalah faktorial tersebut

adalah sebagai berikut:

/*fungsi rekursif untuk faktorial*/

#include <conio.h>
#include <iostream.h>

long faktorial(long n);

int main()
{
long n;
long temp;

cout << "input number: "; cin >> n;

Modul Algoritma Lanjut | 12


temp = faktorial(n);
cout << n << "! = " << temp;

getch();
}

long faktorial(long n)
{
long f;

if(n>1)
{
f = n*faktorial(n-1);
return(f);
}
else if(n==0 || n==1) return(1);
}

Output:

Keterangan program:

Fungsi utama (main) memanggil fungsi faktorial() dengan mengirimkan nilai n

(dalam contoh diatas nilai n yang dikirim adalah 5) yang maksudnya akan

dilakukan perhitungan 5 faktorial dan hasil perhitungan faktorial akan

disimpan dalam variable temp.

Jika nilai n pertama kali yang diberikan oleh fungsi utama lebih besar dari 1,

maka proses rekursif akan dilakukan. Misalnya nilai n adalah 5, maka proses

rekursif yang pertama adalah:

f = 5 * faktorial(n-1);

proses ini akan memanggil kembali fungsi dirinya sendiri dengan

mengirimkan nilai 4 sebagai nilai n yang baru. Karena nilai n masih lebih

besar dari 1, maka proses rekursif ke-2 akan dilakukan dengan hasilnya

adalah 4 * faktorial(3). Untuk n adalah 3, hasil yang diperoleh oleh rekursif

adalah 3*faktorial(2) dan seterusnya hingga nilai n adalah 1. Untuk nilai n

sama dengan 1 ini, statement return(1) akan mengembalikan proses ke

Modul Algoritma Lanjut | 13


bagian yang memanggilnya, yaitu statement setelah statement f =

5*faktorial(n-1). Statement return(f) kemudian baru mengembalikan proses ke

fungsi utama.

b. Soal Latihan

1. Buatlah sebuah fungsi rekursif dengan C++ yang menerima argumen suatu

bilangan bulat 1 hingga n misalnya klo kita inputkan nilai n sama dengan 10

maka hasil output dilayar akan ditampilkan

10

dan seterusnya sesuai nilai yang diinputkan.

2. Soal kedua masih sama dengan soal pertama tapi hasil outputnya

merupakan kebalikannya misal klo kita masukan nilai n nya sama dengan 10

maka akan ditampilkan dilayar.

10

Modul Algoritma Lanjut | 14


3

3. Matriks

a. Definisi

Matriks adalah sekumpulan informasi yang setiap individu elemennya terdifinisi

berdasarkan dua buah indeks (yang biasanya dikonotasikan dengan baris dan

kolom). Setiap elemen matriks dapat diakses secara langung jika kedua indeks

diketahui, indeksnya harus bertype yang mempunyai keterurutan (suksesor),

misalnya integer. Matriks adalah struktur data dengan memori internal. Struktur ini

praktis untuk di pakai tetapi memakan memori, (matriks integer 100 x 100 memakan

10000x tempat penyimpanan integer.)

Sering di katakana bahwa matriks adalah table atau array berdimensi 2, tetapi

patut diperhatikan bahwa pengertian “2 dimensi”, “baris dan kolom” adalah dalam

pemikiran kita. Pengaturan letak elemen matriks dalam memori komputer selalu

tetap sebagai deretan sel “linier”. Pengertian 2 dimensi ini hanya untuk

mempermudah pemrogram dalam mendesain programnya.

Untuk membuat program, kita akan memakai array untuk membuat matriks,

karena array adalah syarat utama untuk membuat matriks yang akan dibuat, pada

program ini akan dibuat matriks berordo 1 dan berordo 4 x 4. berikut coding

programnya

b. Cara Membuat Matriks Pada C++

#include<conio.h>
#include<iostream.h>
Void main ()
{
clrscr () ;
int a[5] = {2,3,4,5,6);

Modul Algoritma Lanjut | 15


int b[5] = {2,3);
int c[5] = {50,60,70);
int j;
cout<<endl;
for (j=0; j<5; j++)
{
cout<<”a[“<<j<<”]=”<<s[j]<<”b[“<<j<<”c[“<<j<<”]=”<<c[j]<<endl;
}
getch();
}

LOGIKA:

Int a[5] = {2,3,4,5,6}; variabel a mempunyai 5 array dan isi dari tipe data a adalah

2,3,4,5,6

Int b[5] = {2,3} variabel b mempunyai 5 array dan isi dari tipe data tersebut adalah

2,3. Karena dia mempunyai 5 data array, maka pada output nanti terdapat 3 angka 0.

Hal ini terjadi karena tipe data b hanya mempunyai isi array sebanyak 2 yaitu 2 dan

3. Sedangkan array nya sebanyak 5. Jadi angka 0 tersebut untuk memenuhi angka

array yang dibutuhkan.

Int c[5] = {50,60,70} } variabel c mempunyai 5 array dan isi dari tipe data tersebut

adalah 50,60,70. Karena dia mempunyai 5 data array, maka pada output nanti

terdapat 2 angka 0. Hal ini terjadi karena tipe data c hanya mempunyai isi array

sebanyak 3 yaitu 50,60 dan 70. Sedangkan array nya sebanyak 5. Jadi angka 0

tersebut untuk memenuhi angka array yang dibutuhkan. Variable a,b,c masing-

masing bertipe data integer

Int j dan cout<<endl; program akan mengacu pada int j. Karena int j pada program

tersebut terdapat pada pengulangan for (j = 0; j = 5; j++). Artinya program akan

melakukan pengulangan sebanyak 5 kali dan dimulai dari angka

0.cout<<"a["<<j<<"]="<<a[j]<<"b["<<j<<"]="<<b[j]<<"c["<<j<<"]="<<c[j]<<endl;

Merupakanhasil printout dari array yang user buat.

Getch() dan } merupakanakhirdari program.

Modul Algoritma Lanjut | 16


Berikut outputnya :

Matriks dengan ordo 4 x 4 pada c++. Berikut programnya

Int matrik [4] [4]; merupakan variable matriks dimensi 2. Masing- masing mempunyai

array sebanyak 4.

Int i,j; I dan j merupakan tipe data integer

for (i=1; i<=4; i++) Merupakan bentuk pengulangan, jadi variabel I akan mengulang

sebanyak 4 kali. Pengulangan ini akan berpengaruh dalam angka yang akan di input

pada baris dan kolom matrik

Modul Algoritma Lanjut | 17


for (j=1; j<=4; j++) Merupakan bentuk pengulangan, jadi variabel j akan mengulang

sebanyak 4 kali. Pengulangan ini juga akan berpengaruh dalam angka yang akan di

input pada baris dan kolom matrik

cout<<"masukan angka pada baris ke "<<i<<" kolom ke "<<j<<" : "; cout tersebut

artinya program akan menampilkan output masukan angka pada baris ke i. I disitu

merupakan baris dan j merupakan kolom. Jadi nantinya program akan meminta

untuk memasukan angka pada variabel I dan kolom pada variabel j

cin>>matrik [i] [j]; cin digunakan untuk menginput I dan j

cout<<endl; digunakan membuat baris baru pada program.

cout<<"ini matrik ordo (4,4) 4 baris 4 kolom"; akan mengeluarkan ouput ini matrik

ordo (4,4) 4 baris 4 kolom.

for (i=1; i<=4; i++). Merupakan bentuk pengulangan, jadi variabel I akan mengulang

sebanyak 4 kali. Pengulangan ini akan berpengaruh pada pembentukan matrik 4 x 4

for (j=1; j<=4; j++) ++). Merupakan bentuk pengulangan, jadi variabel j akan

mengulang sebanyak 4 kali. Pengulangan ini juga akan berpengaruh pada

pembentukan matrik 4 x 4

cout<<matrik [i] [j]<<" "; merupakan hasil dan output matrik 4x4 nanti.

Getch() merupakan akhir dari program.

Berikutoutputnya :

Modul Algoritma Lanjut | 18


4. Structure

a. Definisi

Struct atau struktur adalah tipe data yang dapat melakukan penyimpanan

elemen data yang memiliki variabel yang saling berhubungan yang disatukan

menjadi satu kesatuan. Elemen data yang terdapat dalam struct disebut

denganmembers structure, yang dapat memiliki tipe data yang berbeda-beda.

Struktur data dideklarasikan dalam c++ menggunakan syntax :

struct structure_name {

member_type1 member_name1;

member_type2 member_name2;

member_type3 member_name3;

} object_names;

Dimana structure name adalah nama dari tipe

struktur, object_namesmerupakan identitas untuk objek yang memiliki struct. Data

yang terdapat didalam kurung { } merupakan daftar dari data member, dimana setiap

data member dilengkapi dengan tipe dan identifier yang sesuai dengan member

name-nya.

Modul Algoritma Lanjut | 19


Contoh Program :

#include “stdio.h”
struct barang
{ int kode_brg;
float harga;
int stok_brg;
int terhapus; //untuk menyimpan status data. bernilai 0 jika masih ada, dan 1 jika sdh
dihapus
}data[4]; //array of struct dengan 3 elemen

void main()
{ int i, n, cari, ketemu;
printf(“Program Struktur Data\n”);
printf(“======================\n\n”);
printf(“Jumlah data yang ingin diproses = “);
scanf(“%d”, &n);
printf(“Isikan data\n”);
for(i=0;i<n;i++)
{ printf(“Kode Barang = “); scanf(“%d”, &data[i].kode_brg);
printf(“Harga Barang = “); scanf(“%f”, &data[i].harga);
printf(“Stok Barang = “); scanf(“%d”, &data[i].stok_brg);
printf(“————————-\n”);
data[i].terhapus = 0;
};
printf(“\nIsi data\n”); //menampilkan data
for(i=0;i<n;i++)
{ if (data[i].terhapus == 0) //tampilkan data yg belum terhapus
printf(“Kode Barang = %d\tHarga = %f\tStok Barang = %d\n”, data[i].kode_brg,
data[i].harga, data[i].stok_brg);
};
printf(“\nCari Kode Barang = “); scanf(“%d”, &cari); ketemu = 0; //awal pencarian data
for(i=0;i<n;i++)
{ if (cari == data[i].kode_brg)
ketemu = 1;
}
if (ketemu == 1)
printf(“Kode Barang ditemukan\n”);
else
printf(“Kode Barang tidak ada\n”);
printf(“\nCari Kode Barang hapus = “); scanf(“%d”, &cari); //awal penghapusan data

Modul Algoritma Lanjut | 20


for(i=0;i<n;i++) //cari dulu data yang akan dihapus. misal berdasar NPM
{ if ((cari == data[i].kode_brg) && (data[i].terhapus == 0)) //cek juga status datanya
{ data[i].terhapus = 1; break; //sekali ketemu ubah status, keluar loop
}
}
printf(“\nIsi data\n”); //menampilkan data setelah dihapus
for(i=0;i<n;i++)
{ if (data[i].terhapus == 0) //tampilkan data yang statusnya belum terhapus
printf(“Kode Barang = %d\tHarga = %f\tStok Barang = %d\n”, data[i].kode_brg,
data[i].harga, data[i].stok_brg);
};
printf(“\nCari Kode Barang edit = “); scanf(“%d”, &cari); //awal edit data
for(i=0;i<n;i++) //cari dulu data yg akan di-edit. misal berdasar NPM
{ if (cari == data[i].kode_brg && (data[i].terhapus == 0)) //cek juga status data
{ printf(“Masukkan data baru:\n”);
printf(“Harga Barang = “); scanf(“%f”, &data[i].harga);
printf(“Stok Barang = “); scanf(“%d”, &data[i].stok_brg);
data[i].terhapus = 0;
}
}
printf(“\nIsi data\n”); //tampilkan lagi isi data yg telah berubah
for(i=0;i<n;i++)
{ if ((data[i].terhapus == 0))
printf(“Kode Barang = %d\tHarga = %f\tStok Barang = %d\n”, data[i].kode_brg,
data[i].harga, data[i].stok_brg);
};
}
Program ini digunakan untuk program pertokoan yang berguna untuk

pencatatan data barang. Dalam program tersebut menyediakan data-data yang

berfungsi untuk menyimpan data barang, mencari data barang, menghapus

databarang , memperbaiki data barang.

b. Array of Struct

Array atau yang dalam Bahasa Indonesia disebut dengan larik merupakan

struktur data yang didalamnya terdapat sekumpulan elemen-elemen yang dapat

diakses dengan metode indeksing. Selain bentuk array berdimensi tunggal juga

Modul Algoritma Lanjut | 21


terdapat apa yng disebut ‘Multi-dimensional Array’ , dimana kita dapat mengakses

array dengan identitas baris dan kolom yang dimiliki, misalnya a[3,5]. Contoh bentuk

penulisan ‘Multi-dimensional Array’ :

Sementara itu bila elemen-elemen dari suatu array berbentuk sebuah struktur

maka array itu disebut dengan Array of Struct.

Contoh program Array of Struct :

struct date {
int month, day, year;
};
struct student {
char name[30];
struct date birthday;
};
struct student data_mhs[MAKS]

Dimana program ini artinya mendeklarasikan array data_mhs yang memiliki elemen

bertipe struct student sebanyak maks.

c. Union

Union merupakan struktur data yang menyimpan satu atau lebih tipe data di

satu lokasi.

Union sebenarnya sama dengan struktur. Struktur digunakan untuk mendefinisikan

tipe data yang dapat memiliki beberapa member, dimana setiap member mengambil

tempat penyimpanan yang bebrbeda. Contoh struct dengan kode sumber seperti

beriut ini :

struct rectangle {
int width;
int height;

Modul Algoritma Lanjut | 22


};

Dimana penempatan lokasinya di memori dapat dilihat di gambar 1-1.

Sementara union menyediakan satu lokasi tunggal yang dapat digunakan untuk

banyak member name yang berbeda. Contoh kode sumber union :

union value {
long int i_value;
float f_value;
}

Gambar 1-1 . Layout Struct dan Union :

d. Latihan

Ada sebuah system pengundian hadiah. Cara kerja system tersebut adalah sebagai

berikut:

1. Sistem mempersiapkan sebuah struct untuk menyimpan nomor urut[int],

nama[max 50 karakter] dan nomor undian[3 digit] tersebut.

2. Kemudian system menyimpan nama pemilik beserta nomor undian yang

didapatkannya.

3. Setelah itu system akan merandom siapakah yang mendapatkan hadiah

pertama, kedua, dan ketiga.

4. System akan menyimpan nama ketiga pemenang pada sebuah array,

kemudian menampilkan ketiga nama pemenang tersebut

Modul Algoritma Lanjut | 23


5. Nested Structure

a. Pengertian Nested Structure

Nested Structure merupakan suatu Structure dapat digunakan didalam

structure yang lainnya atau Struktur yang salah satu anggotanya adalah struktur lain.

b. Deklarasi Nested Structure

Deklarasi struktur lain dilakukan sebelum deklarasi struktur yang memuatnya.

Untuk lebih mengerti uraian diatas perhatikan ilustrasi berikut ini :

Contoh :

– Struct Mhs berisi Nim, Nama, Alamat, Tempat, Tanggal Lahir

– Alamat merupakan struct yang terdiri dari Nama Jalan, Nomor Rumah,

Kota, Provinsi

– Tanggal Lahir merupakan struct yang berisi Tanggal, Bulan dan Tahun

struct Alamat {
char Jalan[40]; int NoRumah;
char Kota[20], Propinsi[20];
};
struct TanggalLahir {
int Tanggal, Bulan, Tahun;
};
struct Mhs{
int Nim;
char Nama[20];
struct Alamat addr;
struct TanggalLahir tgllahir;
};

c. Contoh-contoh Program dalam Nested Structure

Modul Algoritma Lanjut | 24


Contoh Pertama :

#include<stdio.h>
#include<conio.h>
#include<iostream.h>

main()
{
struct dtmhs
{
char nim[5];
char nama[15];
};

struct dtnil
{
float nil1;
float nil2;
};

struct
{
struct dtmhs mhs;
struct dtnil nil;
} nilai;

clrscr();

//-> masukan data


cout<<"masukan NIM = "; cin>>nilai.mhs.nim;
cout<<"masukan Nama = "; cin>>nilai.mhs.nama;
cout<<"masukan Nilai UTS = "; cin>>nilai.nil.nil1;
cout<<"masukan Nilai UAS = "; cin>>nilai.nil.nil2;
cout<<endl;

//-> menampilkan hasil masukan


cout<<"NIM = "<<nilai.mhs.nim<<endl;
cout<<"Nama = "<<nilai.mhs.nama<<endl;
cout<<"Nilai UTS = "<<nilai.nil.nil1<<endl;
cout<<"Nilai UAS = "<<nilai.nil.nil2<<endl;

Modul Algoritma Lanjut | 25


cout<<endl;

getch();
return(0);
}

Contoh Kedua :

#include <iostream.h>
#include <string.h>

struct Tanggal
{
unsigned int tanggal;
unsigned int no_bulan;
unsigned int tahun;
};

struct Karyawan
{
char nama[100];
char nip[13];
struct Tanggal tgl_masuk;
float gaji;
};

int main()
{
Karyawan karyawan;

strcpy(karyawan.nama, "Firdaus");
strcpy(karyawan.nip, "10090090");
karyawan.tgl_masuk.tanggal = 10;
karyawan.tgl_masuk.no_bulan = 12;
karyawan.tgl_masuk.tahun = 2011;

cout << "Nama karyawan\t: " << karyawan.nama << endl;


cout << "NIP karyawan\t: " << karyawan.nip << endl;
cout << "Tanggal masuk\t: " << karyawan.tgl_masuk.tanggal << "/"

Modul Algoritma Lanjut | 26


<< karyawan.tgl_masuk.no_bulan << "/"
<< karyawan.tgl_masuk.tahun << endl;

system("PAUSE");
}

Contoh Ketiga :

struct tanggal {
int tgl, bln, thn;
};
struct rekening {
int noRek;
char tipeRek;
char nama[31];
long saldo;
struct tanggal transAkhir;
};
struct rekening nasabah1, nasabah2;

Contoh Keempat :

struct tanggal {
unsigned int hari;
unsigned int bulan;
unsigned int tahun;
};
struct karyawan {
char NIP [10];
char nama [20];
struct tanggal tgl_masuk;
float gaji;
};

d. Latihan Soal

1. Berikan penjelasan mengenai definisi dan deklarasi Nested Struct ?

2. Fakultas Teknik informatika membutuhkan suatu aplikasi untuk mencatat

data karyawan yang berada dilingkungannya. Adapun fields yang perlu

disimpan adalah NIP, Nama, alamat, tgl lahir, agama, telepon dan

Modul Algoritma Lanjut | 27


kepangkatan. Input data karyawan dipastikan tidak lebih dari 500

karyawan. Buatlah program yang dapat menyimpan data tersebut dan

menampilkannya kembali.

6. File Stream

a. Definisi File Stream

File Stream Merupakan suatu fungsi khusus dalam pemrograman C++ yang

merupakan manipulasi data untuk menginputkan, menambahkan data kedalam file

pada suatu alamat memori tertentu menggunakan array. Suatu stream yang

digunakan untuk menginputkan data harus mempunyai tipe kelas IFSTREAM,

sedangkan stream untuk mengeluarkan data bertipe OFSTREAM. Supaya dapat

menampilkan isstream dan ofstream , harus disertakan file header fstream.h.

b. Deklarasi File Stream

Suatu stream yang digunakan untuk memasukan data harus mempunyai tipe

kelas ifstream, sedangkan stream untuk mngeluarkan data bertipe ofstream. Supaya

bias mengeluarkan isstream dan ofstream , harus disertakan file header fstream.h.

cara untuk mendeklarasikan stream sbb:

Ifstream nama_stream_masukan; //stream masukan

ofstream nama_stream_keluaran; //stream keluaran

/*fungsi stream file

#include"iostream.h"

#include"fstream.h"

int main()

ofstream tulis;

tulis.open("file1.txt");

if(tulis.fail())

Modul Algoritma Lanjut | 28


cout<<"file gagal ditulis"<

return(1);

tulis<<"pemograman berorientasi objek"<

tulis<<"belajar bahasa c++"<

cout<<"file berhasil ditulis"<

tulis.close();

7. Sorting

a. Definisi Sorting

SORT adalah Suatu proses pengurutan data yang sebelumnya disusun secara

acak atau tidak teratur menjadi urut dan teratur menurut aturan tertentu.

Biasanya pengurutan menjadi 2 (dua), yaitu :

1. Ascending Pengurutan dari karakter / angka kecil ke karakter / angka

besar.

2. Descending Pengurutan dari karakter / angka besar ke karakter /

angka kecil.

b. Metode Sorting

Untuk melakukan proses pengurutan dapat menggunakan beberapa metode,

diantaranyanya adalah :

1. Bubble Sort

Bubble Sort adalah Suatu metode pengurutan yang membandingkan elemen

yang sekarang dengan elemen berikutnya.

– Apabila elemen yang sekarang > elemen berikutnya, maka posisinya

ditukar, kalau tidak, tidak perlu ditukar.

– Misalkan ada data-data sebagai berikut �5, 34, 32, 25, 75, 42, 22, 2

Modul Algoritma Lanjut | 29


– Kita ingin melakukan pengurutan dari yang terkecil sampai yang terbesar

dari ke 8 (delapan) data tsb.

Algoritma gelembung dapat dituliskan sebagai berikut :

1. i = 0

2. selama (i < N-1) kerjakan baris 3 sampai dengan 7

3. j = N - 1

4. Selama (j >= i) kerjakan baris 5 sampai dengan 7

5. Jika (Data[j-1] > Data[j]) maka tukar Data[j-1] dengan Data[j]

6. j = j – 1

7. i = i + 1

Di bawah ini merupakan prosedur yang menggunakan metode gelembung:

void BubbleSort()

int i, j;

for(i=1; i<Max-1; i++)

for(j=Max-1; j>=i; j--)

if(Data[j-1] > Data[j])

Tukar(&Data[j-1], &Data[j]);

2. Quick Sort

Metode Quick sering disebut juga metode partisi (partition exchange sort).

Metode ini diperkenalkan pertama kali oleh C.A.R. Hoare pada tahun 1962.

Untuk mempertinggi efektifitas dari metode ini, digunakan teknik menukarkan dua

Modul Algoritma Lanjut | 30


elemen dengan jarak yang cukup besar. Proses penukaran dengan metode quick

dapat dijelaskan sebagai berikut:

Mula-mula dipilih data tertentu yang disebut pivot, misalnya x. Pivot dipilih

untuk mengatur data di sebelah kiri agar lebih kecil daripada pivot dan data di

sebelah kanan agar lebih besar daripada pivot. Pivot ini diletakkan pada posisi ke

j sedemikian sehingga data antara 1 sampai dengan j-1 lebih kecil daripada x.

Sedangkan data pada posisi ke j+1 sampai N lebih besar daripada x. Caranya

dengan menukarkan data diantara posisi 1 sampai dengan j-1 yang lebih besar

daripada x dengan data diantara posisi j+1 sampai dengan N yang lebih kecil

daripada x.

Metode Quick Sort Non Rekursif

Implementasi secara non rekursif memerlukan dua buah tumpukan (stack) yang

digunakan yang digunakan untuk menyimpan batas-batas subbagian. Pada

prosedur ini menggunakan tumpukan yang bertipe record (struktur) yang terdiri

dari elemen kiri (untuk mencatat batas kiri) dan kanan (untukmencatat batas

kanan. Tumpukan dalam hal ini dideklarasikan sebagai array.

Algoritma quick sort non rekursif dapat dituliskan sebagai berikut :

1. Tumpukan[1].Kiri = 0
2. Tumpukan[1].Kanan = N-1
3. Selama ujung ≠ 0 kerjakan baris 4 sampai dengan 22
4. L = Tumpukan[ujung].Kiri
5. R = Tumpukan[ujung].Kanan
6. ujung = ujung – 1
7. Selama (R > L) kerjakan baris sampai 8 dengan 22
8. i = L
9. j = R
10. x = Data[(L + R) / 2]
11. Selama i <= j kerjakan baris 12 sampai dengan 14
12. Selama (Data[i] < x), i = i + 1
13. Selama (x < Data[j]), j = j – 1
14. Jika (i <= j) maka kerjakan baris 15 sampai dengan 17, jika tidak ke baris 11
15. Tukar Data[i] dengan Data[j]

Modul Algoritma Lanjut | 31


16. i = i + 1
17. j = j –1
18. Jika (L < i) maka kerjakan baris 19 sampai dengan 21
19. ujung = ujung + 1
20. Tumpukan[ujung].Kiri = i
21. Tumpukan[ujung].Kanan = R
22. R = j

Di bawah ini merupakan prosedur yang menggunakan metode quick dengan non
rekursi:
void QuickSortNonRekursif(int N)
{
const M = MaxStack;
struct tump
{
int Kiri;
int Kanan;
}
Tumpukan[M];
int i, j, L, R, x, ujung = 1;
Tumpukan[1].Kiri = 0;
Tumpukan[1].Kanan = N-1;
while (ujung!=0)
{
L = Tumpukan[ujung].Kiri;
R = Tumpukan[ujung].Kanan;
ujung--;
while(R > L)
{
i = L;
j = R;
x = Data[(L+R)/2];
while(i <= j)
{
while(Data[i] < x)
i++;
while(x < Data[j])
j--;
if(i <= j)
{

Modul Algoritma Lanjut | 32


Tukar(&Data[i], &Data[j]);
i++;
j--;
}
}
if(L < i)
{
ujung++;
Tumpukan[ujung].Kiri = i;
Tumpukan[ujung].Kanan = R;
}
R = j;
}
}
}

Metode Quick Sort Rekursif

Algoritma quick Rekursif dapat dituliskan sebagai berikut :

1. x = Data[(L + R) / 2]
2. i = L
3. j = R
4. Selama ( i <= j) kerjakan baris 5 sampai dengan 12
5. Selama (Data[i] < x) kerjakan i = i + 1
6. Selama (Data[j] > x) kerjakan j = j – 1
7. Jika (i <= j) maka kerjakan baris 8 sampai 10; jika tidak kerjakan baris 11
8. Tukar Data[i] dengan Data[j]
9. i = i + 1
10. j = j –1
11. Jika (L < j) kerjakan lagi baris 1 dengan R = j
12. Jika (i < R) kerjakan lagi baris 1 dengan L = i

Dibawah ini merupakan prosedur yang menggunakan metode quick dengan rekursi:

void QuickSortRekursif(int L, int R)


{
int i, j, x;

Modul Algoritma Lanjut | 33


x = data[(L+R)/2];
i = L;
j = R;
while (i <= j)
{
while(Data[i] < x)
i++;
while(Data[j] > x)
j--;
if(i <= j)
{
Tukar(&Data[i], &Data[j]);
i++;
j--;
}
}
if(L < j)
QuickSortRekursif(L, j);
if(i < R)
QuickSortRekursif(i, R);
}

3. Pengertian Metode Selection Sort

Metode seleksi melakukan pengurutan dengan cara mencari data yang terkecil

kemudian menukarkannya dengan data yang digunakan sebagai acuan atau sering

dinamakan pivot. Proses pengurutan dengan metode seleksi dapat dijelaskan

sebagai berikut :

Langkah pertama dicari data terkecil dari data pertama sampai data terakhir.

Kemudian data terkecil ditukar dengan data pertama. Dengan demikian, data

pertama sekarang mempunyai nilai paling kecil dibanding data yang lain. Langkah

kedua, data terkecil kita cari mulai dari data kedua sampai terakhir. Data terkecil

yang kita peroleh ditukar dengan data kedua dan demikian seterusnya sampai

semua elemen dalam keadaan terurutkan.

Algoritma seleksi dapat dituliskan sebagai berikut :

Modul Algoritma Lanjut | 34


1. i = 0
2. selama (i < N-1) kerjakan baris 3 sampai dengan 9
3. k = i
4. j = i + 1
5. Selama (j < N) kerjakan baris 6 dan 7
6. Jika (Data[k] > Data[j]) maka k = j
7. j = j + 1
8. Tukar Data[i] dengan Data[k]
9. i = i + 1

Di bawah ini merupakan prosedur yang menggunakan metode seleksi:

void SelectionSort()
{
int i, j, k;
for(i=0; i<Max-1;i++)
{
k = i;
for (j=i+1; j<Max; j++)
if(Data[k] > Data[j])
k = j;
Tukar(&Data[i], &Data[k]);}}

4. Merge Sorting

Metode penggabungan biasanya digunakan pada pengurutan berkas. Prinsip

dari metode penggabungan sebagai berikut :

Mula-mula diberikan dua kumpulan data yang sudah dalam keadaan urut.

Kedua kumpulan data tersebut harus dijadikan satu table sehingga dalam

keadaan urut. Misalnya kumpulan data pertama (T1) adalah sebagai berikut :

3 11 12 23 31

Sedangkan kumpulan data kedua (T2) adalah sebagai berikut :

9 15 17 20 35

Proses penggabungan ini dapat dijelaskan sebagai berikut : mula-mula

diambil data pertama dari T1 yaitu 3 dan data pertama dari T2 yaitu 9. Data ini

Modul Algoritma Lanjut | 35


dibandingkan, kemudian yang lebih kecil diletakkan sebagai data pertama dari

hasil pengurutan, misalnya T3. Jadi T3 akan memiliki satu data yaitu 3. Data yang

lebih besar yaitu 9 kemudian dibandingkan dengan data kedua dari T1, yaitu 11.

Ternyata 9 lebih kecil dari 11, sehingga 9 diletakkan sebagai data kedua dari T3.

Demikian seterusnya sehingga didapat hasil sebagai berikut :

3 9 11 12 15 17 20 23 31 35

Algoritma penggabungan dapat dituliskan sebagai berikut :

1. i = 0
2. j = 0
3. J3 = 0
4. Kerjakan baris 5 sampai dengan 7 selama (i < J1) atau (j < J2)
5. J3 = J3 + 1
6. Jika (T1[i] < T2[j]) maka T3[J3] = T1[i], i = i + 1
7. Jika (T1[i] >= T2[j]) maka T3[J3] = T2[j], j = j + 1
8. Jika (i > J1) maka kerjakan baris 9, jika tidak kerjakan baris 15
9. i = j
10. Selama (i < J2) kerjakan baris 11 sampai dengan 13
11. J3 = J3 + 1
12. T3[J3] = T2[i]
13. i = i + 1
14. Selesai
15. j = i
16. Selama (j < J1) kerjakan baris 17 sampai dengan 19
17. J3 = J3 + 1
18. T3[J3] = T1[j]
19. j = j + 1

Di bawah ini merupakan prosedur penggabungan dua kumpulan data yang

sudah dalam keadaan urut:

void MergeSort(int T1[],int T2[],int J1,int J2, int T3[],int *J3)


{
int i=0, j=0;
int t=0;
while ((i<J1)||(j<J2))
{

Modul Algoritma Lanjut | 36


if(T1[i]<T2[j])
{
T3[t] = T1[i];
i++;
}
else
{
T3[t] = T2[j];
j++;
}t++;
}
if(i>J1)
for(i=j; i<J2; i++)
{
T3[t] = T2[i];
t++;
}
if(j>J2)
for(j=i; j<J1; j++)
{
T3[t] = T1[j];
t++;
}
*J3 = t;
}

c. Latihan soal sorting

1. DATA : 4, 28, 31, 27, 80, 44, 12, 9

Berapa langkah supaya urut ??

DATA : 9, 21, 45, 11, 3, 8, 50, 77

Berapa langkah supaya urut ??

2. Memasukan 15 data yang int Data

[15]={8,1,45,2,5,2,9,6,12,7,8,6,10,11,44};

Modul Algoritma Lanjut | 37


hitung berapa banyak proses pertukaran posisi data, dan berapa banyak

proses perbandingan data.

8. Searching

a. Definisi Searching

Searching atau pencarian data adalah proses yang sering dilakukan dalam

pengolahan data. Prosesini dilakukan jika user atau pengguna ingin mencari suatu

nilai apakah tersimpan dalam suatudata atau tidak.

Dibedakan dua macam pencarian :

1. Pengurutan pada tabel acak (data tersusun secara acak), yaitu pencarian

terhadap sekumpulandata yang disimpan secara tidak berurutan

2. Pengurutan pada tabel terurut (data tersusun secara terurut), yaitu pencarian

terhadapsekumpulan data yang disimpan secara berurutan

ambil nilai tengah dari array dengan fungsi div, misalkan array ber-size = 100
maka akan didapatkan nilai tengah = 50
ulangi selama (nilai tengah <= size && nilai tengah >0):
jika nilai tengah == nilai yang dicari, return 1
jika nilai tengah < nilai yang dicari, nilai tengah/2
jika nilai tengah > nilai yang dicari, nilai tengah*3/2
return 0

Contoh program :

#include <iostream>
#include <conio.h>
using namespace std;
int binary_s(int array[], int size, int elemen);
int main()
{
int size=10;
int data[10]={2, 3, 5, 6, 12, 44, 56, 65, 73 ,81} ;
cout<<"Data Array"<<endl;
int i;

Modul Algoritma Lanjut | 38


for(i=0;i<size;i++)
cout<<data[i]<<" ";
cout<<endl<<endl<<"masukkan data yang ingin anda cari: ";
int cari;
cin>>cari;
// pencarian
int hasil;
hasil = binary_s(data, size, cari);
if (hasil==0)
cout<<"Nilai tidak ditemukan";
else
cout<<"Nilai ditemukan";
getch();
}

int binary_s(int array[], int size, int elemen)


{
int awal = 0;
int akhir = size-1;
int nilaiTengah = (awal+akhir)/2;
while (nilaiTengah<=size && awal<=akhir)
{
nilaiTengah = (awal+akhir)/2;
if (array[nilaiTengah]==elemen)
return 1;
else if (elemen<array[nilaiTengah])
akhir = nilaiTengah-1;
else
awal = nilaiTengah+1;
}
return 0;
}

9. Pointer

a. Pengertian Pointer

Pointer adalah suatu variabel yang menunjuk ke alamat memory variabel

yang lainnya. Dengan menggunakan pointer banyak hal dapat dilakukan seperti

Modul Algoritma Lanjut | 39


melewatkan suatu variabel yang ada di dalam fungsi yang telah di bahas pada bab-

bab sebelumnya.

Suatu pointer bukan berisi dengan suatu nilai data seperti halnya pada variabel

biasa, variabel pointer berisi dengan suatu alamat.

Operator pada pointer ada 2 macam yaitu :

a.1 Operator &

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

menghasilkan alamat dari operandnya.

a.2 Operator *

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

menghasilkan nilai yang berada pada sebuah alamat.

b. Deklarasi Pointer

Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan

terlebih dahulu sebelum digunakan.

Bentuk Umum :

Tipe_data *nama_pointer;

Untuk lebih mengerti uraian diatas perhatikan ilustrasi berikut ini :

#include <iostream.h>
void main()
{
int *px, x, y; // mendeklarasikan variabel pointer px bertipe integer
x = 1000; // memberikan nilai x sama dengan 1000
px = &x; // dengan statement ini variabel pointer sekarang menunjuk ke alamat
variabel x
y = *px; // mengakses variabel yang ditunjuk oleh pointer
cout << px; // menampilkan isi dari variabel pointer px berupa alamat
cout << endl; // ganti baris baru
cout << y; // menampilkan isi dari variabel yang di tunjuk
}
Hasil dari program diatas adalah :
FFDD

Modul Algoritma Lanjut | 40


1000
c. Operasi dalam Pointer

1. Operasi Penugasan

Suatu variable pointer seperti halnya variable yang lain, juga bisa mengalami

operasi penugasan. Nilai dari suatu variable pointer dapat disalin ke variable

pointer yang lain.

Contoh :

void main()
{ float *x1,y, *x2;
clrscr();
y = 13.45;
x1 = &y; /* Alamat dari y disalin ke variabel x1 */
x2 = x1; /* Isi variabel x1 disalin ke variabel x2 */
cout<<"Nilai variabel y = "<<y<< " ada di alamat "<< x1<<"\n";
cout<<"Nilai variabel y = "<<y<< " ada di alamat "<< x2<<"\n";
getch();
}

2. Operasi Aritmatika

Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai

integer saja. Operasi yang biasa dilakukan adalah operasi penambahan dan

pengurangan. Operasi penambahan dengan suatu nilai menunjukkan lokasi

data berikutnya (index selanjutnya) dalam memori. Begitu juga operasi

pengurangan.

Contoh :

void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori " <<penunjuk<<"\n";

Modul Algoritma Lanjut | 41


cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat memori " <<penunjuk+1<<"\n";
cout<<"Nilai "<<*(penunjuk+2) <<" ada di alamat memori " <<penunjuk+2<<"\n";
getch();
}

3. Operasi Logika

Suatu pointer juga dapat dikenai operasi logika.

Contoh :

#include<iostream.h>
#include "conio.h"
void main()
{ int a = 100, b = 200, *pa, *pb;
clrscr();
pa = &a;
pb = &b;
cout<<"nilai pa= "<<pa<< " nilai pb= "<<pb<<"\n";
if(pa < pb)
cout<<"pa menunjuk ke memori lebih rendah dari pb\n";
if(pa == pb)
cout<<"pa menunjuk ke memori yang sama dengan pb\n";
if(pa > pb)
cout<<"pa menunjuk ke memori lebih tinggi dari pb\n";
getch();}

d. Pointer dan String

Contoh :

#include <iostream.h>
#include <conio.h>
void misteri1(char *);
void main() {
char string[] = "amikom";
cout<< "String sebelum proses adalah " << string <<"\n" ;
misteri1(string);
cout<<"String setelah proses adalah "<<string;
getch();

Modul Algoritma Lanjut | 42


}
void misteri1(char *s) {
while ( *s != '\0' ) {
if ( *s >= 'a' && *s <= 'z' )
*s -= 32;
++s;
}
}

e. Pointer dan Array

Hubungan antara pointer dan array pada C++ sangatlah erat, sebab
sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Untuk
jelasnya perhatikan program berikut ini :

#include <iostream.h>
void main()
{ staticintnilai[3] = {10,20,30 }; // pemberiannilaike array nilai
int *pnilai; // mendeklarasikanvariabel pointer pnilai
pnilai = nilai; // pnilaiberisialamat array
for(int i=0; i<3; i++)
{
cout<< *(pnilai + i) <<endl; // tampilkanisi array melaluivariable pointer
}
}

Dari program diatas dapat dilihat bahwa pengaksesan elemen array dapat

dilakukan melalui alamat memori pada variabel pointer. *(pnilai + i) sama halnya

dengan nilai[] pada array biasa. Output dari program diata sakan menghasilkan nilai

10, 20 dan 30. untuk array dua, tigadan n dimensi pun dapat kitabuat dengan

menggunakan pointer. Contohuntuk array dengan dimensi dua pendeklarasiannya

adalah :

*(*(pnilai + i) + j)

Modul Algoritma Lanjut | 43


f. Array dari Pointer

Suatu array bias digunakan untuk menyimpan sejumlah pointer. Sebagai

contoh untuk membuat array satu dimensi yang bertipe integer kita deklarasikan :

intnilai[3] dirubahmenjadiint *nilai

Berikut ini akan diberikan contoh program dengan menggunakan fungsi standar

diatas (langsung dengan menggunakan C++) :

#include <iostream.h>
#include <conio.h>
structmhs
{
char nim[9];
charnama[25];
charalamat[30];
intnilai;
};
void main()
{
mhs *pmhs;
int n;
clrscr();
cout<< "PROGRAM DATA MAHASISWA" <<endl;
cout<< "----------------------" <<endl<<endl;
cout<< "MasukkanBanyaknya Data : "; cin>> n;
cout<<endl;
pmhs = new mhs[n];
for (int i=0; i<n; i++)
{
cout<< "Input Data MahasiswaKe-" << i+1 <<endl;
cout<< "NamaAnda : "; cin>>pmhs[i].nama;
cout<< "NIMAnda : "; cin>>pmhs[i].nim;
cout<< "AlamatAnda : "; cin>>pmhs[i].alamat;
cout<< "NilaiAP2Anda : "; cin>>pmhs[i].nilai;
cout<<endl;
}

cout<< "TekanSembarangtombol ... !";

Modul Algoritma Lanjut | 44


getch();
clrscr();
cout<< " Output Data Mahasiswa"
<<endl<<endl;
cout<< "===========================================" <<endl;
cout<< " No. Nama NIM Alamat Nilai" << endl;
cout<< "===========================================" <<endl;
for (i=0; i<n; i++)
{
gotoxy(2, i+6); cout<< i+1 << ".";
gotoxy(7, i+6); cout<<pmhs[i].nama;
gotoxy(22, i+6); cout<<pmhs[i].nim;
gotoxy(33, i+6); cout<<pmhs[i].alamat;
gotoxy(53, i+6); cout<<pmhs[i].nilai<<endl;
}
cout<< "===========================================" <<endl;
delete [] pmhs;
getch();
}

g. Pointer ke Pointer

Pointer ke pointer merupakansuatu pointer yang menunjukkealamat pointer yang

lainnya.Denganmenggunakanduabuahasterikpadavariabel pointer, makavariabel

pointer tersebutdapatmengakseskevariabel pointer yang lainnya.Contohnya :

#include <iostream.h>
void main()
{
int a, *b, **c; // mendeklarasikanvariabel pointer
a = 1000; // memberikannilai a samadengan 1000
b = &a; // dengan statement inivariabel pointer sekarangmenunjukkealamatvariabel
a
c = &b; // dengan statement inivariabel pointer
sekarangmenunjukkealamatvariabel a
cout<< *b;// menampilkanisidarivariabel pointer bberupaalamat
cout<<endl; // gantibarisbaru
cout<< **c; // menampilkanisidarivariabel pointer c

Modul Algoritma Lanjut | 45


}

Hasil dari program diatas adalah :

1000

1000

Dari program diatas dapat disimpulkan bahwa dengan menggunakan pointer ke

pointer, isi dari pointer yang terakhir merupakan alamat memori dari variabel

pointer sesungguhnya.Pada contoh diatas, variabel b yang menunjuk kevariabel

a ditunjuk kembalioleh variabel c sehingga nilai dari variabel c sebenarnya sama

dengan variabel b danvariabel a.

h. Latihan Soal

Jawablah latihan soal di bawah ini

1. Buatlah program transpose matrik menggunakan pointer dengan output :

2. Buatlah program/transpose matriks ordo 3x3 menggunakan pointer dengan

output :

Modul Algoritma Lanjut | 46


10. Single Linked List

a. Dasar Teori

Linked List merupakan suatu bentuk struktur data yang berisi kumpulan data

yang disebut sebagai node yang tersusun secara sekuensial, saling sambung

menyambung, dinamis, dan terbatas. Linked List sering disebut sebagai senarai

berantai. Untuk menghubungkan satu node dengan node lainnya maka Linked List

menggunakan pointer sebagai penunjuk node selanjutnya. Node sendiri merupakan

sebuah struct yang menempati suatu lokasi memori secara dinamis yang terdiri dari

beberapa field, minimal 2 buah field yaitu field untuk isi dari struct datanya sendiri,

dan 1 field arbitari bertipe pointer sebagai penunjuk node selanjutnya. Array dan

Linked List memiliki perbedaan sebagai berikut :

Salah satu tipe Linked List yang sederhana yaitu Single Linked List. Single

Linked List merupakan Linked List yang memiliki hanya satu pointer penunjuk

dengan arah datahanya satu arah juga. Single Linked List memiliki 2 macam bentuk

Modul Algoritma Lanjut | 47


yaitu Non Circular dan Circular. Non Circular Linked List merupakan Linked List di

mana antara kepala dan node terakhir tidak memiliki hubungan. Pada Linked List ini

maka pointer terakhir selalumenunjuk NULL sebagai pertanda data terakhir dalam

list-nya. Single Linked List Non Circular dapat digambarkan sebagai gerbong kereta

api seperti berikut ini :

Langkah membuat dan operasi pada sebuah Linked List adalah sebagai berikut :

1. Mendeklarasikan struct node

2. Membuat node head

3. Menginisialisasi node head

4. Menambah node baru baik di depan maupun di belakang

5. Menghapus node

Linked List banyak dimanfaatkan pada pemrograman kecerdasan buatan, fuzzy,

maze solving, dan sebagainya.

b. Prosedur Percobaan

Kompile program berikut ini dan amati outputnya pada layar Anda. Perhatikan

baik-baik pemanggilan dan penggunaan fungsi-fungsi serta prosedurnya agar dapat

mengerjakan tugas yang diberikan.

Contoh Program:

#include <iostream>
using namespace std;
class LinkList{
private:

Modul Algoritma Lanjut | 48


struct node{
int data;
node *next;
};
node *head;
public:
LinkList();
void insertData(int num);
void deleteData (int num);
void displayData();
int count();
~LinkList();
};
LinkList::LinkList()
{
head=NULL;
}
void LinkList::insertData(int num)
{
node *temp;
node *t;
if( head == NULL)
{
head = new node;
head->data = num;
head->next = NULL;
}
else
{
temp = head;
while(temp->next != NULL)
{
temp = temp->next;
}
t = new node;
t->data = num;
t->next = NULL;
temp->next = t;
}
}

Modul Algoritma Lanjut | 49


void LinkList::deleteData(int num)
{
node *q, *r;
q= head;
if(q->data == num)
{
head = q->next;
delete q;
return;
}
r = q;
while(q!= NULL)
{
if(q->data == num )
{
r->next = q->next;
delete q;
return;
}
r = q;
q = q->next;
}
cout << ” Nilai ” << num << “tidak ditemukan”;
}
void LinkList::displayData()
{
node *q;
for(q=head; q != NULL; q=q->next)
{
cout<<q->data<<endl;
}
}
int LinkList::count()
{
node *q;
int c=0;
for( q=head ; q != NULL ; q = q->next )
c++;
return c;
}

Modul Algoritma Lanjut | 50


LinkList::~LinkList()
{
node *q;
if(head == NULL)
{
return;
}
while(head != NULL)
{
q = head->next;
delete head;
head = q;
}
}
int main()
{ LinkList list;
int temp;
int pilihan;
while(1)
{
cout<<”Link List Single”<<endl;
cout<<”1.Insert / Creation”<<endl;
cout<<”2.Delete Element”<<endl;
cout<<”3.View Element”<<endl;
cout<<”4.Count Element”<<endl;
cout<<”5.Exit”<<endl;
cout<<”Enter your choice:”;
cin>>pilihan;
switch(pilihan)
{ cout<<endl;
case 1:
cout<<”Insert Element Data”;
cin>>temp;
list.insertData(temp);
break;
case 2:
cout<<”Delete Element :”;
cin>>temp;
list.deleteData(temp);
break;

Modul Algoritma Lanjut | 51


case 3:
list.displayData();
break;
case 4:
cout<<”Number Total Element at List : “<<list.count()<<endl;
break;
case 5:
return 0;
}
}
}

Contoh Kedua:

/*
sllnc
*/
//lib
#include <stdio.h>
#include <conio.h>
//global var/const
typedef struct TNode{
int data;
TNode *next;
};
TNode *head; //head node
//proto func/proc
void initHead();
int isEmpty();
void insertDepan(int databaru);
void insertBelakang (int databaru);
void tampilList();
void hapusDepan();
void hapusBelakang();
void clearList();
//detil func/proc
//init head
void initHead()
{
head = NULL; //NULL <> null!!!

Modul Algoritma Lanjut | 52


}
3
//cek list kosong atau tdk
int isEmpty()
{
return (head == NULL) ? 1:0;
}
//tambah data di depan
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 baru telah dimasukkan di depan\n");
}
//tambah data di belakang
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
{

Modul Algoritma Lanjut | 53


bantu=head;
while(bantu->next!=NULL)
{
bantu=bantu->next;
}
bantu->next = baru;
}
printf("Data baru telah dimasukkan di belakang\n");
}
//menampilkan list
void tampilList()
{
TNode *bantu;
bantu = head;
if(isEmpty()==0)
{
while(bantu!=NULL)
{
printf("%d\t",bantu->data);
bantu=bantu->next;
}
printf("\n");
}
else
printf("Masih kosong\n");
}
//hapus data terdepan
void hapusDepan()
{
4
TNode *hapus;
int d;
if (isEmpty()==0)
{
if(head->next != NULL)
{
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;

Modul Algoritma Lanjut | 54


}
else
{
d = head->data;
head = NULL;
}
printf("%d terhapus\n",d);
}
else
printf("Masih kosong\n");
}
//hapus data terakhir
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");
}
//clear semua node

Modul Algoritma Lanjut | 55


void clearList()
{
TNode *bantu,*hapus;
bantu = head;
while(bantu!=NULL)
{
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}
//main prog
int main()
{
printf("single linked list non circular\n1. inisialisasi head ... \t");
initHead();
printf("done\ntampilkan isi list :\n");
tampilList() ;
5
//entry data di depan
printf("\nentri data di depan list\n");
int data_baru;
for(int i=1;i<=5;i++)
{
printf("masukkan data ke-%d : ",i);
scanf("%d",&data_baru);
insertDepan(data_baru);
}
printf("tampilkan isi list :\n");
tampilList() ;
//entry data di belakang
printf("\nentri data di belakang list\n");
for(int i=1;i<=5;i++)
{
printf("masukkan data ke-%d : ",i);
scanf("%d",&data_baru);
insertBelakang(data_baru);
}
printf("tampilkan isi list :\n");

Modul Algoritma Lanjut | 56


tampilList() ;
//hapus data di depan
printf("\nhapus 2 data terdepan\n");
for(int i=1;i<=2;i++)
{
hapusDepan();
}
printf("tampilkan isi list :\n");
tampilList() ;
//hapus data di belakang
printf("\nhapus 2 data terakhir\n");
for(int i=1;i<=2;i++)
{
hapusBelakang();
}
printf("tampilkan isi list :\n");
tampilList();
//clear smua list
printf("\nhapus semua node\n");
clearList();
printf("tampilkan isi list :\n");
tampilList();
getch();
return 0;
}

c. Soal Latihan

1. Apakah kegunaan dari fungsi delete pada program sebelumnya? Berada pada
headerapakah fungsi delete?
2. Buatlah program menggunakan Single Linked List Non Circular untuk
menyimpanNama dan NIM data mahasiswa berikut ini :
Nama NIM
Dede Fahri 12347867
Kiki Fatmala 98765674
Yuki 67453279

11. Single Linked List Circular

Modul Algoritma Lanjut | 57


a. Definisi Single Linked List Circular

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:

Node : rangkaian beberapa simpul

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

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

c. Deklarasi:

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 berserta alokasi memorinya.

TNode *baru;

baru = new TNode;

baru->data = databaru;

baru->next = baru;

Modul Algoritma Lanjut | 58


Dibutuhkan satu buah variabel pointer: head. Head akan selalu menunjuk

pada node pertama.

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.

d. HEAD Single Linked List Circular

Penambahan data di depan

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

Modul Algoritma Lanjut | 59


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 = 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“);
}

e. Operasi Penghapusan

Penghapusan node dilakukan dengan memutus rantai node kemudian

menghapus node. Jika node berada di tengah rangkaian, rangkaian yang terputus

perlu disambung kembali. Untuk memudahkan penghapusan simpul dibutuhkan

dua cursor sebagai simpul bantu. Selain cursor juga dibutuhkan simpul head

sebagai acuan awal simpul dalam rangkaian.

Berikut langkah langkah untuk menghapus simpul dalam rangkaian:

 Buat cursor bantu yang menunjuk ke awal node(simpul).

Modul Algoritma Lanjut | 60


 Pindahkan cursor ke node berikutnya

 Putus sambungan awal node dengan node berikutnya.

 Hapus rangkaian

 Jika berada di akhir rangkaian, putuskan dari rangkaian sebelumnya

 Jika di tengah rangkaian, pindahkan penunjukan node berikutnya, atau di

akhir, atau setelah node yang akan dihapus

Ilustrasi Hapus Depan

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

Ilustrasi Hapus Belakang

void hapusBelakang(){
TNode *hapus,*bantu;
if (isEmpty()==0){
int d;
hapus = head;
if(head->next == head){
head = NULL;

Modul Algoritma Lanjut | 61


}else{
bantu = head;
while(bantu->next->next != head){
bantu = bantu->next;
}
hapus = bantu->next;
d = bantu->data;
bantu->next = head;
delete hapus;
}
printf(“%d terhapus\n“,d);
} else printf(”Masih kosong\n“);
}

f. Contoh Program Single Linked List Circular

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <alloc.h>

int pil;
void pilih();
void buat_baru();
void tambah_belakang();
void tambah_depan();
void hapus_belakang();
void hapus_depan();
void tampil();

struct simpul
{
char nim[8], nama [20];
int umur;
struct simpul *next;
} mhs, *baru, *awal=NULL, *akhir=NULL,*hapus,*bantu;

int main()
{
do

Modul Algoritma Lanjut | 62


{
clrscr();
cout<<"MENU SINGLE LINKEDLIST"<<endl;
cout<<"1. Tambah Depan"<<endl;
cout<<"2. Tambah Belakang"<<endl;
cout<<"3. Hapus Depan"<<endl;
cout<<"4. Hapus Belakang"<<endl;
cout<<"5. Tampilkan"<<endl;
cout<<"6. Selesai"<<endl;
cout<<"Pilihan Anda : ";
cin>>pil;
pilih();
} while(pil!=6);
return 0;
}

void pilih()
{
if(pil==1)
tambah_depan();
else if(pil==2)
tambah_belakang();
else if(pil==3)
hapus_depan();
else if(pil==4)
hapus_belakang();
else if(pil==5)
tampil();
else
cout<<"selesai";
}

void buat_baru()
{
baru=(simpul*)malloc(sizeof(struct simpul));
cout<<"input nim : ";cin>>baru->nim;
cout<<"input nama : ";cin>>baru->nama;
cout<<"input umur : ";cin>>baru->umur;
baru->next=NULL;
}

Modul Algoritma Lanjut | 63


void tambah_belakang()
{
buat_baru();
if(awal==NULL)
{
awal=baru;
}
else
{
akhir->next=baru;
}
akhir=baru;
akhir->next=NULL;
cout<<endl<<endl;
tampil();
}

void tambah_depan()
{
buat_baru();
if(awal==NULL)
{
awal=baru;
akhir=baru;
akhir->next=NULL;
}
else
{
baru->next=awal;
awal=baru;
}
cout<<endl<<endl;
tampil();
}

void hapus_depan()
{
if (awal==NULL)
cout<<"Kosong";

Modul Algoritma Lanjut | 64


else
{
hapus=awal;
awal=awal->next;
free(hapus);
}
cout<<endl<<endl;
tampil();
}

void hapus_belakang()
{
if (awal==NULL)
cout<<"Kosong";
else if(awal==akhir)
{
hapus=awal;
awal=awal->next;
free(hapus);
}
else
{
hapus=awal;
while(hapus->next!=akhir)
hapus=hapus->next;
akhir=hapus;
hapus=akhir->next;
akhir->next=NULL;
free(hapus);
}
cout<<endl<<endl;
tampil();
}

void tampil()
{
if (awal==NULL)
cout<<"Kosong";
else
{

Modul Algoritma Lanjut | 65


bantu=awal;
while(bantu!=NULL)
{
cout<<"nim : "<<bantu->nim;
cout<<" nama : "<<bantu->nama;
cout<<" umur : "<<bantu->umur<<endl;
bantu=bantu->next;
}
}
getch();
}

g. Latihan

Buatlah program Single linked list circular dengan menggunakan head,

namun head yang ada tidak digunakan untuk menyimpan data, melainkan

untuk menyimpan jumlah seluruh elemen dalam linked list.

1. Buatlah fungsi lengkap untuk tambah, hapus, lihat, dan edit!

2. Buatlah pula function untuk menampilkan data list secara terbalik!

12. Double Linked List

a. Definisi

Double Linked List (DLL) adalah suatu cara pengolahan data yang bekerja

dengan record dalam jumlah besar, sehingga membutuhkan alokasi memori dinamis

yang besar pula. DLL biasanya digunakan pada saat alokasi memori konvensional

tidak lagi bisa diandalkan. Sedangkan bekerja dengan data yang besar tidak dapat

dihindari lagi, karena tidak jarang pula, data besar tersebut memiliki hubungan yang

erat. Di dalam DLL tidak hanya sekadar menampilkan setiap record-nya, melainkan

dapat pula menambahkan record, menghapus beberapa record sesuai keinginan

Modul Algoritma Lanjut | 66


pengguna, sampai mengurutkan record. Kondisi tersebut memungkinkan dimilikinya

satu rantai data yang panjang dan saling berhubungan.

Pada Double Linked List, setiap node memiliki dua buah pointer ke sebelah kiri

(prev) dan ke sebelah kanan (next). Gambar 1 memperlihatkan sebuah node dari

Double Linked List.Bertambah lagi komponen yang akan digunakan. Apabila dalam

Single Linked List hanya memiliki head, curr dan node, maka untuk Double Linked

List, ada satu penunjuk yang berfungsi sebagai akhir dari list: tail. Bagian kiri dari

head akan menunjuk ke NULL. Demikian pula dengan bagian kanan dari tail. Setiap

node saling terhubung dengan pointer kanan dan kiri. Gambar 2 memperlihatkan

contoh Double Linked List.

b. Abstraksi Tipe Data Doubly Linked List

Abstraksi tipe data Double Linked List sedikit berbeda dengan Single Linked

List, yaitu tinggal menambahkan pointer prev dan harus diawali dengan pembuatan

struct tnode.

Kemudian, mendeklarasikan beberapa node yang akan digunakan sebagai

head, tail, node aktif (curr) dan node sementara (node) seperti berikut:

Sama seperti pada pembuatan Single Linked List, dalam pembuatan Double

Linked List ini, akan membuat sebuah perulangan sebanyak 5 kali untuk mengisikan

nilai 0 sampai 4 ke dalam field x untuk masing-masing node. Secara umum, kode

yang dibuat hampir sama dengan pembuatan Single Linked List. Hanya bedanya,

pada Double Linked List, pointer kiri dan kanan dihubungkan dengan suatu node.

Pertama-tama, tentunya perlu diuji apakah head bernilai NULL yang artinya

belum ada satu node pun yang tercipta. Apabila demikian, maka node yang dibuat

akan menjadi head. Node aktif (curr) pun diset sesuai node yang dibuat. Dan

sebagai konsekuensi dari Double Linked List, maka diatur pointer prev pada head

menunjuk ke NULL. Untuk menguji keberhasilan Double Linked List, awal list sampai

akhir list akan dicetak dengan deklarasi: Dan karena apa yang dibentuk adalah

Double Linked List, maka juga mencetak dari tail sampai head, dengan deklarasi:

Modul Algoritma Lanjut | 67


Untuk membebaskan memori teralokasi, dilakukan dengan pemanggilan fungsi

free(). Kode selengkapnya:

Operasi pada linked list tidak hanya pembuatan dan pencetakan. Suatu saat,

mungkin perlu untuk menghapus node yang terletak di tengah-tengah list. Atau

bahkan mungkin perlu menyelipkan node di tengah-tengah node.

13. Double Linked List Circular (DLCC)

a. Definisi Linked List Circular

Sebenarnya tidak jauh berbeda dengan Double Linked List Non Circular,

hanya saja Double Linked List Circular ini atau yang sering

disingkat DLLC memiliki perbedaan yang terletak pada nodenya itu sendiri.

Setiap head dan tail node pada DLLNC selalu bernilai NULL, lain halnya

dengan DLLC, tail pada node harus merujuk kembali kepada headnya. Agar

tidak bingung, lebih lengkapnya saya akan jelaskan dibawah ini.

b. DLLC dengan Head

Sebelumnya kita harus mendeklarasikan dulu pointer head :

TNode *head;

Setelah kita mendeklarasikan pointer head, kita belum bisa secara

langsung mendeklarasikan node yang dituju. Sehingga pointer head harus

dibuat bernilai null terlebih dahulu :

head = NULL;

Untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat

mengetahuinya dengan mengecek nilai dari pointer Head-nya.

int isEmpty() {

if(head==NULL) return 1;

else return 0;

Modul Algoritma Lanjut | 68


Contoh penggunaanya :

1. Penambahan di depan
void tambahdata (int databaru){
TNode *baru,*bantu;
//pointer bantu digunakan untuk menunjuk node terakhir (head->prev)
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;
}
printf(”data masuk”);
}

2. Penambahan di belakang

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

Modul Algoritma Lanjut | 69


else {
bantu=head->prev;
bantu->next = baru;
baru->prev = bantu;
baru->next = head;
head->prev = baru;
}
printf(”data masuk”);
}

3. Tampil

void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
do{
printf(“%i ”,Bantu->data);
bantu=bantu->next;
}while(bantu!=head);
printf(“\n”);
} else printf(“masih Kosong”);cout<<"Masih kosong\n"; }

4. Hapus di depan
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;

Modul Algoritma Lanjut | 70


}
printf(“%i terhapus”,d);
} else printf(“Masih kosong\n”);
}

5. Hapus di belakang
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;
d = hapus->data;
bantu->next = head;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(“%i terhapus\n”,d);
} else printf(“Masih Kosong”);
}

c. DLLC dengan Head dan Tail

Sebelumnya kita harus mendeklarasikan dulu pointer head :

TNode *head, *tail;

Setelah kita mendeklarasikan pointer head, kita belum bisa secara

langsung mendeklarasikan node yang dituju. Sehingga pointer head harus

dibuat bernilai null terlebih dahulu :

head = NULL;

tail = NULL;

Modul Algoritma Lanjut | 71


Untuk mengetahui apakah suatu Linked List kosong atau tidak, kita

dapat mengetahuinya dengan mengecek nilai dari pointer Head-nya.

int isEmpty() {

if(tail==NULL) return 1;

else return 0;

Contoh penggunaanya :

1. Penambahan di depan

void tambahdata (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=head;
head->prev=head;
tail->next=tail;
tail->prev=tail;
}
else {
baru->next=head;
head->prev=baru;
head=baru;
head->prev=tail;
tail->next=head;
}
printf(”data masuk”);
}
Ilustrasi

Modul Algoritma Lanjut | 72


2. Penambahan di belakang

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;
}
printf(“Data masuk\n”);
}

3. Tampil

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

Modul Algoritma Lanjut | 73


4. Hapus di depan

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;
}
printf(“%i terhapus\n”,d);
} else printf(“Masih Kosong”);
}

5. Hapus di belakang

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;

Modul Algoritma Lanjut | 74


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

d. Contoh Program Double Linked List Circular

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <alloc.h>

int pil;
void pilih();
void buat_baru();
void tambah_belakang();
void tambah_depan();
void hapus_belakang();
void hapus_depan();
void tampil();

struct simpul
{
char nim[8], nama [20];
int umur;
struct simpul *kiri, *kanan;
} mhs, *baru, *awal=NULL, *akhir=NULL,*hapus,*bantu;

int main()
{
do
{
clrscr();
cout<<"MENU DOUBLE LINKEDLIST"<<endl;
cout<<"1. Tambah Depan"<<endl;

Modul Algoritma Lanjut | 75


cout<<"2. Tambah Belakang"<<endl;
cout<<"3. Hapus Depan"<<endl;
cout<<"4. Hapus Belakang"<<endl;
cout<<"5. Tampilkan"<<endl;
cout<<"6. Selesai"<<endl;
cout<<"Pilihan Anda : ";
cin>>pil;
pilih();
} while(pil!=6);
return 0;
}

void pilih()
{
if(pil==1)
tambah_depan();
else if(pil==2)
tambah_belakang();
else if(pil==3)
hapus_depan();
else if(pil==4)
hapus_belakang();
else if(pil==5)
tampil();
else
cout<<"selesai";
}

void buat_baru()
{
baru=(simpul*)malloc(sizeof(struct simpul));
cout<<"input nim : ";cin>>baru->nim;
cout<<"input nama : ";cin>>baru->nama;
cout<<"input umur : ";cin>>baru->umur;
baru->kiri=NULL;
baru->kanan=NULL;
}

void tambah_belakang()
{

Modul Algoritma Lanjut | 76


buat_baru();
if(awal==NULL)
{
awal=baru;
akhir=baru;
}
else
{
akhir->kanan=baru;
baru->kiri=akhir;
akhir=baru;
}
cout<<endl<<endl;
tampil();
}

void tambah_depan()
{
buat_baru();
if(awal==NULL)
{
awal=baru;
akhir=baru;
}
else
{
baru->kanan=awal;
awal->kiri=baru;
awal=baru;
}
cout<<endl<<endl;
tampil();
}

void hapus_depan()
{
if (awal==NULL)
cout<<"Kosong";
else if (awal->kanan==NULL)
{

Modul Algoritma Lanjut | 77


hapus=awal;
awal=NULL;
akhir=NULL;
free(hapus);
}
else
{
hapus=awal;
awal=hapus->kanan;
awal->kiri=NULL;
free(hapus);
}
cout<<endl<<endl;
tampil();
}

void hapus_belakang()
{
if (awal==NULL)
cout<<"Kosong";
else if (awal->kanan==NULL)
{
hapus=awal;
awal=NULL;
akhir=NULL;
free(hapus);
}
else
{
hapus=akhir;
akhir=hapus->kiri;
akhir->kanan=NULL;
free(hapus);
}
cout<<endl<<endl;
tampil();
}

void tampil()
{

Modul Algoritma Lanjut | 78


if (awal==NULL)
cout<<"Kosong";
else
{
bantu=awal;
while(bantu!=NULL)
{
cout<<"nim : "<<bantu->nim;
cout<<" nama : "<<bantu->nama;
cout<<" umur : "<<bantu->umur<<endl;
bantu=bantu->kanan;
}
}
getch();
}

Contoh kedua

#include <conio.h>
#include <stdio.h>

struct TNode{
char data[30];
TNode *next;
TNode *prev;
};

TNode *head, *tail;


void init(void);
int isEmpty(void);
void insertDepan(char databaru[30]);
void insertBelakang (char databaru[30]);
void inserttengah(char databaru[30], int pilihdepan, int pilihbelakang);
void tampil(void);
void hapusDepan(void);
void hapusBelakang(void);
void deletetengah(int pilih);
void clear(void);
int cari(char elemen[30]);

Modul Algoritma Lanjut | 79


main()
{
////////////////////////////////
char pilih;
char elm[30];
int depan,belakang;
init();
do
{
printf("\n");
printf("\t\t===================================\n");
printf("\t\t|| CONTOH PROGRAM ||\n");
printf("\t\t|| DOUBLE LINK LIST CIRCULAR ||\n");
printf("\t\t===================================\n");
printf(" \t\tMENU PILIHAN : \n");
printf("\t\t===================================\n");
printf("\t\t[1] MASUKKAN DATA DARI DEPAN\n");
printf("\t\t[2] MASUKKAN DATA DARI BELAKANG\n");
printf("\t\t[3] MASUKKAN DATA DI TENGAH\n");
printf("\t\t[4] TAMPILKAN DATA\n");
printf("\t\t[5] HAPUS DATA PALING DEPAN\n");
printf("\t\t[6] HAPUS DATA PALING BELAKANG\n");
printf("\t\t[7] HAPUS DATA DI TENGAH\n");
printf("\t\t[8] HAPUS SEMUA DATA\n");
printf("\t\t[9] CARI DATA\n");
printf("\t\t[0] KELUAR\n");
printf("\t\t===================================\n\n");
printf("\t\t===================================\n\n");
printf("\n");
printf("\t\t->->PILIHAN ANDA : ");
scanf("%s",&pilih);

switch(pilih)
{
case '1':clrscr();
tampil();
printf("\n");
printf(" \t\tMASUKKAN DATA DARI DEPAN\n");
printf("\t\t----------------------------\n");
printf("\t\t:: MASUKKAN DATA : ");

Modul Algoritma Lanjut | 80


scanf("%s",&elm);
insertDepan(elm);
getch();
clrscr();
break;
case '2':clrscr();
tampil();
printf("\n");
printf(" \t\tMASUKKAN DATA BELAKANG\n");
printf("\t\t----------------------------\n");
printf("\t\t:: MASUKKAN DATA : ");
scanf("%s",&elm);
insertBelakang(elm);
clrscr();
break;
case '3':clrscr();
tampil();
printf("\n");
printf(" \t\tMASUKKAN DATA DARI TENGAH\n");
printf("\t\t----------------------------\n");
printf("\t\t:: MASUKKAN DATA : ");
scanf("%s",&elm);
printf("\t\t:: DATA DEPAN : ");
scanf("%i",&depan);
printf("\t\t:: DATA BELAKANG : ");
scanf("%i",&belakang);
inserttengah(elm,depan,belakang);
getch();
clrscr();
break;
case '4':clrscr();
tampil();
printf("\t\t-------------\n\n");
printf("\t\tPress Enter to Continue..");
getch();
clrscr();
break;
case '5':clrscr();
tampil();
hapusDepan();

Modul Algoritma Lanjut | 81


printf("\n");
printf("\t\t-------------\n");
printf("\t\tPress Enter to Continue..");
getch();
clrscr();
break;
case '6':clrscr();
tampil();
hapusBelakang();
printf("\n");
printf("\t\t-------------\n");
printf("\t\tPress Enter to Continue..");
getch();
clrscr();
break;
case '7':clrscr();
tampil();
printf("\n");
printf(" \t\tMENGHAPUS DATA DARI TENGAH\n");
printf("\t\t----------------------------\n");
printf("\t\t:: DATA NO : ");
scanf("%i",&depan);
deletetengah(depan);
getch();
clrscr();
break;
case '8':clrscr();
clear();
printf("\t\tDATA TELAH DIHAPUS SEMUA\n");
printf("\t\t-------------\n");
printf("\t\tPress Enter to Continue..");
getch();
clrscr();
break;

case '9':clrscr();
printf("\n");
printf(" \t\t MASUKKAN DATA YANG DICARI\n");
printf("\t\t----------------------------\n");
printf("\t\t:: MASUKKAN DATA : ");

Modul Algoritma Lanjut | 82


scanf("%s",&elm);
if(cari(elm)==1){
printf("\n\t\tdata success ditemukan");
}else{
printf("\n\t\tMaaf data tidak ditemukan");
}
getch();
clrscr();
break;

case '0': break;


getch();
clrscr();
default:printf("\t\tSalah pilih...\n");
break;
}

}while(pilih!='0');
}

/////////////////////////////////

void init(void){
head = NULL;
tail = NULL;
}

/////////////////////////////////

int isEmpty(void){
if(tail == NULL) return 1;
else return 0;
}

//////////////////////////////////

void insertDepan(char databaru[30]){


TNode *baru;
int i;
baru = new TNode;

Modul Algoritma Lanjut | 83


for(i=0;i<=30;i++){
baru->data[i] = databaru[i];
}
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 {
baru->next = head;
head->prev = baru;
head = baru;
head->prev = tail;
tail->next = head;
}
printf("\n\t\t\Data masuk\n");
printf("\t\tPress Enter to Continue..");
}

////////////////////////////////////////////////////

void insertBelakang (char databaru[30]){


TNode *baru,*bantu;
int i;
baru = new TNode;
for(i=0;i<=30;i++){
baru->data[i] = databaru[i];
}
baru->next = baru;
baru->prev = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next = head;
head->prev = head;

Modul Algoritma Lanjut | 84


tail->next = tail;
tail->prev = tail;
}
else {
tail->next = baru;
baru->prev = tail;
tail = baru;
tail->next = head;
head->prev = tail;
}
printf("\t\tData masuk\n");
printf("\t\tPress Enter to Continue..");
}
//////////////////////////////////////////////

void tampil(void){
int i=0;
if(isEmpty()==0){
do{
i++;
printf("\t\t%i. %s\n",i,head->data);
printf("\t\t===================\n");
head=head->next;
}while(head!=tail->next);
printf("\n");
} else printf("\t\t\t..Masih kosong..\n\n");
}
//////////////////////////////////////////////
void hapusDepan(void){
TNode *hapus;
char d[30];
int i;
if (isEmpty()==0){
if(head != tail){
hapus = head;
for (i=0;i<=30;i++){
d[i] = hapus->data[i];
}
head = head->next;
tail->next = head;

Modul Algoritma Lanjut | 85


head->prev = tail;
delete hapus;
} else {
for (i=0;i<=30;i++){
d[i] = head->data[i];
}
head = NULL;
tail = NULL;
}
printf("\t\t%s terhapus\n",d);
} else printf("\t\tMasih kosong\n");
}

//////////////////////////////////////////

void hapusBelakang(void){
TNode *hapus;
char d[30];
int i;
if (isEmpty()==0){
if(head != tail){
hapus = tail;
for (i=0;i<=30;i++){
d[i] = hapus->data[i];
}
tail = tail->prev;
tail->next = head;
head->prev = tail;
delete hapus;
} else {
for (i=0;i<=30;i++){
d[i] = head->data[i];
}
head = NULL;
tail = NULL;
}
printf("\t\t%s terhapus\n",d);
} else printf("\t\tMasih kosong\n");
}

Modul Algoritma Lanjut | 86


//////////////////////////////////////////

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

//////////////////////////////////////
int cari(char elemen[30]){
int i=0;
int status=0;
if(isEmpty()==0){
do{
i++;
if(head->data[i]==elemen[i]){
status=1;
}else head=head->next;
}while(head!=tail->next && i<=30);
return(status);
} else printf("\t\tMasih kosong\n");
}
/////////////////////////////////////
void inserttengah(char databaru[30], int pilihdepan, int pilihbelakang){
TNode *baru,*bantu,*depan,*belakang;
char elemen[30];
int i;
int j;
baru = new TNode;
for(i=0;i<=30;i++){
baru->data[i] = databaru[i];
}

Modul Algoritma Lanjut | 87


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{
depan = head;
belakang = head;
for(i=1;i<pilihdepan;i++){
depan=depan->next;
}
for(i=1;i<pilihbelakang;i++){
belakang=belakang->next;
}
depan->next = baru;
baru->prev = depan;
baru->next = belakang;
belakang->prev = baru;
}
printf("\t\tData masuk\n");
printf("\t\tPress Enter to Continue..");
}
////////////////////////////////////////////////////////
void deletetengah(int pilih){
TNode *hapusdepan,*hapusbelakang,*hapustengah;
char d[30];
int i,j;
if (isEmpty()==0){
if(head != tail){
hapusdepan = head;
hapusbelakang = head;
hapustengah = head;
for(i=1;i<pilih;i++){
hapusdepan=hapusdepan->next;
}
for(i=1;i<(pilih+2);i++){

Modul Algoritma Lanjut | 88


hapusbelakang=hapusbelakang->next;
}
for(i=1;i<=pilih;i++){
hapustengah=hapustengah->next;
}
for(j=1;j<pilih;j++){
for (i=0;i<=30;i++){
d[i] = hapustengah->data[i];
}
hapustengah = hapustengah->next;
}
delete hapustengah;
hapusdepan->next = hapusbelakang;
hapusbelakang->prev=hapusdepan;
} else {
for (i=0;i<=30;i++){
d[i] = hapustengah->data[i];
}
head = NULL;
tail = NULL;
}
printf("\t\t%s Success terhapus\n",d);
} else printf("\t\tMasih kosong\n");
}

e. Latihan

Buatlah program double linked list circular dengan menggunakan head, namun

head yang ada tidak digunakan untuk menyimpan data, 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!

Modul Algoritma Lanjut | 89


DAFTAR PUSTAKA

http://partaihumor.wordpress.com/2009/03/09/struct/

http://achmadyasid.files.wordpress.com

http://blog.um.ac.id/arikaps/category/komputer/

http://ridoxd.blogspot.com/2010/01/belajar-struct-borhlan-c.html

http://repository.binus.ac.id/content/t0616/t061635668.ppt

http://shirotholmustaqim.files.wordpress.com/2010/02/modul-c-revisi.pdf

http://jeykuki.blogspot.com/2010/10/fungsi-dasar-cstream-file.html

http://fernando-emergency.blogspot.com/2012/06/mengenal-filestream-di-c.html

http://roytravis182.blogspot.com/2012/05/cara-membuat-matriks-pada-c.html

http://kur2003.if.itb.ac.id/file/adtmatri.pdf

http://riskafanny.blogspot.com/2012/07/single-linked-list-circular.html

http://riskafanny.blogspot.com/2012/07/double-linkedlist-circular.html

http://tif.uad.ac.id/new_forum/index.php?action=printpage;topic=508.0

http://khairuddinuad.wordpress.com/2010/10/06/script-double-link-list-circular-pada-c/

http://saniya0329.blogspot.com/2011/12/contoh-program-double-linked-list.html

http://saniya0329.blogspot.com/2011/12/contoh-program-single-linked-list.html

http://dededruffy.wordpress.com/2009/06/15/linked-listpointer-dan-contoh-program-

sort/

http://www.kelasinformatika.com/2012/07/double-linked-list-circular-di-c.html

Modul Algoritma Lanjut | 90

Anda mungkin juga menyukai