MODUL 1
Pertemuan : I dan II
Judul Modul : Searching pada Array
Tujuan
:
Memahami beberapa metode searching pada array
Dapat membuat program aplikasi searching pada array
DASAR TEORI
Pengertian Searching
Sequential search adalah suatu teknik pencarian data dalam array (1 dimensi)
yang akan menelusuri semua elemen-elemen array dari awal sampai akhir
untuk array yang belum terurut.
Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di indeks
array terdepan (elemen array pertama) sehingga waktu yang dibutuhkan untuk
pencarian data sangat singkat (minimal).
Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak di
indeks array terakhir (elemen array terakhir) sehingga waktu yang dibutuhkan
untuk pencarian data sangat lama (maksimal).
1
10
2
6
3
-2
4
11
5
7
6
1
7
100
Indeks
Nilai
Kemudian program akan meminta data yang akan dicari, misalnya 1000. Jika ada,
maka akan ditampilkan tulisan ADA, sedangkan jika tidak ada maka akan
ditampilkan tulisan TIDAK ADA.
#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
Dari program diatas, terlihat bahwa dilakukan perulangan untuk mengakses semua
elemen array data satu per satu berdasarkan indeksnya.
Program menggunakan sebuah variabel flag yang berguna untuk menandai ada
atau tidaknya data yang dicari dalam array data. Hanya bernilai 0 atau 1.
Flag pertama kali diinisialiasasi dengan nilai 0.
Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka flag akan
tetap bernilai 0.
Semua elemen array data akan dibandingkan satu per satu dengan data yang dicari
dan diinputkan oleh user.
1
12
2
9
3
-4
4
21
5
6
Indeks
Nilai
Terdapat 6 buah data dalam array (dari indeks 0 s.d. 5) dan terdapat 1 indeks array
tambahan (indeks ke 6) yang belum berisi data (disebut sentinel)
Array pada indeks ke 6 berguna untuk menjaga agar indeks data berada pada
indeks 0 s.d. 5 saja. Bila pencarian data sudah mencapai array indeks yang ke-6
maka berarti data TIDAK ADA, sedangkan jika pencarian tidak mencapai indeks
ke-6, maka data ADA.
#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
Data yang ada harus diurutkan terlebih dahulu berdasarkan suatu urutan tertentu
yang dijadikan kunci pencarian.
Binary search adalah teknik pencarian data dalam array dengan cara membagi
data menjadi dua bagian setiap kali terjadi proses pengurutan.
Prinsip pencarian biner adalah:
Data diambil dari posisi 1 sampai posisi akhir N
Kemudian cari posisi data tengah dengan rumus
(posisi awal + posisi akhir) / 2
Kemudian data yang dicari dibandingkan dengan data yang di tengah,
apakah sama atau lebih kecil, atau lebih besar?
Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah
posisi tengah + 1
Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah
posisi tengah 1
Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari adalah 17
0
3
A
11
12
15
B
17
23
31
35
C
11
12
15
17
A
23
B
31
35
C
11
12
15
17
23
A=B=C
31
35
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
3. Interpolation Search
Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci tertentu.
Teknik searching ini dilakukan dengan perkiraan letak data.
Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku telepon,
misal yang berawalan dengan huruf T, maka kita tidak akan mencarinya dari awal
buku, tapi kita langsung membukanya pada 2/3 atau 3/4 dari tebal buku.
Jadi kita mencari data secara relatif terhadap jumlah data.
Rumus posisi relatif kunci pencarian dihitung dengan rumus:
posisi
kunci data[low]
(high low) low
data[high ] data[low]
Judul Buku
The C++ Programming
Mastering Delphi 6
Professional C#
Pure JavaScript v2
Advanced JSP & Servlet
Calculus Make it Easy
Visual Basic 2005 Express
Artificial Life : Volume 1
Pengarang
James Wood
Marcopolo
Simon Webe
Michael Bolton
David Dunn
Gunner Christian
Antonie
Gloria Virginia
Low = 3 + 1 = 4
High = 7
Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060.
Berarti tidak ada kunci 060.
Programnya:
int interpolationsearch(int key,int n){
int low,high,pos,i;
low=0;
high=n-1;
do{
pos = (key data[low]) * (high low) / data[high]
data[low] + low;
if (data[pos] == key]
return pos;
if (data[pos] > key)
high = pos-1;
else
if (data[pos] < key)
low = pos + 1;
} while(key >= data[low] && key <= data[high]);
return -1
}
PERCOBAAN
Tuliskan program-program berikut ini, kemudian lihat hasilnya dan beri penjelasan
atas masing-masing program.
1. Program 1 (Sequential Search)
#include<stdio.h>
void main()
{
//deklarasi variabel
int A[10],index[10], i,j,k;
//proses penginputan data
for(i=0;i<10;i++)
{
printf("Data ke-%d:",i+1);
scanf("%d",&A[i]);
}
//memasukkan data yang akan dicari ke dalam K
printf("Masukkan data yang akan anda cari:");
scanf("%d",&k);
//proses pencarian data
j=0;
for (i=0;i<10;i++)
{
if(A[i]==k)
{
index[j]=i;
j++;
}
}
//jika data ditemukan dalam array
if (j>0)
LATIHAN
1. Buat program lengkap untuk menggabungkan ketiga metode searching dengan
menggunakan menu. Buat dalam bentuk fungsi. Menu-menunya adalah sebagai
berikut:
a. Masukkan data
b. Cari data
c. Edit data
d. Tampilkan data
2. Buat array rekening bank dengan ketentuan :
a. Setiap elemen array bertipe struktur:
(int no_rek, char nama[25], long saldo)
b. Buatlah fungsi-fungsi sebagai berikut :
- Add
- Edit
- Cari (Sequential)
- Setor
- Ambil
- Transfer
- Tutup Rekening (Delete)
MODUL 2
Pertemuan : III dan IV
Judul Modul : Sorting pada Array
Tujuan:
Memahami beberapa metode sorting pada array
Dapat membuat program aplikasi sorting pada array
DASAR TEORI
Sorting (pengurutan) adalah proses menyusun kembali data yang sebelumnya telah
disusun dengan suatu pola tertentu ataupun secara acak, sehingga menjadi tersusun
secara teratur menurut aturan tertentu.
Pada umumnya ada 2 macam pengurutan, yaitu:
Pengurutan secara ascending (urut naik).
Pengurutan secara descending (urut turun).
Ada beberapa metode sorting pada array. Dalam praktikum ini akan dibahas lima di
antara metode-metode sorting yang ada, yaitu
Bubble sort
Selection sort
Insertion sort
Quick sort
Merge sort
Algoritma-algoritma ini mempunyai efek yang berbeda dalam setiap prosesnya, ada
yang mudah digunakan, ada yang mempunyai proses yang sangat cepat, dan
sebagainya.
Hal yang umum dilakukan dalam proses sorting adalah proses pertukaran antara 2
elemen atau lebih (analogi memindah air dalam gelas). Untuk melakukan proses
pertukaran akan diperlukan adanya variable baru yang digunakan sebagai variable
penampung.
//fungsi penukar data
void tukar (int a[], int i, int j) {
int tampung = a[i];
a[i] = a[j];
a[j] = tampung;
}
1. Bubble Sort
Bubble sort merupakan metode sorting paling mudah, namun paling lambat
dibandingkan dengan metode yang lain.
2. Exchange Sort
Mirip dengan bubble sort.
Perbedaannya: dalam exchange sort ada elemen yang berfungsi sebagai pusat
(pivot), pertukaran hanya akan dilakukan jika diperlukan saja dari pivot
tersebut.
Contoh fungsi exchange sort:
//Exchange Sort
void exchange (int a[], int n) {
int i,j;
for (i=0;i<=n-1;i++) {
for (j=(i+1);j<n;j++)
if(a[i]>a[j])
tukar (a,i,j);
}
}
3. Selection Sort
Kombinasi sorting dan searching.
Untuk setiap proses, akan dilakukan dengan mencari elemen dari posisi yang
belum diurutkan dan kemudian memilih elemen yang memiliki nilai terkecil
atau terbesar yang akan ditukarkan ke posisi yang tepat di dalam array.
Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil dan
data ini akan ditempatkan pada indeks terkecil, pada putaran kedua akan dicari
data kedua terkecil, dan akan ditempatkan di indeks kedua, begitu seterusnya
hingga tidak ada data yang dicari lagi.
Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks
pembanding saja, pertukaran data secara fisik terjadi pada akhir proses.
Contoh fungsi selection sort:
//Selection Sort
void selection (int a[],int n) {
10
4. Insertion Sort
Analogi pengurutan kartu.
Proses dilakukan dengan membandingkan data ke-i dengan data yang
sebelum-sebelumnya.
Misal ascending: pengurutan dimulai dari data ke-2 sampai dengan data
terakhir, jika ditemukan data yang lebih kecil, maka akan dimasukkan di posisi
yang seharusnya.
Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang.
Contoh fungsi insertion sort:
//Insertion Sort
void insertion (int a[],int n) {
int i,j,v;
for (i=2;i<=n;i++) {
v=a[i];
j=1;
while (a[j-1]>v) {
a[j]=a[j-1]
j--;
a[j=v];
}
}
5. Quick Sort
Bersifat divide & conquer.
Merupakan metode pencarian yang sangat cepat (saat ini tercepat).
Pertama-tama deret dibagi menjadi dua bagian, misal, semua elemen pada
bagian b (bagian pertama) mempunyai kurang dari atau sama dengan semua
elemen pada bagaian c (bagian kedua -- membagi). Kemudian kedua bagian
tersebut dilakukan proses sorting dengan rekursif secara terpisah dengan
prosedur yang sama(coquer). Kemudian gabungkan lagi kedua bagian terpisah
tersebut.
11
Langkah:
o Memilih sebuah elemen pembanding (pivot), misal x.
o Semua elemen dari deret tersebut yang kurang dari x diletakkan pada
bagian pertama.
o Kemudian semua elemen dari yang lebih besar dari x diletakkan pada
bagian kedua.
o Untuk elemen yang sama dengan x bisa diletakkan di mana saja bahkan
bisa juga di antara kedua bagian tersebut.
Algoritma partisi:
Masukan : array A[n] dengan n elemen
Keluaran : permutasi dari array sedemikian sehingga smua elemen A[0], ,
A[j] kurang dari atau sama dengan semua elemen A[i], ,
A[n-1] (i > j)
Metode
Cari elemen pertama A[i] yang lebih besar atau sama dengan x
Cari elemen terakhir A[j] yang lebih kecil atau sama dengan x
Jika i
j
Tukarkan A[i] dan A[j]
o
o
o
o
12
PERCOBAAN
1. Tuliskan program untuk mengurutkan barisan karakter dengan menggunakan
bubble sort berikut ini, kemudian lihat hasilnya dan beri penjelasan
// Program untuk mengurutkan barisan karakter
// menggunakan bubble sort
#include <iostream>
#include <string>
using namespace std;
void Urutkan(char* str)
{
unsigned int n = strlen(str);
unsigned int i, j;
for (i = 1; i < n; i++)
for (j = n-1; j >= i; j--)
if (str[j] < str[j-1])
{
char temp = str[j];
str[j] = str[j-1];
str[j-1] = temp;
};
};
int main()
{
char BarisanKarakter[1024];
// Input barisan karakter
cout << "Masukkan barisan karakter: ";
cin >> BarisanKarakter;
// Urutkan
Urutkan(& BarisanKarakter[0]);
// Tampilkan hasilnya
cout << "Setelah diurutkan: " << BarisanKarakter << endl;
return 0;
};
2. Buatlah program yang sama seperti pada no. 1 untuk metode sorting yang lain,
yaitu selection sort, insertion sort, quick sort, dan merge sort.
13
LATIHAN
1. Buatlah program lengkap yang dapat menampilkan semua hasil sorting dalam
lima metode sorting yang dijelaskan di depan dengan menggunakan menu.
2. Dari program tersebut tambahkanlah bagian program yang dapat menampilkan
proses sorting yang sebenarnya terjadi (tidak hanya hasil akhirnya saja).
3. Buat
program
yang
membaca
masukan
berupa
string
QWERTYUIOPASDFGHJKLZXCVBNM. Kemudian program melakukan proses
sorting sehingga menjadi string ABCDEFGHIJKLMNOPQRSTUVWXYZ.
4. Buat program dengan masukan NIM, nama, dan umur untuk 10 mahasiswa,
kemudian lakukan sorting terhadap masukan berdasarkan NIM.
14
MODUL 3
Pertemuan : V dan VI
Judul Modul : Stack dengan Array
Tujuan:
Memahami pengertian stack
Dapat mengimplementasikan stack dengan menggunakan array
DASAR TEORI
Stack atau tumpukan adalah suatu struktur data yang seolah-olah terlihat seperti data
yang tersusun secara menumpuk; dalam hal ini, ada data yang terletak di atas data
yang lainnya. Penyimpanan data di dalam stack bersifat LIFO (Last In First Out),
yang berarti bahwa data yang masuk terakhir akan keluar pertama.
Beberapa operasi dasar pada Stack antara lain:
IsFull() mengecek apakah stack sudah penuh
IsEmpty()
mengecek apakah stack sudah kosong
Push()
menambah data pada stack pada tumpukan paling atas
Pop()
mengambil data pada stack pada tumpukan paling atas
Tampil()
mencetak semua data dalam stack
Dalam implementasinya, stack dapat disajikan dengan menggunakan struktur data
statis maupun dinamis. Implementasi dengan struktur data statis pada percobaan ini
adalah dengan menggunakan array.
Berikut ini adalah cara deklarasi stack dengan menggunakan array:
typedef struct STACK{
int top;
char data[10][10]; //misalkan : data adalah array of string
//berjumlah 10 data, masing-masing string
//menampung maksimal 10 karakter
};
STACK tumpuk;
Pada keadaan awal, stack diinisialisasi dengan fungsi inisialisasi() seperti berikut ini:
void inisialisasi(){
tumpuk.top = -1;
}
Elemen top dari stack diisi dengan nilai -1, karena array dalam C dimulai dari 0, yang
berarti stack adalah kosong. Top adalah suatu variabel penanda dalam STACK yang
menunjukkan elemen teratas Stack sekarang. Top Of Stack akan selalu bergerak
hingga mencapai MAX_STACK (di sini, MAX_STACK adalah ukuran maksimum
stack) sehingga menyebabkan stack penuh.
15
Sementara itu, untuk memeriksa apakah stack kosong, dapat dibuat fungsi IsEmpty():
int IsEmpty(){
if(tumpuk.top == -1)
return 1;
else
return 0;
}
Untuk menampilkan seluruh data dari stack, maka digunakan perulangan. Karena
bersifat LIFO, maka data yang pertama ditampilkan adalah yang berada pada elemen
teratas (yaitu yang terakhir sekali disimpan di stack). Fungsi untuk menampilkan ini
dapat dibuat sebagai berikut:
void TampilStack(){
for(int i=tumpuk.top;i>=0;i--){
printf("Data : %s\n",tumpuk.data[i]);
}
}
16
PERCOBAAN
Berikut ini adalah contoh implementasi program menggunakan stack. Ketiklah
program berikut ini, kemudian lihat hasilnya, dan beri penjelasannya.
#include <stdio.h>
#include <conio.h>
//deklarasi 'STACK' dengan struct dan array
struct STACK
{
int data[5];
int atas;
};
//deklarasi variabel 'tumpuk' dari struct
STACK tumpuk;
void main()
{
clrscr();
int pilihan,baru,i;
//inisialisasi awal
tumpuk.atas=-1;
do
{
clrscr();
printf("1.Push Data\n");
printf("2.Pop Data\n");
printf("3.Print Data\n");
printf("\nPilihan = ");
scanf("%i",&pilihan);
switch(pilihan)
{
case 1:
{
if(tumpuk.atas==5-1)
{
printf("Tumpukan penuh");
getch();
}
else
{
printf("Data yang akan di-push = ");
scanf("%d",&baru);
tumpuk.atas++;
tumpuk.data[tumpuk.atas]=baru;
}
break;
}
case 2:
{
if(tumpuk.atas==-1)
{
printf("Tumpukan kosong");
getch();
}
else
{
printf("Data yang akan di-pop = %d",
tumpuk.data[tumpuk.atas]);
tumpuk.atas--;
getch();
}
break;
}
17
LATIHAN
1. Ubahlah contoh program stack di depan dalam bentuk fungsi-fungsi yang terpisah
dari program utama (fungsi IsFull, IsEmpty, Push, Pop, Tampil)
2. Dengan menggunakan struktur data stack, buatlah program yang menerima
masukan berupa string nama Anda. Program kemudian membalik string nama,
dan menampilkan string nama yang sudah dibalik itu.
3. Buatlah program yang menerima masukan berupa ekspresi matematika dalam
notasi postfix, kemudian menghitung (mengevaluasi) hasilnya. Operator
matematika yang digunakan adalah +, , *, dan /.
Contoh: ekspresi dalam notasi infix 10 + 3 * 5 dapat diubah menjadi notasi postfix
3 5 * 10 +
Notasi postfix ini kemudian menjadi masukan bagi program. Program
membutuhkan dua buah stack, stack Soal (untuk menyimpan data ekspresi dalam
notasi postfix) dan stack Hasil (untuk menyimpan hasil evaluasi ekspresi
matematika) dan dievaluasi dengan algoritma sebagai berikut:
i. Pop Stack Soal:
a. Jika berupa operand, maka Push ke Stack Hasil
b. Jika berupa operator, maka
i. Pop nilai pertama dari Stack Hasil
ii. Pop nilai kedua dari Stack Hasil
iii. Lakukan operasi sesuai dengan operator yang didapat.
ii. Ulangi langkah i sampai selesai.
18
MODUL 4
Pertemuan : VII dan VIII
Judul Modul : Queue dengan Array
Tujuan:
Memahami pengertian queue
Dapat mengimplementasikan queue dengan menggunakan array
DASAR TEORI
Secara harfiah, queue berarti antrian. Dalam suatu antrian, yang datang lebih dahulu
akan dilayani dan akan keluar lebih dahulu. Karena itu, queue merupakan sebuah
struktur data yang bersifat FIFO (First In First Out), yaitu data yang pertama sekali
disimpan (masuk ke antrian) akan merupakan data yang pertama sekali diambil
(keluar dari antrian).
Seperti halnya stack, struktur data queue juga dapat diimplementasikan dengan
menggunakan array.
void Create(){
antrian.head=antrian.tail=-1;
}
2) IsEmpty()
Untuk memeriksa apakah Antrian sudah penuh atau belum
Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty
Prodi Manajemen Informatika - Polmed
19
Head tidak diperiksa, karena Head adalah tanda untuk kepala antrian (elemen
pertama dalam antrian) yang tidak akan berubah-ubah
Pergerakan pada Antrian terjadi dengan penambahan elemen antrian ke
belakang, yaitu menggunakan nilai Tail
int IsEmpty(){
if(antrian.tail==-1)
return 1;
else
return 0;
}
3) IsFull()
Untuk mengecek apakah Antrian sudah penuh atau belum
Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah
batas elemen array pada C) berarti sudah penuh
int IsFull(){
if(antrian.tail==MAX-1) return 1;
else return 0;
}
4) EnQueue(data)
Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu
ditambahkan di elemen paling belakang
Penambahan elemen selalu menggerakan variabel Tail dengan cara increment
counter Tail
5) DeQueue()
Digunakan untuk menghapus elemen terdepan/pertama dari Antrian
Prodi Manajemen Informatika - Polmed
20
Dengan cara mengurangi counter Tail dan menggeser semua elemen antrian
kedepan.
Penggeseran dilakukan dengan menggunakan looping
int DeQueue(){
int i;
int e = antrian.data[antrian.head];
for(i=antrian.head;i<=antrian.tail-1;i++){
antrian.data[i] = antrian.data[i+1];
}
antrian.tail--;
return e;
}
6) Clear()
Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan
Head = -1
Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya,
namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemenelemen Antrian tidak lagi terbaca
void Clear(){
antrian.head=antrian.tail=-1;
printf("data clear");
}
7) Tampil()
Untuk menampilkan nilai-nilai elemen Antrian
Menggunakan looping dari head sampai dengan tail
void Tampil(){
if(IsEmpty()==0){
for(int i=antrian.head;i<=antrian.tail;i++){
printf("%d ",antrian.data[i]);
}
}
else printf("data kosong!\n");
}
21
PERCOBAAN
Berikut ini adalah implementasi program menggunakan struktur data queue. Tuliskan
program ini, kemudian lihat hasilnya dan beri penjelasan.
#include<stdio.h>
#include<conio.h>
void main()
{
int cek=0, data[20], x, hapus;
char pil;
do {
clrscr();
printf("1. Tambah Antrian\n");
printf("2. Hapus Antrian\n");
printf("3. Lihat Antrian\n");
printf("4. Keluar\n");
printf("Silahkan masukkan pilihan anda...
pil=getche();
");
22
LATIHAN
1. Modifikasi program pada Percobaan sehingga modul-modul program dibuat
dalam bentuk fungsi, yaitu Create(), IsEmpty(), IsFull(), EnQueue(), DeQueue(),
Clear(), dan Tampil().
2. Tambahkanlah fungsi untuk mencari suatu elemen dalam queue
3. Tambahkan fungsi untuk mengedit suatu elemen dalam queue
4. Carilah nilai total, rata-rata, terbesar dan terkecil dari elemen-elemen queue dalam
function tersendiri
5. Buatlah program untuk simulasi antrian registrasi Polmed. Yang tercatat adalah
nim mahasiswa.
6. Kembangkan program tersebut sehingga bisa menyimpan keterangan nim, nama,
dan prodi mahasiswa tersebut.
23
MODUL 5
Pertemuan : IX dan X
Judul Modul : Single linked-list non-circlar
Tujuan:
Memahami pengertian single linked-list non-circlar
Dapat mengimplementasikan single linked-list non-circular
DASAR TEORI
Linked list (senarai berkait) adalah sebuah struktur data berupa rangkaian elemen
saling berkait dengan setiap elemen dihubungkan dengan elemen lain melalui pointer.
Penggunaan pointer untuk mengacu elemen berakibat elemen-elemen bersebelahan
secara logika walaupun tidak bersebelahan secara fisik di memori. Masing-masing
data dalam linked list disebut node (simpul).
Setiap simpul dalam linked list terdiri dai dua bagian, yaitu
bagian data
bagian pointer yang menunjuk ke simpul lain.
Ditinjau dari banyaknya pointer dalam setiap simpul, maka linked list dapat
dibedakan atas dua jenis, yaitu
single linked-list, memiliki sebuah pointer yang menunjuk ke simpul
berikutnya, dan
double linked-list, memiliki dua buah pointer yang masing-masing menunjuk
ke simpul sebelumnya dan simpul berikutnya.
Selanjutnya, single linked-list masih dapat dibedakan atas non-circular (tidak
melingkar) dan circular (melingkar). Single linked-list non-circular adalah single
linked list yang pointer pada elemen terakhirnya tidak menunjuk ke manapun.
Sementara itu, pada single linked-list circular, pointer pada elemen terakhirnya
menunjuk ke elemen pertama sehingga membentuk cincin (melingkar).
Sebuah single linked list non-circular dapat diilustrasikan seperti berikut:
24
Kemudian node tersebut diisi data, dan pointer nextnya menunjuk ke NULL.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
Penambahan Data
Penambahan data di depan
Penambahan node baru akan dikaitkan di node paling depan, namun pada saat
pertama kali (data masih kosong), maka penambahan data dilakukan dengan cara head
ditunjukkan ke node baru tersebut. Pada prinsipnya adalah mengaitkan node baru
dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head
akan tetap selalu menjadi data terdepan.
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;
}
cout<<Data masuk\n;
}
Ilustrasi:
1. List masih kosong (head=NULL)
Prodi Manajemen Informatika - Polmed
25
Ilustrasi:
1. List masih kosong (head=NULL)
26
Menampilkan Data
Function untuk menampilkan isi single linked list non circular
void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
while(bantu!=NULL){
cout<<bantu->data<<" ";
bantu=bantu->next;
}
cout<<endl;
}
else cout<<"Masih kosong\n";
}
Penghapusan Data
Penghapusan data terdepan
void hapusDepan (){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;
}
else {
d = head->data;
head = NULL;
}
cout<<d<<" terhapus\n";
}
27
Ilustrasi:
28
Inisialisasi LinkedList
TNode *head, *tail;
Penambahan Data
Pengaitan node baru ke linked list di depan
Penambahan data baru di depan akan selalu menjadi head.
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=tail=baru;
tail->next=NULL;
}
else {
baru->next = head;
head = baru;
}
cout<<Data masuk\n;
}
Ilustrasi:
1. List masih kosong (head=tail=NULL
29
Ilustrasi:
1. List masih kosong (head=tail=NULL)
30
Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data
di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus
menggunakan perulangan pointer bantu.
Fungsi untuk menampilkan isi linked list:
void tampil(){
TNode *bantu;
bantu = head;
if(isEmpty()==0){
while(bantu!=NULL){
cout<<bantu->data<<" ";
bantu=bantu->next;
}
cout<<endl;
} else cout<<"Masih kosong\n";
}
31
Ilustrasi:
32
PERCOBAAN
1. Buatlah program lengkap dengan menggunakan menu untuk single linked-list
non-circular yang menggunakan head dan memiliki fungsi-fungsi seperti yang
telah diberikan pada Dasar Teori:
init()
isEmpty()
insertDepan()
insertBelakang()
hapusDepan()
hapusBelakang()
clear()
2. Buatlah program seperti pada no. 1, tetapi menggunakan head dan tail.
LATIHAN
1. Buatlah sebuah linked-list non-circular yang berisi nim Anda dan nama lengkap
Anda.
2. Buat fungsi untuk menambahkan node single linked-list non-circular dengan tiap
node mengandung informasi nim dan nama. Peletakan posisi node diurutkan
berdasar nim secara ascending, jadi bisa tambah depan, belakang maupun tambah di
tengah. Isikan data nim dan nama lengkap teman sebelah kiri dan kanan Anda.
3. Buatlah fungsi untuk menampilkan data 3 buah node yang telah anda bentuk
sebelumnya. Contoh tampilan
NIM
Nama Lengkap
22053766
Hernawan
22053768
Andrew S
22053791
Anthony S
4. Buatlah fungsi untuk mencari nama yang telah diinputkan dengan menggunakan
NIM. Contoh tampilan:
Nim yang dicari: 22053768
33
5. Buatlah sebuah fungsi untuk menghapus nim yang diinputkan oleh user. Contoh
tampilan:
NIM yang mau dihapus: 2205376
NIM dengan nama Andrew S ditemukan dan telah dihapus
34
MODUL 6
Pertemuan : XI dan XII
Judul Modul : Single linked-list circlar
Tujuan:
Memahami pengertian single linked-list circlar
Dapat mengimplementasikan single linked-list circular
DASAR TEORI
Single linked-list circular adalah single linked-list yang pointer pada elemen (simpul)
terakhirnya menunjuk ke elemen (simpul) pertama sehingga membentuk cincin
(melingkar).
35
Penambahan Data
Penambahan data di depan
Untuk menghubungkan node terakhir dengan node terdepan dibutuhkan pointer
bantu.
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;
}
cout<<"Data masuk\n";
}
Ilustrasi:
1. List masih kosong (head=NULL)
36
Ilustrasi:
1. List masih kosong (head=NULL)
Menampilkan Data
Function untuk menampilkan isi single linked list
void tampil(){
TNode *b;
b = head;
37
Penghapusan Data
Penghapusan data terdepan
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;
cout<<d<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
38
Ilustrasi:
39
Inisialisasi LinkedList
TNode *head, *tail;
Penambahan Data
Penambahan data baru di depan
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else {
baru->next = head;
head = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}
Ilustrasi:
1. List masih kosong (head=tail=NULL)
40
Ilustrasi:
1. List masih kosong (head=tail=NULL)
41
42
Ilustrasi:
PERCOBAAN
1. Buatlah program lengkap dari semua algoritma dan fungsi di atas dalam bentuk
menu untuk menambah data, melihat data, dan menghapus data.
2. Buatlah fungsi tambahan yang berguna untuk mencari data yang ada dalam linked
list baik secara ber-Head maupun ber-Head dan Tail.
3. Buatlah fungsi untuk menghapus data tertentu dalam linked list.
4. Buatlah fungsi untuk menyisipkan node setelah atau sebelum data tertentu.
LATIHAN
1. Buatlah sebuah Single Linked List Circular dengan data bertipe integer yang
mempunyai 5 buah simpul dengan nilai data pada masing-masing simpul (mulai
dari simpul pertama atau head sampai simpul terakhir atau tail) adalah 50, 40, 30,
20, dan 10.
a. Tuliskan listing program untuk membaca data dari seluruh simpul dengan
menggunakan perulangan (for/while)
Prodi Manajemen Informatika - Polmed
43
b. TuIiskan listing program untuk menambah sebuah simpul baru dengan data 5
yang diletakan diantara data 30 dan data 20.
c. Tuliskan listing program untuk menghapus simpul dengan data 20 tanpa
merusak senarai.
d. Tuliskan listing program untuk menghapus semua simpul dengan
menggunakan variabel bantu dengan menggunakan perulangan (while/for).
2. Buatlah program Single Linked List Circular yang fleksibel dan
dinamis. Dimana user dapat menambah simpul baru beserta datanya, membaca
semua data pada senarai, menghapus simpul dengan data yang ditentukan oleh
user, dan dapat menghapus semua simpul yang ada. Jangan Iupa membuat trapping
errornya.
3. Buatlah sebuah link list yang berisi data-data identitas KTP (nama, alamat, no
KTP) buatlah menu sebagai berikut:
a. Input entry KTP ( input akan langsung terurutkan berdasarkan no KTP
asending )
b. Delete file yang diinginkan user.
c. Searching entry KTP
d. Cetak semua entry KTP
e. Cetak entry KTP tertentu
4. Buatlah 3 link list yang merepresentasikan jam(1-12), menit(1-60) dan detik(160). Mintalah inputan dari user berupa jumlah detik. Konversikan jumlah detik
tersebut dan masukkan ke dalam link list (gunakan pointer jam,menit,detik)
kemudian cetak jam yang tertera di link list tersebut.
44
MODUL 7
Pertemuan : XIII dan XIV
Judul Modul : Double linked-list non-circlar
Tujuan:
Memahami pengertian double linked-list non-circlar
Dapat mengimplementasikan double linked-list non-circular
DASAR TEORI
Seperti halnya single linked-list, maka double linked-list juga dapat dibedakan atas
non-circular dan circular. Dengan demikian, pembahasannya juga tidak jauh berbeda.
Modul ini membahas double linked-list non-circular yang diimplementasikan dengan
menggunakan head saja dan juga dengan menggunakan head dan tail.
Ilustrasi double linked-list non-circular:
Deklarasi node:
typedef struct TNode{
int data;
TNode *next;
Tnode *prev;
};
45
PENAMBAHAN DATA
Penambahan data di depan
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
baru->prev = NULL;
if(isEmpty()==1){
head=baru;
head->next = NULL;
head->prev = NULL;
}
else {
baru->next = head;
head->prev = baru;
head = baru;
}
cout<<Data masuk\n;
}
Ilustrasi:
1. List masih kosong (head=NULL)
46
Penghapusan Data
Fungsi untuk menghapus data di depan:
void hapusDepan (){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = head;
d = hapus->data;
head = head->next;
head->prev = NULL;
delete hapus;
}
else {
d = head->data;
head = NULL;
}
cout<<d<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
47
Inisialisasi:
TNode *head, *tail;
48
49
50
PERCOBAAN
1. Buatlah ilustrasi dari masing-masing potongan program.
2. Buat program lengkap dari potongan-potongan program yang ada di atas. Buat
dengan menggunakan menu.
3. Buat program untuk memasukkan node baru tetapi di antara node yang sudah ada.
Tentukan node yang baru akan berada pada antrian keberapa.
LATIHAN
1. Buatlah fungsi tambahan yang berguna untuk mencari data yang ada dalam linked
list baik dengan head maupun head & tail.
2. Buatlah fungsi untuk menghapus data tertentu dalam linked list.
3. Buatlah fungsi untuk menampilkan data list secara terbalik.
4. Buatlah fungsi untuk menghitung nilai rata-rata dari sebuah linked-list yang
memiliki elemen bertipe float.
51
MODUL 8
Pertemuan : XV dan XVI
Judul Modul : Double linked-list circlar
Tujuan:
Memahami pengertian double linked-list circlar
Dapat mengimplementasikan double linked-list circular
DASAR TEORI
Pada double linked-list cicular, pointer next dan prev menunjuk ke dirinya sendiri
secara circular (melingkar).
52
Penambahan Data
Penambahan data di depan
void insertDepan(int databaru){
TNode *baru, *bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
baru->prev = baru;
if(isEmpty()==1){
head=baru;
head->next = head;
head->prev = head;
}
else {
bantu = head->prev;
baru->next = head;
head->prev = baru;
head = baru;
head->prev = bantu;
bantu->next = head;
}
cout<<"Data masuk\n";
}
Ilustrasi:
1. List masih kosong (head=NULL)
53
Penghapusan Data
Fungsi untuk menghapus data 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;
54
Inisialisasi:
TNode *head, *tail;
55
Fungsi Inisialisasi:
void init(){
head = NULL;
tail = NULL;
}
56
57
PERCOBAAN
1. Buatlah ilustrasi dari masing-masing potongan program.
2. Buat program lengkap dari potongan-potongan program yang ada di atas. Buat
dengan menggunakan menu.
3. Buat program untuk memasukkan node baru tetapi di antara node yang sudah ada.
Tentukan node yang baru akan berada pada antrian keberapa.
LATIHAN
1. Buatlah fungsi tambahan yang berguna untuk mencari data yang ada dalam linked
list baik dengan head maupun head & tail.
2. Buatlah fungsi untuk menghapus data tertentu dalam linked list.
3. Buatlah fungsi untuk menampilkan data list secara terbalik.
4. Buatlah fungsi untuk menghitung nilai rata-rata dari sebuah linked-list yang
memiliki elemen bertipe float.
58
MODUL 9
Pertemuan : XVII
Judul Modul : Stack dengan linked list
Tujuan:
Memahami pengertian stack dengan linked-list
Dapat mengimplementasikan operasi-operasi dasar pada stack dengan linked
list
DASAR TEORI
Selain implementasi stack dengan array, ada cara lain untuk mengimplementasikan
stack, yaitu dengan linked list. Pada modul ini, stack akan diimplementasikan dengan
single linked list. Keunggulan implementasi dengan linked list dibandingkan dengan
array adalah penggunaan alokasi memori yang dinamis sehingga menghindari
pemborosan memori. Sebagai contoh, jika sebuah stack dengan array dialokasikan
tempat untuk stack berisi 150 elemen, sementara ketika dipakai oleh user stack hanya
diisi 50 elemen, maka telah terjadi pemborosan memori untuk sisa 100 tempat elemen
yang tidak terpakai. Dengan penggunaan linked list, maka tempat yang digunakan
akan sesuai dengan banyaknya elemen yang mengisi stack. Oleh karena itu, dalam
stack dengan linked list, tidak ada istilah full (penuh), sebab biasanya program tidak
menentukan jumlah elemen stack yang mungkin ada (kecuali jika sudah dibatasi oleh
pembuatnya). Namun demikian, sebenarnya stack ini pun memiliki batas kapasitas,
yakni dibatasi oleh jumlah memori yang tersedia.
Top
E
NULL
59
2) Fungsi isEmpty():
int isEmpty() {
if(Top==NULL) return 1;
else return 0;
}
3) Fungsi Push():
Untuk memasukkan elemen baru ke dalam stack
int Push(int X) {
TNode *Baru = new TNode;
Baru->Data=X;
Baru->Next=Top;
Top=Baru;
return X;
}
Ilustrasi:
1. Mula-mula stack masih kosong:
Top
NULL
23
NULL
4) Fungsi Pop():
int Pop() {
int X;
if(!isEmpty()) {
X = Top->Data;
TNode *Sampah = Top;
Top = Top->Next;
delete Sampah;
}
return X;
}
NULL
60
Ilustrasi:
1. Keadaan awal stack
sudah berisi lima
elemen:
Top
90
Top
68
52
11
68
52
11
23
23
NULL
5) Fungsi Clear()
NULL
void Clear() {
while(!isEmpty())
Pop();
}
PERCOBAAN
1. Buatlah fungsi Tampil() untuk menampilkan semua elemen dalam stack dengan
single linked list.
2. Buatlah program lengkap dengan menggunakan menu yang memiliki fungsifungsi dasar untuk operasi pada stack dengan single linked list, yaitu Init(),
isEmpty(), Push(), Pop(), dan Tampil();
LATIHAN
1. Dengan menggunakan struktur data stack, buatlah program yang menerima
masukan berupa string nama Anda. Program kemudian membalik string nama,
dan menampilkan string nama yang sudah dibalik itu.
2. Buatlah program yang menerima masukan berupa ekspresi matematika dalam
notasi postfix, kemudian menghitung (mengevaluasi) hasilnya. Operator
matematika yang digunakan adalah +, , *, dan /.
Contoh: ekspresi dalam notasi infix 10 + 3 * 5 dapat diubah menjadi notasi postfix
3 5 * 10 +
61
62
MODUL 10
Pertemuan : XVIII
Judul Modul : Queue dengan linked list
Tujuan:
Memahami pengertian queue dengan linked-list
Dapat mengimplementasikan operasi-operasi dasar pada queue dengan linked
list
DASAR TEORI
Selain menggunakan array, queue juga dapat diimplementasikan dengan
menggunakan linked list. Pada modul ini, linked list yang digunakan adalah double
linked list.
Pembuatan queue dengan double linked list adalah melalui deklarasi queue sebagai
berikut:
typedef struct TNode {
int Data;
TNode *Prev;
TNode *Next;
}
Head
2) Fungsi isEmpty():
Tail
NULL
Count = 0
int isEmpty() {
if(Head==NULL) return 1;
else return 0;
}
63
3) Fungsi isFull():
int isFull() {
if(Count==MAX_QUEUE) // MAX_QUEUE adalah kapasitas queue maksimum
return 1;
else return 0;
}
4) Fungsi EnQueue():
int EnQueue(int X) {
if(!isFull()) {
TNode *Baru = new TNode;
Baru -> Data = X;
Baru -> Next = NULL;
Baru -> Prev = Tail;
if(isEmpty())
Head = Baru;
else
Tail->Next = Baru;
Tail = Baru;
Count++;
}
return X;
}
5) Fungsi DeQueue():
int DeQueue() {
int Temp;
if(!isEmpty()) {
Temp=Head->Data;
TNode *Sampah = Head;
Head=Head->Next;
Head->Prev=NULL;
delete Sampah;
Count--;
}
return Temp;
}
6) Fungsi Clear()
void Clear() {
while(!isEmpty())
DeQueue();
}
PERCOBAAN
1. Buatlah ilustrasi untuk menggambarkan fungsi EnQueue() dan DeQueue().
2. Buatlah fungsi Tampil() untuk menampilkan semua elemen dalam queue dengan
double linked list.
3. Buatlah program lengkap dengan menggunakan menu untuk operasi-operasi dasar
pada queue dengan double linked list, yaitu Init(), isEmpty(), isFull(),
EnQueue(), DeQueue(), Clear(), dan Tampil().
64
LATIHAN
Gunakan fungsi-fungsi untuk operasi-operasi dasar pada struktur data Queue yang
elemen datanya berupa nilai float untuk membuat program lengkap menggunakan
menu-menu berikut:
1. Masukkan data
2. Hapus data
3. Hapus seluruh data
4. Tampilkan data dalam Queue dengan disertai data statistik:
a. Banyak data n
n
x
i 1
c. Nilai rata-rata x
d. Nilai maksimum xmax
e. Nilai minimum xmin
5. Selesai
65
REFERENSI
1. Hariyanto, Bambang. (2000). Struktur Data. Penerbit Informatika, Bandung.
2. Sanjaya, Dwi (2005). Asyiknya Belajar Struktur Data di Planet C++. Elex Media
Komputindo, Jakarta.
3. Kadir, A., dan Heriyanto (2005). Algoritma Pemrograman Menggunakan C++.
Penerbit Andi, Yogyakarta.
4. Heriyanto, Tjendry. (1995). Tuntunan Praktis Pemrograman C++. Elex Media
Komputindo, Jakarta.
5. Halawa, Edward E.H., dan Setyawan P. Sakti (1995). Pemrograman dengan C++
dan Aplikasi Numerik. Penerbit Erlangga, Jakarta.
6. http://lecturer.ukdw.ac.id/anton
7. http://www.dwisanjaya.com
66