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
dasar dari bahasa pemrograman C++ yang merupakan salah satu bahasa
aplikasi mulai dari aplikasi yang sederhana hingga yang sudah kompleks.
B. Kompetensi Dasar
Pointer, Nested Structure, File stream, Sorting, Searching, dan Linked List dalam
D. Materi Belajar
1. Function
a. Definisi Function
Syntax :
blok pernyataan ;
Atau
blok_pernyataan;
};
dimana:
tipe : tipe data dari return value ( int, float, double, char, void, signed, unsigned,
long, short).
Contoh :
c. Prototipe Fungsi
Manfaat dari prototipe fungsi adalah untuk menjamin tipe argumen yang
fungsi yang seharusnya meminta tipe data int. Deklarasi Prototipe Fungsi :
atau
Contoh :
atau
1. Passing by Value :
dalam fungsi, tidak akan mempengaruhi nilai dari variabel tersebut dari
#include <iostream.h>
#include <conio.h>
void main()
clrscr();
cout << “Nilai Bil sebelum pemanggilan “ << “fungsi = “ << Bil << “\n”;
cout << “Nilai Bil setelah pemanggilan “<< “ fungsi = “ << Bil << “\n”;
getch(); }
cout << “Nilai Bil di dalam fungsi Tampil = “<< Bil << “\n”;
Bil++;
2. Passing by Reference :
Pada metode ini yang dikirimkan adalah alamat (reference atau pointer)
Jenis data yang dikirim sebagai argumen harus berupa variabel,tidak dapat
Syntax :
blok_pernyataan;
#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
Syntax :
atau
blok pernyataan ;
Contoh :
f. Return Value
ment) return. Setiap fungsi yang mempunyai tipe selain void harus
mempunyai tipe datanya void, maka fungsi tidak bisa menggunakan perintah
#include <iostream.h>
#include <conio.h>
void main()
{ // Deklarasi variabel
clrscr();
getch();
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
Function Overloading dapat diterapkan bila tiap fungsi mempunyai ciri khas fungsi
2. Jumlah argumen
#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;
h. Inline Function
Inline function disarankan dipakai pada fungsi yang sering dipanggil dan
Syntax :
blok_pernyataan;
return Nilai;
Contoh :
{ return ( Pj * Lb ); }
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
**
***
**
**
****
***
**
30
2. Rekursif
a. Definisi Rekursif
Rekursif adalah suatu proes dari fungsi yang memanggil dirinya secara
yang mengakhiri prosesnya. Jika tidak maka proses tidak akan pernah berhenti
Salah satu implementasi dari fungsi rekursif adalah pada masalah faktorial.
n! = 1, jika n = 0 atau n = 1
contoh penggunaan fungsri rekursif dalam program untuk masalah faktorial tersebut
#include <conio.h>
#include <iostream.h>
int main()
{
long n;
long 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:
(dalam contoh diatas nilai n yang dikirim adalah 5) yang maksudnya akan
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
f = 5 * faktorial(n-1);
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
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
10
2. Soal kedua masih sama dengan soal pertama tapi hasil outputnya
merupakan kebalikannya misal klo kita masukan nilai n nya sama dengan 10
10
3. Matriks
a. Definisi
berdasarkan dua buah indeks (yang biasanya dikonotasikan dengan baris dan
kolom). Setiap elemen matriks dapat diakses secara langung jika kedua indeks
misalnya integer. Matriks adalah struktur data dengan memori internal. Struktur ini
praktis untuk di pakai tetapi memakan memori, (matriks integer 100 x 100 memakan
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
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
#include<conio.h>
#include<iostream.h>
Void main ()
{
clrscr () ;
int a[5] = {2,3,4,5,6);
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
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-
Int j dan cout<<endl; program akan mengacu pada int j. Karena int j pada program
0.cout<<"a["<<j<<"]="<<a[j]<<"b["<<j<<"]="<<b[j]<<"c["<<j<<"]="<<c[j]<<endl;
Int matrik [4] [4]; merupakan variable matriks dimensi 2. Masing- masing mempunyai
array sebanyak 4.
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
sebanyak 4 kali. Pengulangan ini juga akan berpengaruh dalam angka yang akan di
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
cout<<"ini matrik ordo (4,4) 4 baris 4 kolom"; akan mengeluarkan ouput ini matrik
for (i=1; i<=4; i++). Merupakan bentuk pengulangan, jadi variabel I akan mengulang
for (j=1; j<=4; j++) ++). Merupakan bentuk pengulangan, jadi variabel j akan
pembentukan matrik 4 x 4
cout<<matrik [i] [j]<<" "; merupakan hasil dan output matrik 4x4 nanti.
Berikutoutputnya :
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
struct structure_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
} object_names;
yang terdapat didalam kurung { } merupakan daftar dari data member, dimana setiap
data member dilengkapi dengan tipe dan identifier yang sesuai dengan member
name-nya.
#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
b. Array of Struct
Array atau yang dalam Bahasa Indonesia disebut dengan larik merupakan
diakses dengan metode indeksing. Selain bentuk array berdimensi tunggal juga
array dengan identitas baris dan kolom yang dimiliki, misalnya a[3,5]. Contoh bentuk
Sementara itu bila elemen-elemen dari suatu array berbentuk sebuah struktur
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
c. Union
Union merupakan struktur data yang menyimpan satu atau lebih tipe data di
satu lokasi.
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;
Sementara union menyediakan satu lokasi tunggal yang dapat digunakan untuk
union value {
long int i_value;
float f_value;
}
d. Latihan
Ada sebuah system pengundian hadiah. Cara kerja system tersebut adalah sebagai
berikut:
didapatkannya.
structure yang lainnya atau Struktur yang salah satu anggotanya adalah struktur lain.
Contoh :
– 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;
};
#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();
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;
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
disimpan adalah NIP, Nama, alamat, tgl lahir, agama, telepon dan
menampilkannya kembali.
6. File Stream
File Stream Merupakan suatu fungsi khusus dalam pemrograman C++ yang
pada suatu alamat memori tertentu menggunakan array. Suatu stream yang
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.
#include"iostream.h"
#include"fstream.h"
int main()
ofstream tulis;
tulis.open("file1.txt");
if(tulis.fail())
return(1);
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.
besar.
angka kecil.
b. Metode Sorting
diantaranyanya adalah :
1. Bubble Sort
– Misalkan ada data-data sebagai berikut �5, 34, 32, 25, 75, 42, 22, 2
1. i = 0
3. j = N - 1
6. j = j – 1
7. i = i + 1
void BubbleSort()
int i, 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
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.
Implementasi secara non rekursif memerlukan dua buah tumpukan (stack) yang
prosedur ini menggunakan tumpukan yang bertipe record (struktur) yang terdiri
dari elemen kiri (untuk mencatat batas kiri) dan kanan (untukmencatat batas
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]
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)
{
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:
Metode seleksi melakukan pengurutan dengan cara mencari data yang terkecil
kemudian menukarkannya dengan data yang digunakan sebagai acuan atau sering
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
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
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
9 15 17 20 35
diambil data pertama dari T1 yaitu 3 dan data pertama dari T2 yaitu 9. Data ini
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.
3 9 11 12 15 17 20 23 31 35
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
[15]={8,1,45,2,5,2,9,6,12,7,8,6,10,11,44};
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
1. Pengurutan pada tabel acak (data tersusun secara acak), yaitu pencarian
2. Pengurutan pada tabel terurut (data tersusun secara terurut), yaitu pencarian
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;
9. Pointer
a. Pengertian Pointer
yang lainnya. Dengan menggunakan pointer banyak hal dapat dilakukan seperti
bab sebelumnya.
Suatu pointer bukan berisi dengan suatu nilai data seperti halnya pada variabel
Operator & bersifat unary (hanya memerlukan satu operand saja). Operator &
a.2 Operator *
b. Deklarasi Pointer
Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan
Bentuk Umum :
Tipe_data *nama_pointer;
#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
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
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.
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";
3. 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();}
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();
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
adalah :
*(*(pnilai + i) + j)
contoh untuk membuat array satu dimensi yang bertipe integer kita deklarasikan :
Berikut ini akan diberikan contoh program dengan menggunakan fungsi standar
#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;
}
g. Pointer ke Pointer
#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
1000
1000
pointer, isi dari pointer yang terakhir merupakan alamat memori dari variabel
h. Latihan Soal
output :
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
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
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
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
Langkah membuat dan operasi pada sebuah Linked List adalah sebagai berikut :
5. Menghapus node
b. Prosedur Percobaan
Kompile program berikut ini dan amati outputnya pada layar Anda. Perhatikan
Contoh Program:
#include <iostream>
using namespace std;
class LinkList{
private:
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!!!
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
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.
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:
int data;
TNode *next;
};
TNode *baru;
baru->data = databaru;
baru->next = baru;
paling depan, namun pada saat pertama kali (data masih kosong), maka
head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu
belakang, namun pada saat pertama kali data langsung ditunjuk pada head-nya.
e. Operasi Penghapusan
menghapus node. Jika node berada di tengah rangkaian, rangkaian yang terputus
dua cursor sebagai simpul bantu. Selain cursor juga dibutuhkan simpul head
Hapus rangkaian
void hapusBelakang(){
TNode *hapus,*bantu;
if (isEmpty()==0){
int d;
hapus = head;
if(head->next == head){
head = NULL;
#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
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;
}
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";
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
{
g. Latihan
namun head yang ada tidak digunakan untuk menyimpan data, melainkan
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
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
Abstraksi tipe data Double Linked List sedikit berbeda dengan Single Linked
List, yaitu tinggal menambahkan pointer prev dan harus diawali dengan pembuatan
struct tnode.
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:
Operasi pada linked list tidak hanya pembuatan dan pencetakan. Suatu saat,
mungkin perlu untuk menghapus node yang terletak di tengah-tengah list. Atau
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
TNode *head;
head = NULL;
Untuk mengetahui apakah suatu Linked List kosong atau tidak, kita dapat
int isEmpty() {
if(head==NULL) return 1;
else return 0;
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
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;
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”);
}
head = NULL;
tail = NULL;
int isEmpty() {
if(tail==NULL) return 1;
else return 0;
Contoh penggunaanya :
1. Penambahan di depan
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
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”);
}
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;
#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;
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()
{
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)
{
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()
{
Contoh kedua
#include <conio.h>
#include <stdio.h>
struct TNode{
char data[30];
TNode *next;
TNode *prev;
};
switch(pilih)
{
case '1':clrscr();
tampil();
printf("\n");
printf(" \t\tMASUKKAN DATA DARI DEPAN\n");
printf("\t\t----------------------------\n");
printf("\t\t:: MASUKKAN DATA : ");
case '9':clrscr();
printf("\n");
printf(" \t\t MASUKKAN DATA YANG DICARI\n");
printf("\t\t----------------------------\n");
printf("\t\t:: MASUKKAN DATA : ");
}while(pilih!='0');
}
/////////////////////////////////
void init(void){
head = NULL;
tail = NULL;
}
/////////////////////////////////
int isEmpty(void){
if(tail == NULL) return 1;
else return 0;
}
//////////////////////////////////
////////////////////////////////////////////////////
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;
//////////////////////////////////////////
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");
}
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];
}
e. Latihan
Buatlah program double linked list circular dengan menggunakan head, namun
head yang ada tidak digunakan untuk menyimpan data, melainkan untuk
terbalik!
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