Algoritma
Algoritma &
& Struktur
Struktur Data
Data
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com HP: 0888-673-1891
URL: http://asnugroho.net/lecture/ds.html
Name
Anto Satriyo Nugroho
Birthday
October 1970
Education
received B.Eng(S1), M.Eng (S2) and Dr.Eng (S3) from
Nagoya Institute of Technology, Japan (Electrical &
Computer Eng.) in 1995, 2000 dan 2003.
Scholarship from Pemerintah RI (S1) & Japanese
government Monbukagakusho (S2 & S3)
Core competence
- Pattern Recognition, Artificial Intelligence & Datamining
- Biomedical Engineering & Bioinformatics/Computational Biology
- Research activities & publications can be seen from
http://asnugroho.net/
Work experiences
• 1990-now
BPP Teknologi (Pusat Teknologi Informasi & Komunikasi)
• 2003-2004
Visiting Professor at School of Computer & Cognitive
Sciences, Chukyo University, Japan
• 2004-2007
Visiting Professor at School of Life System Science &
Technology, Chukyo University, Japan
• 2003-2007
Researcher at Institute for Advanced Studies of Artificial
Intelligence, Chukyo University Japan
• 2007-now
Vice president of Indonesian Society for Softcomputing
• 2007-now
Lecturer at Swiss German University, Al Azhar Univ. Indonesia
Referensi
Referensi
1. Donald E. Knuth, The Art of Computer Programming: Vol.1-3 Fundamental
Algorithms, 3rd Ed., Addison Wesley, 1997
2. Thomas Cormen, Charles Leiserson, Introduction to Algorithms (2nd ed.), MIT
Press, 2001
3. Hiroyuki Kondoh, Teihon C puroguramaa no tameno arugorizumu to deta
kouzou, Softbank Publishing, 1998
Berbahasa Jepang, buku teks struktur data dan algoritma yang sangat
terkenal di Jepang. Saat masih mengajar di Chukyo Univ., saya memakai
buku ini sebagai buku teks. Slide saya buat berdasarkan penjelasan yang
diberikan pada buku ini
4. Bohyoh Shibata, Meikai C Gengo Nyuumon-hen, Softbank publishing, 2004
Dr.Shibata menerima penghargaan untuk buku teks C++ yang ditulisnya.
Sebagaimana halnya dengan buku teks C++, buku pengantar C di atas
ditulis dengan bahasa yang mudah difahami dengan contoh-contoh yang
memudahkan seseorang memahami bahasa C. Beberapa contoh yang
saya tampilkan pada kuliah ini merujuk pada buku ini.
5. Thompson Susabda Ngoen, Pengantar Algoritma dengan Bahasa C, Penerbit
Salemba Teknika, 2006
Cara
Cara Belajar
Belajar
1. Datang tepat waktu. Toleransi keterlambatan adalah 15 menit. Siswa
yang datang terlambat lebih dari 15 menit tetap berhak mengikuti kuliah,
tetapi dihitung sebagai tidak hadir.
2. Apabila ada kendala yang menyebabkan keterlambatan tidak dapat
dihindari, informasikan ke dosen lewat SMS (nama & alasan). Apabila
alasan dapat diterima, walau terlambat sekalipun absensi tetap dihitung
hadir.
3. Membuat catatan: misalnya dengan mem-print slide dan membuat
catatan pada slide
4. Ketinggalan sekali saja, akan berakibat fatal. Cukup berat memahami
kuliah berikutnya.
5. Kalau tidak faham segera bertanya
6. Kalau terlalu cepat, jangan segan minta agar diperlambat
7. Kalau terlalu lambat, jangan segan minta agar dipercepat
8. Mengulang materi yang diajarkan di rumah
9. Melatih SENDIRI kemampuan programming dari materi yang diajarkan
UJIAN
UJIAN LISAN
LISAN
10.Di akhir tiap kuliah akan diberikan beberapa soal untuk
latihan/PR
11.Minggu berikutnya diadakan UJIAN LISAN berdasarkan
soal yang diberikan sebagai PR
12.Nilai ujian lisan akan berpengaruh pada penentuan nilai
akhir
13.Saya ingin anda semua memperoleh 100 untuk ujian
LISAN. Karena itu silakan perbaiki nilai ujian lisan anda.
Perbaikan nilai ujian lisan dapat dilakukan di sebarang
waktu (konsultasikan waktu anda dengan saya via email
asnugroho@gmail.com)
14.Tidak ada Ujian Ulang ! Struktur Data dan Algoritma bukan
matakuliah yang dapat difahami dalam semalam !
Apakah
Apakah Algoritma
Algoritma &
& Struktur
Struktur
Data
Data itu
itu ??
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Ketentuan
Ketentuan &
& Asumsi
Asumsi
•
Menguasai pemakaian bahasa C, terutama
– pointer
– structure
•
Materi kuliah dapat didownload dari
http://asnugroho.net/lecture/ds.html
Agenda
Agenda
1
Pendahuluan: apakah algoritma & struktur data itu ?
Array: satu dimensi & multidimensi
2
Array & Pointer & Structure
Latihan array, pointer & structure
3
Computational Complexity
Latihan array, pointer & structure
4
Linear list, stack & queue (1)
Latihan
5
Linear list, stack & queue (2)
Latihan
6
Doubly-linked list & tree structure (1)
Latihan
Agenda
Agenda
7
Tree structure (2)
Latihan
8
Hash
Latihan
9
Sequential & Binary Search
Latihan
10
Selection sort & Insertion sort
Latihan pemrograman selection sort & insertion sort
11
Quick sort & Merge sort
Latihan pemrograman quick & merge sort
12
Review
Review
Tahapan
Tahapan dalam
dalam Pemrograman
Pemrograman
1.
2.
3.
Analisa masalah
Memilih algoritma dan struktur data untuk
menyelesaikan masalah itu
Coding
Programming tidak hanya sekedar mengetik di keyboard
Definisi
Definisi
Algoritma:
prosedur terbatas yang terdiri beberapa operasi
menyelesaikan suatu masalah (Ibaraki)
program:
algoritma yang diimplementasikan dalam
bahasa pemrograman tertentu
Struktur data
cara pengaturan data agar bisa disimpan memory
komputer secara efisien
Hubungan
Hubungan antara
antara Algoritma
Algoritma &
& Struktur
Struktur Data
Data
Wirth: algoritma + struktur data = program
• Algoritma →penyelesaian satu masalah secara
matematis
• Turing machine
– Model matematika komputer
– Memiliki tape dengan panjang tak terhingga sebagai
alat penyimpan ingatan (memory)
– Running time, kecepatan tak terhingga
• Padahal komputer yang ada sangat terbatas baik
memory maupun kecepatannya
Turing
Turing Machine
Machine
•
Status controller
•
head
…
•
Head bergeser ke kirikanan dengan
kecepatan tak terbatas
Head membaca/menulis
data pada pita
Panjang pita tak
terbatas
…
Pita 1 dimensi dengan panjang tak terhingga
Hubungan
Hubungan antara
antara Algoritma
Algoritma &
& Struktur
Struktur Data
Data
Di dunia nyata, kemampuan komputer maupun memory
sangat terbatas
1234.345
12.4
14.5
42.0
19.902
17.8
Hubungan
Hubungan antara
antara Algoritma
Algoritma &
& Struktur
Struktur Data
Data
• Performa algoritma yang ideal
– Memory yang diperlukan kecil,running time
singkat
• Tradeoff antara waktu dan ruang (memory)
Memory
Besar
Running time
Lama
Singkat
Kecil
Hubungan
Hubungan antara
antara Algoritma
Algoritma &
& Struktur
Struktur Data
Data
• Bagaimana data harus direpresentasikan saat membuat
program ?
Struktur data
List, stack, queue, tree, dll
• Algoritma yang baik + Struktur data yang tepat =
program yang baik
– Pemilihan algoritma dan struktur data yang tepat harus
mempertimbangkan skala data, CPU, memori, dsb.
– Perlu pengetahuan algoritma dan struktur apa saja yang
ada dan mungkin dipakai
Contoh
Contoh Algoritma:
Algoritma: BUBBLE
BUBBLE SORT
SORT
banyaknya data: n
Data diurutkan/disorting dari yang bernilai besar
Proses
step 1 :
step 2
:
:
…
step n-1
Periksalah nilai dua elemen mulai dari urutan ke-n
sampai urutan ke-1. Jika nilai kiri<kanan, tukarkan
kedua data itu.
Periksalah nilai dua elemen mulai dari urutan ke-n
sampai urutan ke-2. Jika nilai kiri<kanan, tukarkan
kedua data itu.
Periksalah nilai dua elemen mulai dari urutan ke-n
sampai urutan ke-n-1. Jika nilai kiri<kanan, tukarkan
kedua data itu.
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
4
5
8
10
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
4
5
10
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
4
10
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
10
4
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
7
4
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
7
4
8
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
7
8
4
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
4
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
5
4
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
5
4
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
5
4
Step-4
10
8
7
5
4
Perhatikan
Perhatikan !!
•
Apakah yang anda peroleh setelah satu iterasi dalam bubble sort
selesai ?
– Setelah iterasi pertama selesai, elemen dengan nilai terbesar akan
muncul di ujung paling kiri
– Setelah iterasi kedua selesai, elemen dengan nilai terbesar kedua
akan muncul pada urutan kedua dari kiri
– dst.
QUIZ
QUIZ
1.
Urutkan deret angka berikut dengan bubble sort
13 14 10 4 18 20 25 17
2.
Tuliskan hasil tiap langkah (step).
Bubble
Bubble Sort
Sort
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Contoh
Contoh Algoritma:
Algoritma: BUBBLE
BUBBLE SORT
SORT
banyaknya data: n
Data diurutkan/disorting dari yang bernilai besar
Proses
step 1 :
step 2
step n-1
Periksalah nilai dua elemen mulai dari urutan ke-n
sampai urutan ke-1. Jika nilai kiri<kanan, tukarkan
kedua data itu.
Periksalah nilai dua elemen mulai dari urutan ke-n
sampai urutan ke-2. Jika nilai kiri<kanan, tukarkan
kedua data itu.
:
:
Periksalah nilai dua elemen mulai dari urutan ke-n
sampai urutan ke-n-1. Jika nilai kiri<kanan, tukarkan
kedua data itu.
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
4
5
8
10
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
4
5
10
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
4
10
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
7
10
4
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
7
4
5
8
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
7
4
8
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
7
8
4
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
4
5
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
5
4
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
5
4
Bubble
Bubble Sort:
Sort: tahap
tahap demi
demi tahap
tahap
Awal
7
4
5
8
10
Step-1
10
7
4
5
8
Step-2
10
8
7
4
5
Step-3
10
8
7
5
4
Step-4
10
8
7
5
4
Perhatikan
Perhatikan !!
• Apakah yang anda peroleh setelah satu iterasi dalam bubble sort
selesai ?
– Setelah iterasi pertama selesai, elemen dengan nilai terbesar akan
muncul di ujung paling kiri
– Setelah iterasi kedua selesai, elemen dengan nilai terbesar kedua
akan muncul pada urutan kedua dari kiri
– dst.
C
C Program
Program untuk
untuk Bubble
Bubble Sort
Sort
void bubble_sort(int x[ ], int datanum)
{
int i,j;
int tmp;
for(i=0;i<datanum-1;i++)
for(j=datanum-1;j>i;j--) {
if( x[j-1] < x[j]) {
tmp=x[j];
x[j]=x[j-1];
x[j1]=tmp;
}
}
}
#include
<stdio.h>
bubble_sort(int x[],int datanum)
{
int i,j;
int tmp;
for(i=0;i<datanum-1;i++)
for(j=datanum-1;j>i;j--)
if( x[j-1] < x[j]) {
tmp=x[j];
x[j]=x[j-1];
x[j-1]=tmp;
}
}
int main(void)
{
int i;
int data[10]= {10,3,2,1,4,7,6,9,5,8};
bubble_sort(data,10);
for(i=0;i<10;i++){
printf("%d %d\n",i,data[i]);
}
}
Computational
Computational Complexity
Complexity
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Agenda
Agenda
1
Pendahuluan: apakah algoritma & struktur data itu ?
Array & Pointer & Structure (1): satu dimensi & multidimensi
2
Array & Pointer & Structure (2)
Array & Pointer & Structure (3)
3
Computational Complexity
Array & Pointer & Structure (4)
4
Linear list, stack & queue (1)
Latihan
5
Linear list, stack & queue (2)
Latihan
6
Doubly-linked list & tree structure (1)
Latihan
Agenda
Agenda
7
Tree structure (2)
Latihan
8
Hash
Latihan
9
Sequential & Binary Search
Latihan
10
Selection sort & Insertion sort
Latihan pemrograman selection sort & insertion sort
11
Quick sort & Merge sort
Latihan pemrograman quick & merge sort
12
Review
Review
Apakah
Apakah program
program yang
yang baik
baik itu
itu ??
Bagaimanakah cara membuat program yang baik ?
Algoritma yang tepat/sesuai dengan masalah
+pemilihan struktur data yang tepat
Bagaimana mengukur baik-tidaknya sebuah algoritma ?
”Order sebuah algoritma”
Computational complexity sebuah algoritma
Bagaimana mengukur kualitas sebuah algoritma ?
Sortinglah deretan angka di bawah ini :
1
5
3
2
100
12
25
17
23
13 …
Algoritma sorting sangat bervariasi.
Bagaimana memilih algoritma yang terbaik ?
Apakah
Apakah WAKTU
WAKTU merupakan
merupakan parameter
parameter tepat
tepat
untuk
untuk mengukur
mengukur kualitas
kualitas sebuah
sebuah algoritma
algoritma ??
Cepat tidaknya jalannya sebuah program sangat
bergantung kepada arsitektur komputer
Komputer tua/lambat
1 jam
Komputer baru/cepat
1 detik
Waktu bukan parameter yang baik,
karena sangat tergantung arsitektur komputer
Apakah
Apakah WAKTU
WAKTU merupakan
merupakan parameter
parameter tepat
tepat
untuk
untuk mengukur
mengukur kualitas
kualitas sebuah
sebuah algoritma
algoritma ??
Waktu yang diperlukan untuk menjalankan sebuah
program juga sangat tergantung kualitas code
(kemampuan programmer), walaupun dijalankan pada
komputer yang sama
Program yang ditulis A
10 s
Program yang ditulis B
30 s
Standar
Standar evaluasi
evaluasi Algoritma
Algoritma
• Pada prinsipnya diukur berdasarkan waktu
eksekusi/menjalankan program tsb.
• Masalah:
1. Sangat tergantung pada komputer yang dipakai untuk
menjalankan program
2. Sangat tergantung pada kualitas programmer dalam
menuliskan program
Evaluasi memakai computational
Complexity (Big Oh notation)
Complexity
Complexity
• Definisi:
Waktu yang diperlukan untuk menjalankan sebuah
algoritma pada sebuah komputer virtual, yang
direpresentasikan secara “kasar” sebagai fungsi dari n (n
adalah banyaknya input data)
• Karakteristik: tidak dipengaruhi oleh hardware komputer
maupun kemampuan programming
•
O
: representasi worst-case complexity
2
O(n )
Complexity algoritma berbanding lurus
terhadap n2 (n adalah banyaknya input data)
Worst
Worst case
case vs
vs Average
Average complexity
complexity
• Worst case complexity: mengasumsikan input data
dalam kondisi terburuk
• Average complexity:sulit untuk dihitung
• Umumnya algoritma dievaluasi berdasarkan worst case
complexity
• Contoh perkecualian
Quicksort
2
Worst case complexity: O(n )
Average complexity:
O(n logn)
Karakteristik
Karakteristik worst
worst case
case complexity
complexity O
O( f (n)) + O(g(n)) = O(max(f (n), g(n)))
Dua operasi yang berturutan dengan complexity masing-masing
dalam fungsi f dan g, maka complexity total adalah yang
terbesar antara f dan g
O( f (n)) ⋅ O(g(n)) = O( f (n) ⋅ g(n))
Bila sebuah operasi dengan complexity O(f(n)) dijalankan
pada O(g(n)) kali, maka complexity total operasi tersebut
adalah f x g
O
Catatan
Catatan Penting
Penting
• Big Oh notation merepresentasikan evaluasi algoritma
terhadap input data sebanyak n
• Nilai yang berada dalam tanda kurung () adalah 1, log n, n,
n2, n pangkat bilangan bulat yang lain
• Notasi ini mengabaikan koefisien berupa konstanta seperti
2, 100, 0.1, atau berupa variabel a
Contoh:
O(2n) ditulis sebagai O(n), karena 2 diabaikan
Contoh
Contoh
O(3n 2 ) + O(2n) =
O ( n 2 ) + O ( n)
= O(max(n 2 , n))
O(n 2 )
=
O(n2 ) + O(n) = O(max(n2 , n))
2
=
O(n )
O(n 2 )O(n) = O(n 2 .n)
= O(n 3 )
22dst
Relasi
nilai
n,
log
(n),
n
Relasi nilai n, log (n), n dst
2
1 logn n n logn n
3
n
kecil
k
L n
n
log n
n log n
n*n
n*n*n
2^n
1
0.00
0.00
1
1
2
2
1.00
2.00
4
8
4
3
1.58
4.75
9
27
8
4
2.00
8.00
16
64
16
5
2.32
11.61
25
125
32
6
2.58
15.51
36
216
64
7
2.81
19.65
49
343
128
8
3.00
24.00
64
512
256
9
3.17
28.53
81
729
512
10
3.32
33.22
100
1000
1024
11
3.46
38.05
121
1331
2048
n
2
besar
Hafalkan
urutan di
atas !
Catatan
Catatan dalam
dalam memilih
memilih algoritma
algoritma
1.
2.
3.
4.
Compexity saja tidak cukup
Contoh: Hash memiliki complexity yang kecil. Tetapi memiliki
beberapa kelemahan seperti hilangnya informasi urutan
registrasi data, masalah pada memory dsb.
Untuk data berskala kecil, tidak selamanya algoritma yang ordernya
kecil selalu lebih baik daripada algoritma yang berorder besar
(algoritma yang berorder kecil, bisa jadi memiliki koefisien konstanta
bernilai besar)
Algoritma yang berorder kecil kadangkala memerlukan waktu yang
lebih lama dalam proses coding (penulisan program)
program yang sering dipakai: pilihlah algoritma yang berorder
complexitykecil
program yang hanya sekali pakai (jarang): pilihlah yang paling
mudah dalam proses coding
Trade of antara waktu dan memory
Complexity
Complexity Bubble
Bubble Sort
Sort
Hitunglah complexity bubble sort !
1. void bubble_sort(int x[ ], int datanum)
2. {
3.
int i,j;
4.
int tmp;
5.
for(i=0;i<datanum-1;i++)
6.
for(j=datanum-1;j>i;j--)
7.
if( x[j-1] < x[j]) {
8.
tmp=x[j];
9.
x[j]=x[j-1];
10.
x[j-1]=tmp;
11.
}
12. }
Complexity
Complexity Bubble
Bubble Sort
Sort
1.
2.
3.
Baris ke-5:
area kuning
array scanning dari kiri ke kanan diulang sebanyak
(n-1) kali
Complexity: O(n)
Baris ke-6: area hijau
array scanning dari kanan ke kiri, tiap 2 buah data
dibandingkan dan jika urutan besar-kecilnya tidak benar,
kedua data di swap.
Rata-rata: n/2
Complexity: O(n)
Baris ke 7-11: area abu-abu
tidak ada loop
complexity: O(1)
Total complexity:
O(n) x O(n) x O(1) = O(n2)
Latihan
Latihan
Sederhanakan notasi berikut
O(3n 2 + log n) + O(n log n + 3n) =
O(n log n + 4n)O(4n) =
O(2 n ) + O (10n log n + 2n 2 + log n) + O (30 log n + 3n) =
List,
List, Stack
Stack &
& Queue
Queue
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Beberapa
Beberapa Jenis
Jenis Struktur
Struktur Data
Data
1. Array
1. Linear List
2. Stack
3. Queue
1. Apa ?
2. Bagaimana cara implementasinya ?
2. List
1. Connected List
2. Circular List
3. Doubly-linked List
4. Multi list structure
3. Tree Structure
Linear
Linear List
List
Apakah
Apakah Linear
Linear List
List itu
itu ??
•
Sekumpulan elemen yang diatur secara terurut
x[1], x[2],L, x[k −1], x[k], x[k +1],L, x[n]
•
Linear List tidak sama dengan Connected-List
Operasi
Operasi pada
pada Linear
Linear List
List
No.
Operasi
1
Menambahkan sebuah elemen sebelum elemen ke-k
2
Menghapus elemen ke-k
3
Membaca/menulis isi elemen ke-k
4
Mencari elemen dengan key tertentu
5
Menggabungkan beberapa list menjadi satu
6
Memecah sebuah list ke beberapa buah
7
Mengcopy sebuah list
8
Menghitung banyaknya elemen dalam sebuah list
List,
List, Stack
Stack &
& Queue
Queue
• Tidak semua operasi list diperlukan pada setiap program
– Penentuan struktur data didasarkan pada operasi yang
diperlukan saja agar bisa berjalan dengan efisien
• Pada sebuah Linear List, penyisipan dan penghapusan
elemen dapat dijalankan di sebarang posisi
• Bentuk khusus linear list:
Penambahan elemen dan penghapusannya
dilakukan di posisi terdepan atau
posisi terbelakang saja
Stack
Queue
Stack dan Queue juga merupakan salah satu jenis list
List,
List, Stack
Stack &
& Queue
Queue
• Pada sebuah Linear List, penyisipan dan penghapusan
elemen dapat dijalankan di sebarang posisi
• Penambahan dan penghapusan elemen pada stack/queue
dilakukan di posisi terdepan atau posisi terbelakang saja
1
2
3
4
5
6
Stack
1
2
3
4
5
6
Queue
1
2
3
4
5
6
List
Stack
Stack
Apakah
Apakah Stack
Stack itu
itu ??
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi PUSH : Menambahkan elemen pada sebuah stack
PUSH
1
top== bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi PUSH : Menambahkan elemen pada sebuah stack
PUSH
2
1
top
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi PUSH : Menambahkan elemen pada sebuah stack
PUSH
3
top
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi PUSH : Menambahkan elemen pada sebuah stack
PUSH
4
top
3
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi PUSH : Menambahkan elemen pada sebuah stack
5
PUSH
top
4
3
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi PUSH : Menambahkan elemen pada sebuah stack
6
top
5
PUSH
4
3
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi POP : Menghapus sebuah elemen dari sebuah
top
stack
6
5
POP
4
3
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi POP : Menghapus sebuah elemen dari sebuah
stack
5
POP
top
4
3
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi POP : Menghapus sebuah elemen dari sebuah
stack
POP
4
top
3
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi POP : Menghapus sebuah elemen dari sebuah
stack
POP
3
top
2
1
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi POP : Menghapus sebuah elemen dari sebuah
stack
POP
2
1
top
bottom
Apakah
Apakah Stack
Stack itu
itu ??
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
• Yang dihapus adalah elemen yang paling terakhir
ditambahkan
• Nama lain: LIFO (Last In First Out)
• Operasi POP : Menghapus sebuah elemen dari sebuah
stack
POP
1
top==bottom
Apakah
Apakah Stack
Stack itu
itu ??
PUSH dan POP
Stack
Stack Overflow
Overflow &
& Stack
Stack Underflow
Underflow
• Stack Overflow
Menambahkan data pada sebuah stack yang telah penuh
• Stack Underflow
Menghapus data dari sebuah stack yang sudah kosong
Queue
Queue
Apakah
Apakah Queue
Queue itu
itu ??
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi ENQUEUE: menambahkan data pada sebuah list
ENQUEUE
1
front==rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi ENQUEUE: menambahkan data pada sebuah list
ENQUEUE
1
front
2
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi ENQUEUE: menambahkan data pada sebuah list
ENQUEUE
1
front
2
3
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi ENQUEUE: menambahkan data pada sebuah list
ENQUEUE
1
front
2
3
4
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi ENQUEUE: menambahkan data pada sebuah list
ENQUEUE
1
front
2
3
4
5
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi ENQUEUE: menambahkan data pada sebuah list
ENQUEUE
1
front
2
3
4
5
6
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi DEQUEUE: menghapus data pada sebuah list
DEQUEUE
1
front
2
3
4
5
6
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi DEQUEUE: menghapus data pada sebuah list
DEQUEUE
2
front
3
4
5
6
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi DEQUEUE: menghapus data pada sebuah list
DEQUEUE
3
front
4
5
6
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi DEQUEUE: menghapus data pada sebuah list
DEQUEUE
4
front
5
6
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi DEQUEUE: menghapus data pada sebuah list
DEQUEUE
5
front
6
rear
Apakah
Apakah Queue
Queue itu
itu ??
• Penambahan data dilakukan pada sebuah ujung sebuah list,
sedangkan penghapusan data dilakukan pada ujung yang
lain
• Data yang dihapus adalah data yang paling awal
ditambahkan
• Nama lain: FIFO (First In First Out)
• Operasi DEQUEUE: menghapus data pada sebuah list
DEQUEUE
6
front==rear
Animasi
Animasi Queue
Queue
ENQUEUE dan DEQUEUE
Latihan
Latihan 11
• Gambarkan kondisi stack setelah dilakukan operasi
berikut:
push(10);
push(2);
pop();
push(20);
pop();
push(15);
push(5);
2
10
10
Latihan
Latihan 22
• Gambarkan kondisi queue setelah dilakukan operasi
berikut:
enqueue(10);
10
enqueue(32);
enqueue(5);
dequeue();
enqueue(10);
dequeue();
dequeue();
10
32
Beberapa jenis struktur data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1.
2.
3.
4.
Connected List
Circular List
Doubly-linked List
Multi list structure
3. Tree Structure
1. Apa ?
2. Bagaimana cara implementasinya ?
Implementasi Linear List
• List size (banyaknya elemen): n
x[1], x[ 2], L , x[ k − 1], x[ k ], x[ k + 1], L , x[ n]
• Memasukkan (menyisipkan) data baru sebelum data
no.k
①Mencari posisi dimana data harus dimasukkan
31
10
12
14
16
1
2
3
4
…
…
18
20
k-1 k
22
24
k+1 k+2
…
26
n
Implementasi Linear List
• List size (banyaknya elemen): n
x[1], x[ 2], L , x[ k − 1], x[ k ], x[ k + 1], L , x[ n]
• Memasukkan (menyisipkan) data baru sebelum data
no.k
31
② data sesudah no.k digeser
(shift) satu ke belakang
10
12
14
16
1
2
3
4
…
…
18
k-1 k
20
22
k+1 k+2
24
…
n
26
Implementasi Linear List
• List size (banyaknya elemen): n
x[1], x[ 2], L , x[ k − 1], x[ k ], x[ k + 1], L , x[ n]
• Memasukkan (menyisipkan) data baru sebelum data
no.k
• Rata-rata shift data: n/2
Computational complexity:
O (n)
10
12
14
16
1
2
3
4
…
…
18
31
k-1 k
20
22
k+1 k+2
24
…
26
n+1
Implementasi Linear List
• Membaca/menulis konten sebuah data: O(1) random
access
• Penambahan data: O(n)
• Penghapusan data: O(n)
Stack
lambat
Queue
efisien dalam komputasi
Beberapa jenis struktur data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1.
2.
3.
4.
Connected List
Circular List
Doubly-linked List
Multi list structure
3. Tree Structure
1. Apa ?
2. Bagaimana cara implementasinya ?
Implementasi Stack memakai Array
• Penambahan dan penghapusan elemen dilakukan pada
elemen list yang terletak di paling depan
top
n (stack pointer)
Menunjuk ke satu posisi di atas top
x[n-1]
x[n-2]
…
Menambahkan data ke stack (PUSH)
x[n++] = data;
x[3]
x[2]
x[1]
bottom
x[0]
Menghapus data dari stack (POP)
data =x[--n];
Saat PUSH/POP dilakukan, jangan lupa
mengupdate stack pointer
Suplemen (cara pemakaian ++ dan --)
n++
n --
setelah diproses n = n + 1
setelah diproses n = n – 1
x[7]
10
x[6]
x[5]
13
x[4]
9
x[3]
5
x[2]
14
x[1]
2
x[0]
3
7
++n sebelum diproses n = n + 1
-- n sebelum diproses n = n – 1
n=3;
printf(“%d\n”,x[n]); 5
3
printf(“%d\n”, n);
printf(“%d\n”,x[++n]); 9
printf(“%d\n”, n);
4
printf(“%d\n”,x[n++]); 9
5
printf(“%d\n”, n);
printf(“%d\n”,x[n--]); 7
printf(“%d\n”, n);
4
printf(“%d\n”,x[--n]); 5
printf(“%d\n”, n);
3
Implementasi Stack
• 4 operasi utama dalam implementasi stack
1.init :inisialisasi stack (mengosongkan stack)
2. push:menambahkan data pada stack
3. pop :menghapus data dari stack
4. empty:memeriksa apakah stack sudah kosong
atau tidak
Reverse Polish Notation (RPN)
•
•
•
Reverse Polish Notation: menaruh operator di
belakang
Nama lain : postfix notation
Implementasi RPN memakai stack
1. Jika “angka”, tambahkan pada stack
2. Jika “operator”, turunkan (POP) dua buah data dari
stack, lakukan perhitungan, dan tambahkan (PUSH)
hasilnya pada stack
Reverse Polish Notation (RPN)
•
Downloadlah program dari situs kuliah, compile dan
jalankan
•
Cara penulisan
A+B
A B +
A −B
A / B
A B −
A B /
A ∗ B
A B ∗
Reverse Polish Notation (RPN)
while ((c = getchar()) != EOF) {
Setelah baris ke-67
if (isdigit(c)) {
ungetc(c, stdin);
Jika input data adalah angka, baca ulang
scanf("%ld", &x);
Data tsb dan PUSH-lah data itu pada stack
push(x);
}
x
else {
switch (c) {
?
case '+':
?
b = pop(); a = pop();
push(a + b);
Jika input data itu bukan angka, lakukan
perhitungan sesuai dengan operasi yang
break;
ditunjukkan oleh input data tsb. (+,-,*,/)
case '-':
…
….
}
}
}
switch (c) {
case '+':
b = pop(); a = pop();
Jika operator itu ‘+'
push(a + b);
break;
case '-':
b = pop(); a = pop();
Jika operator itu ‘-'
push(a - b);
break;
case '*':
b = pop(); a = pop();
Jika operator itu ‘∗'
push(a * b);
break;
case '/':
b = pop(); a = pop();
Jika operator itu ‘/'
push(a / b);
break;
case '\n':
if (! empty())
printf(“Jawab: %ld \n", pop()); Jika return key
init();
break;
pop
pop
push
b
a
a+b
?
?
?
?
Reverse Polish Notation (RPN)
Contoh-1
10 + 5
Data di PUSH ke stack
Jika operator, lakukan operasi
pada dua data terakhir yang di
PUSH ke stack
10 5 +
+
10
5
5
10
10
push(10) push(5) 10+5
hitung !!
15
Reverse Polish Notation (RPN)
Contoh-2
10 / 5
Data di PUSH ke stack
Jika operator, lakukan operasi
pada dua data terakhir yang di
PUSH ke stack
10 5 /
/
10
5
5
10
10
push(10) push(5) 10/5
hitung !!
2
Reverse Polish Notation (RPN)
Contoh-3
10 * (5 +4)
A∗B→AB∗
(banyaknya input > 2)
10, (5+4) , *
A+B→AB+
10 , ( 5, 4, +), *
10 5 4 + *
+
10
∗
4
4
5
5
5
9
9
10
10
10
10
10
90
Reverse Polish Notation (RPN)
⎛ 12 ⎞ ⎛ 14 ⎞
⎜ 6 − ⎟, ⎜ ⎟,*
3⎠⎝2⎠
⎝
Contoh-4
⎛ 12 ⎞ 14
⎜6 − ⎟∗
3⎠ 2
⎝
⎛ ⎛ 12 ⎞ ⎞
⎜⎜ 6, ⎜ ⎟,− ⎟⎟, (14,2, /),*
⎝ ⎝3⎠ ⎠
(6, (12,3, /),−), (14,2, /),*
6 12 3 / − 14 2 / *
/
3
6
/
−
3
12 12 12 4
4
6
6
6
6
6
2
2
∗
2
14 14 14 7
7
2
2 14
2
2
2
Latihan 1
a) Ubahlah perhitungan di bawah ke dalam RPN
12 ⎛
16 ⎞
* ⎜ 25 − ⎟
3 ⎝
4⎠
40
+2
10
b) Implementasikan perhitungan di atas dengan stack,
dan gambarkan kondisi stack tiap tahap
Beberapa jenis struktur data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1.
2.
3.
4.
Connected List
Circular List
Doubly-linked List
Multi list structure
3. Tree Structure
1. Apa ?
2. Bagaimana cara implementasinya ?
Implementasi Queue
•
•
•
Implementasi queue lebih sulit daripada stack. Pada stack,
penambahan dan penghapusan data hanya dilakukan pada satu
ujung saja, sehingga cukup mengubah posisi pointer sesuai dengan
penambahan/pengurangan data
Implementasi queue, harus mengubah posisi DUA buah pointer,
yaitu pointer yang menunjuk ke FRONT, dan pointer yagn menunjuk
ke REAR
Ada dua cara implementasi queue:
rear
stack
front
queue
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
ujung depan
…
ujung belakang
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi
pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
ujung depan
…
ujung belakang
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi
pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
ujung depan
…
ujung belakang
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
ujung depan
…
ujung belakang
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
ujung depan
…
ujung belakang
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
front
Array x
…
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
rear
front
Array x
…
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer
agar menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT
• Saat front==rear, berarti queue kosong
front==rear
Array x
…
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Queue adalah pada
bagian yang berwarna hijau
Masalah yang timbul pada Cara 1
Front dari rear selalu bertambah secara motononik,
sehingga memerlukan array dengan ukuran tak
terhingga
front
array x …
rear
x3 x4 x5 x6 x7 x8 x9 x10 x11 x12
…
Pointer selalu bergerak ke kanan,
tak pernah kembali
Menyambungkan FRONT dan REAR dari array itu
sehingga membentuk cincin (RING BUFFER)
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke queue:
nilai rear dinaikkan satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke
queue: nilai rear dinaikkan
satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke
queue: nilai rear dinaikkan
satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke
queue: nilai rear dinaikkan
satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke queue:
nilai rear dinaikkan satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke queue:
nilai rear dinaikkan satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke queue:
nilai rear dinaikkan satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
rear
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke queue:
nilai rear dinaikkan satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
front
Queue adalah pada
bagian yang berwarna hijau
Cara 1
•
n-2
n-1
0
1
•
•
•
Array dibuat seperti cincin,
dimana elemen terakhir
disambungkan dengan elemen
pertama
Menambahkan data ke queue:
nilai rear dinaikkan satu
Menghapus data dari queue:
nilai front dinaikkan satu
Queue kosong pada saat
front==rear
rear==front
Queue adalah pada
bagian yang berwarna hijau
Masalah pada Ring Buffer
• Pada saat rear==front , ada dua interpretasi yang
muncul, “queue kosong” ataukah “queue full”
n-2
n-1
0
1
n-2
n-1
empty
rear==front
0
1
full
rear==front
Queue adalah pada
bagian yang berwarna hijau
Masalah pada Ring Buffer
• Solusi
– Menyiapkan sebuah FLAG untuk
memberi tanda kalau queue kosong
– Queue dijaga agar tidak pernah full,
dengan menyisakan sebuah elemen
yang kosong
n-2 n-1 0
1
Tugas
• Downloadlah program stack.c dan selesaikan fungsi
push dan pop !
• Jelaskan operasi yang dilakukan pada tiap baris
program stack.c itu
Tugas
• Downloadlah program simulasi QUEUE: queue.c dan
selesaikan fungsi-fungsi sbb.
– void enqueue(char *x)
– void dequeue()
– Void queue_print()
• Implementasi memakai RING BUFFER, dengan selalu
menyisakan sebuah elemen kosong
• Queue size: 5 (fixed)
• Input yang dimasukkan berupa character string
Contoh hasil eksekusi
[1] tambahkan task [2] eksekusi [3] selesai
Isi task: baca buku
Kondisi QUEUE:
[0] baca buku
1
[1] tambahkan task [2] eksekusi [3] selesai 1
Isi task: membuat program
Kondisi QUEUE:
[0] baca buku [1] membuat program
[1] tambahkan task [2] eksekusi [3] selesai
Menjalankan task: baca buku
Kondisi QUEUE:
[1] membuat program
2
Hint
• Dalam fungsi enqueue/dequeue, posisi pointer front dan
rear harus diupdate sehingga menunjuk ke posisi yang
benar
– Pengubahan posisi tsb. Memakai fungsi next()
– Pada fungsi next(), sisa pembagian dihitung dengan
cara membaginya dengan QUEUE_SIZE, sehingga
jika nilai itu melebih QUEUE_SIZE, dia akan kembali
ke ujung depan queue.
– Posisi berikutnya dihitung dengan
posisiberikutnya =next(posisi saat ini)
Pembahasan STACK.C
• Implementasi program STACK memakai array
kosong
kosong
4
stack_size
data
stack_pointer (top +1)
top
3
2
1
bottom
push()
void push(int *x,int val)
{
if(stack_pointer > stack_size-1) {
printf(“Stack overflow\n”); //memeriksa apakah overflow atau
tidak
}
else {
x[stack_pointer++]=val;//tambahkan data pada stack
}
stack_pointer
}
kosong stack_pointer
kosong
4
3
2
1
kosong
val
4
3
2
1
pop()
void pop(int *x)
{
Pada program ini,
penghapusan data tidak
perlu dilakukan. Cukup
dengan mengubah posisi
stack_pointer
if(stack_pointer <= 0) {
printf("Stack underflow\n");
}
else {
stack_pointer--; // menurunkan stack pointer
}
}
kosong
val
4
3
2
1
stack_pointer
kosong
val
4
3
2
1
stack_pointer
Tugas: QUEUE.C
• Downloadlah program simulasi QUEUE: queue.c dan
selesaikan fungsi-fungsi sbb.
– void enqueue(char *x)
– void dequeue()
– Void queue_print()
• Implementasi memakai RING BUFFER, dengan selalu
menyisakan sebuah elemen kosong
• Queue size: 5 (fixed)
• Input yang dimasukkan berupa character string
Contoh hasil eksekusi
[1] tambahkan task [2] eksekusi [3] selesai
Isi task: baca buku
Kondisi QUEUE:
[0] baca buku
1
[1] tambahkan task [2] eksekusi [3] selesai 1
Isi task: membuat program
Kondisi QUEUE:
[0] baca buku [1] membuat program
[1] tambahkan task [2] eksekusi [3] selesai
Menjalankan task: baca buku
Kondisi QUEUE:
[1] membuat program
2
Hint
• Dalam fungsi enqueue/dequeue, posisi pointer front dan
rear harus diupdate sehingga menunjuk ke posisi yang
benar
– Pengubahan posisi tsb. Memakai fungsi next()
– Pada fungsi next(), sisa pembagian dihitung dengan
cara membaginya dengan QUEUE_SIZE, sehingga
jika nilai itu melebih QUEUE_SIZE, dia akan kembali
ke ujung depan queue.
– Posisi berikutnya dihitung dengan
posisiberikutnya =next(posisi saat ini)
queue,front,rear
Memakai next untuk
maju satu kotak
Memakai next untuk
maju satu kotak
front
queue
0
1
rear
2
3
4
5
6
7
データ格納領域
queue[front]
Ujung depan queue. Dari
sini dapat dihapus (dequeue)
queue[rear]
Bagian ekor dari queue.
Di sinilah data baru dimasukkan
Fungsi next akan bergerak maju terus, dan setelah
sampai ujung kanan akan berpindah ke kotak 0
enqueue()
next
Kondisi full
rear
queue
0
1
2
3
rear front
4
0
1
queue[rear]
void enqueue(char *x)
{
// Periksalah terlebih dahulu, apakah queue itu full atau tidak
// Jika tidak full, tambahkan baru ke queue
// Selesaikan fungsi ini
if (next(rear) == front)
error("Queue sudah penuh\n");
else {
sprintf(queue[rear],x);
rear=next(rear);
}
}
2
3
4
dequeue()
// DEQUEUE sebuah task dari queue, dan menjalankannya
void dequeue()
{
char *x;
// Periksalah apakah queue itu kosong atau tidak
// Jika tidak kosong, DEQUEUE-lah sebuah elemen
// dari queue, dan tampilkan pada layar baris sbb.
// "Menjalankan task: (isi task)"
// Selesaikan fungsi ini
if (empty())
queue
error("Queue kosong\n");
else {
x=queue[front];
front=next(front);
printf("\tMenjalankan task: %s\n",x);
}
}
next
front
0
1
2
3
4
queue[front]
queue_print()
front
queue
// Menampilkan isi QUEUE
void queue_print()
{
0
rear
1
2
4
Pada queue[i]
i digerakkan dari front sampai
ke rear
// Selesaikan fungsi ini
int i;
printf("Kondisi QUEUE:\n");
for(i=front;i != rear; i=next(i))
printf("\t[%d] %s ", i, queue[i]);
printf("\n");
}
3
Linked List
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Beberapa jenis struktur data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1.
2.
3.
4.
Linked List
Circular List
Doubly-linked List
Multi list structure
3. Tree Structure
1. Apa ?
2. Bagaimana cara implementasinya ?
Apakah Linked List itu ?
• Elemen (disebut dengan CELL, atau SEL dalam bahasa
Indonesia) yang mungkin terletak terpisah-pisah di
memory, disambungkan dengan pointer.
• Tiap sel berisi dua informasi : nilai dan pointer ke sel
berikutnya
nilai
nilai
Pointer to next CELL
nilai
Pointer to next CELL
CELL
Pointer to next CELL
Mengapa memakai Linked List ?
1.
2.
3.
4.
Mudah untuk menambahkan dan menghapus elemen
(pada array tidak mungkin menambahkan elemen,
karena banyaknya elemen sudah ditentukan dari
awal)
Panjang list bisa diubah dengan bebas (panjang array
fixed)
Mudah untuk menyambungkan beberapa list, maupun
memutuskannya (array tidak bisa)
Memungkinkan user mendesain struktur data yang
kompleks
Array vs Linked List
Array
Linked List
Penambahan dan Tidak mungkin Mungkin
penghapusan
elemen
Panjang list
Fixed
Bisa diubah
Akses ke elemen
O(1)
O(n)
Random
access
Sequential access
(harus mengikuti pointer satu
demi satu)
lambat
cepat
Array vs Linked List
header
1
a[0]
2
a[1]
3
a[2]
13
address 13
1 18
value
int a[3];
int n;
Array
Address tiap sel berurutan
address 18
2 24
address 24
3
value next
value next
Pointer ke sel berikutnya
(next)
(NULL)
struct CELL {
struct CELL *next;
int
value;
} ∗header;
Linked List
Address tidak berurutan
Akses ke tiap sel dimulai dari header
NULL POINTER
• Nilai yang dimiliki sebuah pointer adalah address pada
memory dimana data tersimpan
• Pointer yang tidak menunjuk ke address manapun
disebut dengan NULL pointer. Maksudnya, satu kondisi
khusus dimana pointer itu belum diset dengan sebuah
address tertentu
• Pada stdio.h biasanya didefinisikan dengan nilai 0
• Saat fungsi fopen,malloc dieksekusi, jika terdapat error,
maka nilai yang dikembalikan adalah NULL
Pada kuliah ini, NULL disimbolkan
dengan kotak yang diberi garis diagonal
AKSES SEKUENSIAL
z
z
Sel berisi (value + pointer ke sel berikutnya)
Akses hanya bisa dilakukan searah saja, dari ujung
depan ke arah belakang. Akses berlawanan arah tidak
dapat dilakukan.
Cara menampilkan isi seluruh list :
struct CELL *p;
for(p=header;p!=NULL;p=p->next) printf(“%d\n”,p->value);
header
12
pointer
25
12
1
25
value pointer
2
37
37
value pointer
3
結果:
1
2
3
value pointer
Pointer p digerakkan ke kanan dengan cara p=p->next
Cara menampilkan isi sel tertentu
• Pada array (misalnya nama array: a), isi sel tertentu
dapat ditampilkan dengan cara a[nomer urut sel
keberapa]. Misalnya a[5] akan menampilkan isi sel ke-6.
Hal ini karena satu sel dengan sel yang lain terletak
pada posisi yang berurutan di memory.
• Pada linked list, kita tidak tahu secara langsung, sel itu
terletak dimana dalam memory.
Akses harus dilakukan satu persatu, urut mulai dari sel
terdepan
Cara menampilkan isi sel tertentu
Tampilkan isi (value) sel ke-3 !
address
header
37
37
4
38
38
2
40
40
13
Sel ke-1
pointer
Sel ke-1→ isi:
value=4
address sel berikutnya=38
52
52
40 NULL
Cara menampilkan isi sel tertentu
Tampilkan isi (value) sel ke-3 !
address
header
37
37
4
38
Sel ke-1
38
2
40
40
13
Sel ke-2
pointer
Sel ke-2→ isi:
value=2
address sel berikutnya=40
52
52
40 NULL
Cara menampilkan isi sel tertentu
Tampilkan isi (value) sel ke-3 !
address
header
37
37
4
38
Sel ke-1
38
2
40
Sel ke-2
40
13
52
52
40 NULL
Sel ke-3
pointer
Sel ke-3→ isi:
value=13
address sel berikutnya=52
Sampai di sini sudah
bisa menampilkan
isi sel ke-3
Operasi pada Linked List
1.
2.
3.
Menambahkan data pada linked list
1. Menambahkan sel baru yang terletak setelah
sebuah sel tertentu
2. Menambahkan sel baru pada posisi terdepan
sebuah linked list
Menghapus data pada linked list
1. Menghapus sebuah sel yang terletak setelah
sebuah sel tertentu
2. Menghapus sel pada posisi terdepan sebuah linked
list
Syarat-syarat pada perbatasan
Menambahkan sel baru
1.
2.
3.
Membuat sel yang akan ditambahkan (memakai
malloc)
Mengeset “value” pada sel itu
Mengeset pointer “next” yang menunjukkan koneksi
antara satu sel dengan yang lain
Catatan penting:
Pada linked list, penambahan sebuah sel
baru hanya bisa dilakukan pada posisi
sesudah sel tertentu, tetapi tidak dapat
ditambahkan pada posisi sebelum sel tsb.
Contoh penambahan sel baru
Here!
header
37
4
37
38
2
next
38
sel ke-1
40
13
next
40
sel ke-2
52
40
next
52
sel ke-3
next
sel ke-4
3
Ingin menambahkan sel
37
37
4
38
sel ke-1
sesudah sel ke-3(value=13)
100
38
2
40
sel ke-2
40
13
3
3
sel ke-3
100
52
52
40
sel ke-4
Koneksi pada
pointer next disesuaikan
Menambahkan sel baru setelah sel yang
ditunjuk oleh pointer x
(1)Sediakan pointer p yang menunjuk ke sebuah sel
struct CELL *p;
(2)Buatlah sebuah sel baru dengan malloc() (alokasi
memory) yang dimulai dengan address yang ditunjukkan
oleh pointer p
(3)Set-lah value pada sel p
Masukkan sel p
p
(4)Modifikasi pointer
p->next = x->next;
18
next
Alokasi memory
x->next = p;
9
dengan malloc
x
20
5
next
24
24
13
28
28
2
73
Menambahkan sel baru setelah sel yang
ditunjuk oleh pointer x
(1)Sediakan pointer p yang menunjuk ke sebuah sel
struct CELL *p;
(2)Buatlah sebuah sel baru dengan malloc() (alokasi
memory) yang dimulai dengan address yang ditunjukkan
oleh pointer p
(3)Set-lah value pada sel p
Masukkan
p
(4)Modifikasi pointer
p->next = x->next;
18
next
x->next = p;
9
24
sel p
x
20
5
next
18
24
13
28
28
2
73
Operasi pada Linked List
1.
2.
3.
Menambahkan data pada linked list
1. Menambahkan sel baru yang terletak setelah
sebuah sel tertentu
2. Menambahkan sel baru pada posisi terdepan
sebuah linked list
Menghapus data pada linked list
1. Menghapus sebuah sel yang terletak setelah
sebuah sel tertentu
2. Menghapus sel pada posisi terdepan sebuah linked
list
Syarat-syarat pada perbatasan
Menambahkan sel baru pada posisi
terdepan sebuah linked list
• Cara menambahkan sel baru pada posisi terdepan
sebuah linked list berbeda dengan cara menambahkan
sel ke tengah list tsb.
• Memakai pointer header yang menunjukkan posisi
terdepan sebuah linked-list
Menambahkan sel baru pada posisi
terdepan sebuah linked list
(1)Sediakan pointer p yang menunjuk ke sebuah sel
struct CELL *p;
(2)Buatlah sebuah sel baru dengan malloc() (alokasi memory)
yang dimulai dengan address yang ditunjukkan oleh pointer p
(3)Set-lah value pada sel p
(4)Substitusikan address pada header ke bagian next pada p
p->next = header;
(5) Updatelah nilai header dengan address p
p
header = p;
18
next
Alokasi memory
dengan malloc
9
header
24
24
13
next
28
28
2
73
Menambahkan sel baru pada posisi
terdepan sebuah linked list
(1)Sediakan pointer p yang menunjuk ke sebuah sel
struct CELL *p;
(2)Buatlah sebuah sel baru dengan malloc() (alokasi memory)
yang dimulai dengan address yang ditunjukkan oleh pointer p
(3)Set-lah value pada sel p
(4)Substitusikan address pada header ke bagian next pada p
p->next = header;
(5) Updatelah nilai header dengan address p
p
header = p;
18
9
header
18
24
13
next
24
next
28
28
2
73
Menambahkan sel baru pada posisi
terdepan sebuah linked list
• Cara lain menambahkan sel baru pada posisi terdepan
sebuah list
• Header bukan pointer melainkan sel ke-0
• Memakai cara yang sama dengan list (1)(menambahkan
elemen pada tengah-tengah sebuah list)
Menambahkan sel baru pada posisi
terdepan sebuah linked list (2)
(1) Header tidak didefinisikan sebagai sebuah pointer, melainkan
sebuah sel
struct CELL header;
(2)Tempatkan next pada header agar menunjuk ke posisi terdepan
pada list,dan header dianggap sebagai sel ke-0
(3)Masukkan elemen p pada posisi sesudah elemen ke-0
(4)Selanjutnya sama dengan proses penambahan sel baru pada
penjelasan sebelumnya (modifikasi next)
p
18
9
x
24
28
header
-
24
sel ke-0
13
28
sel terdepan
2
73
Menambahkan sel baru pada posisi
terdepan sebuah linked list (2)
(1) Header tidak didefinisikan sebagai sebuah pointer, melainkan
sebuah sel
struct CELL header;
(2)Tempatkan next pada header agar menunjuk ke posisi terdepan
pada list,dan header dianggap sebagai sel ke-0
(3)Masukkan elemen p pada posisi sesudah elemen ke-0
(4)Selanjutnya sama dengan proses penambahan sel baru pada
penjelasan sebelumnya (modifikasi next)
p
18
9
24
x
24
-
18
sel ke-0
13
28
28
2
73
Operasi pada Linked List
1.
2.
3.
Menambahkan data pada linked list
1. Menambahkan sel baru yang terletak setelah
sebuah sel tertentu
2. Menambahkan sel baru pada posisi terdepan
sebuah linked list
Menghapus data pada linked list
1. Menghapus sebuah sel yang terletak setelah
sebuah sel tertentu
2. Menghapus sel pada posisi terdepan sebuah linked
list
Syarat-syarat pada perbatasan
Menghapus sebuah sel
1.
2.
3.
4.
Periksa pointer NULL
Mengubah pointer next (skip 1 sel)
Mengeluarkan isi sel yang dihapus (optional)
Bebaskan memory yang dialokasikan memakai fungsi
free()
Catatan penting
Pada linked list, kita bisa menghapus sebuah sel yang
terletak pada posisi sesudah sel tertentu. Tetapi kita tidak
dapat menghapus sebuah sel yang ditunjuk oleh pointer itu
sendiri !
Contoh penghapusan sebuah sel
37
37
4
38
38
2
40
40
13
40
40
13
3
3
100
52
52
40
52
52
40
ingin dihapus
skip
37
37
4
40
38
2
hapus dengan fungsi free()
3
3
100
Cara menghapus sel sesudah sel x
指定セル直後のセルを削除
(1)siapkan pointer yang akan menunjuk ke sel yang akan dihapus
struct CELL *p;
(2)Periksalah apakah sel yang dihapus itu NULL atau tidak
if(x->next == NULL)
fatal_error(”sel tidak dapat dihapus karena tidak ada sel
lagi sesudahnya”);
(3)Set-lah agar pointer p menunjuk ke sel yang ingin dihapus
p = x->next;
(4)Sesuaikan next dari sel sel x (skip p)
x->next = p->next;
(5)Print-lah isi sel yang ditunjuk oleh pointer p
(6)Bebaskan memory yang
ditunjuk oleh pointer p
x
free(p);
31
18
18
23
20削除
23
27
ingin dihapus
18
Cara menghapus sel sesudah sel x
指定セル直後のセルを削除
(1)siapkan pointer yang akan menunjuk ke sel yang akan dihapus
struct CELL *p;
(2)Periksalah apakah sel yang dihapus itu NULL atau tidak
if(x->next == NULL)
fatal_error(”sel tidak dapat dihapus karena tidak ada sel
lagi sesudahnya”);
(3)Set-lah agar pointer p menunjuk ke sel yang ingin dihapus
p = x->next;
(4)Sesuaikan next dari sel sel x (skip p)
x->next = p->next;
(5)Print-lah isi sel yang ditunjuk oleh pointer p
skip
(6)Bebaskan memory yang
ditunjuk oleh pointer p
x
p
free(p);
31
23
18
23
20 削除
23
27
18
Cara menghapus sel sesudah sel x
指定セル直後のセルを削除
(1)siapkan pointer yang akan menunjuk ke sel yang akan dihapus
struct CELL *p;
(2)Periksalah apakah sel yang dihapus itu NULL atau tidak
if(x->next == NULL)
fatal_error(”sel tidak dapat dihapus karena tidak ada sel
lagi sesudahnya”);
(3)Set-lah agar pointer p menunjuk ke sel yang ingin dihapus
p = x->next;
(4)Sesuaikan next dari sel sel x (skip p)
x->next = p->next;
(5)Print-lah isi sel yang ditunjuk oleh pointer p
(6)Bebaskan memory yang
ditunjuk oleh pointer p
x
free(p);
23
31
23
27
dihapus dengan free()
18
Operasi pada Linked List
1.
2.
3.
Menambahkan data pada linked list
1. Menambahkan sel baru yang terletak setelah
sebuah sel tertentu
2. Menambahkan sel baru pada posisi terdepan
sebuah linked list
Menghapus data pada linked list
1. Menghapus sebuah sel yang terletak setelah
sebuah sel tertentu
2. Menghapus sel pada posisi terdepan sebuah linked
list
Syarat-syarat pada perbatasan
Menghapus sel pada posisi terdepan
sebuah linked list
•
•
Memakai cara yang lain dengan cara menghapus sel
di tengah-tengah sebuah linked list
Memanfaatkan pointer header
Menghapus sel pada posisi terdepan
sebuah linked list
(1)Siapkan pointer p
struct CELL *header, *p;
(2)Periksa apakah header NULL atau tidak
if(header == NULL)
fatal_error(”List kosong, sehingga penghapusan sel
tidak dapat dilakukan”);
(3)Set-lah address elemen terdepan ke p
p = header;
(4)Update-lah pointer header
header = p->next;
(5)Tampilkan isi sel yang ditunjuk oleh p (optional)
(6) Bebaskan memory yang ditunjuk oleh pointer p
header
18
18
20
23
23
p
Ingin dihapus
27
18
Menghapus sel pada posisi terdepan
sebuah linked list
(1)Siapkan pointer p
struct CELL *header, *p;
(2)Periksa apakah header NULL atau tidak
if(header == NULL)
fatal_error(”List kosong, sehingga penghapusan sel
tidak dapat dilakukan”);
(3)Set-lah address elemen terdepan ke p
p = header;
(4)Update-lah pointer header
header = p->next;
(5)Tampilkan isi sel yang ditunjuk oleh p (optional)
(6) Bebaskan memory yang ditunjuk oleh pointer p
header
18
23
23
27
dihapus dengan fungsi free()
18
Menghapus sel pada posisi terdepan
sebuah linked list
• Memakai cara sama seperti saat menghapus sel pada
tengah-tengah sebuah list
• Header bukan pointer, melainkan sel ke-0
Menghapus sel pada posisi terdepan
sebuah linked list (2)
(1)Header dideklarasikan sebagai sebuah sel.
p dideklarasikan sebagai pointer yang menunjuk ke sel
yang ingin dihapus
struct CELL header, *p;
(2)Substitusikan address header ke pointer x
x=&header
(3)Selanjutnya pergunakan cara yang sama dengan cara
menghapus sel yang berada di tengah-tengah sebuah list.
Yaitu menghapus sel yang terletak sesudah sel yang
ditunjuk oleh pointer x.
17
18
header
sel ke-0
18
20 23
sel ke-1
23
27 18
sel ke-2
sel yang ingin dihapus
Menghapus sel pada posisi terdepan
sebuah linked list (2)
(1)Header dideklarasikan sebagai sebuah sel.
p dideklarasikan sebagai pointer yang menunjuk ke sel
yang ingin dihapus
struct CELL header, *p;
(2)Substitusikan address header ke pointer x
x=&header
(3)Selanjutnya pergunakan cara yang sama dengan cara
menghapus sel yang berada di tengah-tengah sebuah list.
Yaitu menghapus sel yang terletak sesudah sel yang
ditunjuk oleh pointer x.
x=17
-
18
header(x)
Sel ke-0
p=18
20
23
23
27
18
p
sel yang ingin dihapus
Menghapus sel pada posisi terdepan
sebuah linked list (2)
(1)Header dideklarasikan sebagai sebuah sel.
p dideklarasikan sebagai pointer yang menunjuk ke sel
yang ingin dihapus
struct CELL header, *p;
(2)Substitusikan address header ke pointer x
x=&header
(3)Selanjutnya pergunakan cara yang sama dengan cara
menghapus sel yang berada di tengah-tengah sebuah list.
Yaitu menghapus sel yang terletak sesudah sel yang
ditunjuk oleh pointer x.
skip
p=18
header
Sel ke-0
23
20
23
23
27
18
p
dihapus dengan fungsi free
Rangkuman
•
•
•
•
Linked list terdiri dari komponen-komponen berikut
– value
– pointer ke sel berikutnya
Data yang tersimpan (value) pada linked-list diakses dengan cara
sekuensial. Untuk melihat value dari suatu sel yang berada di
tengah list, kita harus mengikuti alur list, mulai dari sel pertama dan
seterusnya sampai bertemu dengan sel yang value-nya ingin
ditampilkan.
Penambahan sel, penghapusan sel dapat dilakukan dengan cara
mengubah pointer
Ada dua cara operasi penambahan dan penghapusan sel yang
terdepan. Yang lebih mudah adalah dengan memakai header bukan
sebagai pointer, melainkan sebagai sel ke-0
value next
value next
value next
value next
Latihan
(1) Pada saat header = 35, gambarkan linked list yang dibuat
dari sel-sel dibawah.
address
value *next
13
24
18
21
18
21
13
23
26
26
100
35
NULL
20
18
(2) Gambarkan kondisi linked-list saat sel dengan value 24
dihapus
(3) Gambarkan kondisi linked-list saat sel berikut ditambahkan
Sesudah sel dengan value 23
42
45
Operasi pada Linked List
1.
2.
3.
Menambahkan data pada linked list
1. Menambahkan sel baru yang terletak setelah
sebuah sel tertentu
2. Menambahkan sel baru pada posisi terdepan
sebuah linked list
Menghapus data pada linked list
1. Menghapus sebuah sel yang terletak setelah
sebuah sel tertentu
2. Menghapus sel pada posisi terdepan sebuah linked
list
Syarat-syarat pada perbatasan
Syarat-syarat pada perbatasan
• Hal-hal yang harus diperhatikan
– Bagaimana menghandle sel terdepan dan terbelakang
– Proses saat list kosong
• Program linkedlist.c (Angka diurutkan, nilainya semakin
tinggi)
– Sel yang jadi pusat operasi (pointer p)
– Pointer yang menunjuk ke address sel sebelumnya (pointer q)
5
7
7
q(=5)
p(=7)
Contoh program Linked List
• Downloadlah program linkedlist.c yang disediakan di
situs kuliah http://asnugroho.net/lecture/ds.html
• Pelajari isinya dan selesaikan fungsi cell_delete
Fungsi insert
struct CELL {
struct CELL *next;
int
value;
};
typedef struct CELL cell;
cell header;
cell_insert(int a)
{
cell *p, *q, *new_cell;
/* mencari posisi dimana sel harus dimasukkan */
p = header.next;
q = &header;
while (p != NULL && a > p-> value) {
q = p;
p = p->next;
}
Akses ke tiap sel satu persatu
header
20
38
-
38
q
2
40
40
p
p=header.next = 38
q=&header = 20
while (p != NULL) {
q = p;
p = p->next;
}
5
52
52
7
70
70
12
Akses ke tiap sel satu persatu
header
20
-
38
38
2
q
40
40
5
p
while (p != NULL ) {
q = p; q = 38
p = p->next; p = 40
}
52
52
7
70
70
12
Akses ke tiap sel satu persatu
header
20
-
38
38
2
40
40
5
q
while (p != NULL) {
q = p; q = 40
p = p->next; p = 52
}
52
52
7
p
70
70
12
Akses ke tiap sel satu persatu
header
20
-
38
38
2
40
40
5
52
52
7
70
q
while (p != NULL) {
q = p; q = 52
p = p->next; p = 70
}
70
12
p
Akses ke tiap sel satu persatu
header
20
-
38
38
2
40
40
5
52
52
7
70
70
12
q
while (p != NULL) {
q = p; q = 70
p = p->next; p = NULL
}
p
Ingin memasukkan 4(a=4)
header
20
38
-
38
q
2
40
40
5
52
52
p
p=header.next = 38
q=&header = 20
p->value=2
while ((p != NULL ) && (p-> value < a)) {
q = p;
p = p->next;
}
7
70
70
12
Ingin memasukkan 4(a=4)
header
20
-
38
38
2
40
40
q
5
52
52
p
p=header.next = 38
q=&header = 20
while ((p != NULL ) && (p-> value < a)) {
q = p; q = 38
p = p->next; p = 40
}
7
70
70
12
Ingin memasukkan 4(a=4)
header
20
-
38
38
2
40
q
p=40
q=38
40
5
52
52
7
70
70
12
p
p->value=5
while ((p != NULL ) && (p-> value < a)) {
q = p;
Keluar dari loop
p = p->next;
Masukkan 4 sebelum p(value 5)
}
/* Masukkan sel baru */
Ingin memasukkan 4(a=4)
header
20
-
38
38
2
40
40
q
5
p
52
52
7
35
4
70
70
12
new_cell
/* Menambahkan sel baru */
If ((new_cell=(cell*)malloc(sizeof(cell)))==NULL)
fatal_error(”memory tidak cukup”);
new_cell->next=p; ←di sini new_cell->next diisi dengan 40
q->next=new_cell; ←di sini q->next diisi dengan 35
new_cell->value=a;
}
Memasukkan new_cell (value 4) sebelum p(value 5) =
memasukkan sel baru sesudah q. Untuk itulah dalam
proses ini diperlukan 2 pointer p dan q !
Ingin memasukkan 4(a=4)
header
20
-
38
38
2
40
35
5
52
52
7
35
4
70
70
40
12
new_cell
/* Menambahkan sel baru */
If ((new_cell=(cell*)malloc(sizeof(cell)))==NULL)
fatal_error(”memory tidak cukup”);
new_cell->next=p; ←di sini new_cell->next diisi dengan 40
q->next=new_cell; ←di sini q->next diisi dengan 35
new_cell->value=a;
}
Memasukkan new_cell (value 4) sebelum p(value 5) =
memasukkan sel baru sesudah q. Untuk itulah dalam
proses ini diperlukan 2 pointer p dan q !
Latihan
• Selesaikan fungsi cell_delete pada program linkedlist.c,
untuk menghapus data yang telah ditambahkan pada
sebuah list
• Jelaskan secara singkat program yang dibuat (komentar)
Hint
Untuk menyelesaikan cell_delete buatlah program dengan
urutan sbb.
①
②
③
④
Periksalah, apakah list itu kosong atau tidak. Jika tidak kosong,
lanjutkan ke step ②. Jika list itu kosong, tampilkan error
message, dan kembalilah ke fungsi main
Akseslah sel pada list itu satu persatu dengan pointer p dan q
untuk mencari data yang akan dihapus (yaitu a )
Jika sampai akhir ternyata sel yang dihapus tidak ditemukan,
tampilkan “Sel yang dihapus tidak ditemukan”, dan kembali ke
fungsi main
Jika sel yang ingin dihapus ditemukan, hapuslah sel itu dan
kembali ke fungsi main
void cell_delete(int a)
{
cell *p, *q;
p=header.next;
}
q=&header;
①
Periksalah, apakah list itu kosong atau tidak. Jika tidak
kosong, lanjutkan ke step ②. Jika list itu kosong,
tampilkan error message, dan kembalilah ke fungsi
main
②
Akseslah sel pada list itu satu persatu dengan pointer
p dan q untuk mencari data yang akan dihapus (yaitu
a)
③
Jika sampai akhir ternyata sel yang dihapus tidak
ditemukan, tampilkan “Sel yang dihapus tidak
ditemukan”, dan kembali ke fungsi main
④
Jika sel yang ingin dihapus ditemukan, hapuslah sel
itu dan kembali ke fungsi main
PR
• Rancanglah bagaimana membuat program stack,
tetapi tidak memakai array, melainkan memakai
linked-list(Dengan kata lain: Selesaikan fungsi push,
pop dan stack_print pada linkedliststack.c)
• Hint:
Penambahan dan penghapusan elemen pada stack
harus bisa dijalankan pada O(1). Karena itu
penambahan dan penghapusan data harus dilakukan
pada sel yang terdepan
Beberapa
Beberapa Jenis
Jenis Struktur
Struktur Data
Data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1. Linked List
2. Circular List
3. Bidirectional List
4. Multi list structure
3. Tree Structure
Beberapa
Beberapa Jenis
Jenis Struktur
Struktur Data
Data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1. Linked List
2. Circular List
3. Bidirectional List
4. Multi list structure
3. Tree Structure
Circular
Circular List
List
Apakah
Apakah Circular
Circular List
List itu
itu ??
• Semua sel dalam list disambungkan dengan pointer, dan
sel yang terakhir disambungkan dengan sel pertama
• Struktur data berbentuk cincin
• Tidak ada sel pertama maupun sel terakhir dalam list,
karena setiap sel disambungkan oleh pointer sehingga
berbentuk cincin.
Linked
Linked List
List vs
vs Circular
Circular List
List
Variabel ptr
Linked list
13
13
1
18
18
2
24
24
3
NULL
Variabel ptr
Circular list
13
13
1
18
18
2
24
24
3
13
Kembali ke sel terdepan
Cara
Cara akses
akses tiap
tiap sel
sel pada
pada Circular
Circular List
List
struct CELL *ptr, *p;
if(ptr != NULL) {
p = ptr;
do {
printf(“%d\n”,p->value)
/* tampilkan value pada sel yang ditunjuk oleh p */
p = p->next;
} while (p != ptr);
// Setelah semua bagian dalam loop dieksekusi,
// evaluasilah apakah p!= ptr
}
Variabel ptr
13
13
1
18
18
2
24
24
3
13
Hasil:
1
2
3
Cara
Cara ini
ini tidak
tidak benar
benar !!
struct CELL *ptr, *p;
if(ptr != NULL) {
p = ptr;
while (p != ptr) {
printf(“%d\n”,p->value)
p = p->next;
}
}
Cara ini tidak benar. Bagian dalam loop tidak akan dijalankan karena
sebelum masuk loop syarat p!=ptr tidak akan pernah terpenuhi
Circular
Circular List
List memakai
memakai head
head
struct CELL *ptr, *p;
if(ptr != NULL) {
Saat ptr==NULL
p = ptr;
berarti list kosong
do {
printf(“%d\n”,p->value
p = p->next;
} while (p != ptr);
}
Saat p==ptr
Berarti sudah sampai di akhir list
Dua syarat ini
mungkinkah disatukan ?
memakai head
Circular
Circular List
List memakai
memakai head
head
Variabel ptr
13
13
1
18
Variabel head
13
33
1 18
- 13
18
2
24
18
2 24
24
3
13
24
3 33
Circular
Circular List
List memakai
memakai head
head
struct CELL head;
head
33
- 13
13
1 18
18
2 24
24
3 33
Circular List dengan 3 sel
head
33
- 33
Circular List dalam kondisi kosong
head.next== & head
(pointer next dari head menunjuk ke head itu sendiri)
Catatan: bandingkan Circular List di atas dengan linked list berikut
head
13
18
24
33
1 18
2 24
3
- 13
Circular
Circular List
List memakai
memakai head
head
struct CELL head, *p;
for(p = head.next; p!= &head; p = p->next) // head tidak di-lompati (skip)
{
perlu ditambahkan bagian untuk melewati “head” agar sel tsb.
tidak diproses
}
(1)
head
33
- 13
13
1 18
18
2 24
(2)
24
3 33
(3)
Beberapa
Beberapa Jenis
Jenis Struktur
Struktur Data
Data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1. Linked List
2. Circular List
3. Bidirectional List
4. Multi list structure
3. Tree Structure
Bidirectional
Bidirectional List
List
Apakah
Apakah bidirectional
bidirectional list
list itu
itu ??
•
•
Semua sel yang terdapat pada list disambungkan dengan pointer,
sedangkan tiap sel memiliki TIGA komponen : value, pointer ke sel
sebelumnya dan pointer ke sel berikutnya
Dengan memiliki dua buah pointer ini, maka bidirectional list dapat
diakses dengan DUA arah : ke arah depan dan ke belakang
prev value next
value next
prev value next
value next
Linked List
Bidirectional List
Bidirectional
Bidirectional List
List
33
24
-
13
13
33
1
18
18
struct CELL {
struct CELL *prev;
struct CELL *next;
MYDATA value;
};
13
2
24
24
18
3
33
address
prev value next
Misalnya int, char, float, long, double, dsb
Kelebihan
Kelebihan dan
dan kelemahan
kelemahan
Kelebihan
1. List bisa diakses dengan dua arah : ke depan maupun ke
belakang
2. Penambahan dan penghapusan data menjadi mudah,
karena pada tipe ini kita dapat menambahkan sel baru
sesudah maupun sebelum sebuah sel. Demikian juga
dalam hal menghapus sel.
Kelemahan
1. Sebuah data memiliki dua buah pointer, sehingga
memerlukan space yang lebih besar
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
p
1
18
13
2
24
57
10
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
13
2
24
(1)
p
57
10
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
13
2
24
(1)
p
13
57
10
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
13
2
24
(2)
p
13
57
10
18
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
57
2
24
(3)
p
13
57
10
18
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
57
57
2
24
(4)
p
13
57
10
18
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menghapus
menghapus sebuah
sebuah sel
sel
Hapuslah sel yang ditunjuk pointer p
p
13
33
1
18
18
13
2
24
24
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
18
(1)
(2)
Yang diubah bukan hanya pointer next
tetapi juga pointer prev
3
33
Cara
Cara menghapus
menghapus sebuah
sebuah sel
sel
Hapuslah sel yang ditunjuk pointer p
p
13
33
1
18
24
13
2
24
24
18
(1)
skip
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
(1)
(2)
Yang diubah bukan hanya pointer next
tetapi juga pointer prev
3
33
Cara
Cara menghapus
menghapus sebuah
sebuah sel
sel
Hapuslah sel yang ditunjuk pointer p
p
13
33
1
18
24
13
2
24
24
(2)
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
13
(1)
(2)
Yang diubah bukan hanya pointer next
tetapi juga pointer prev
3
33
Latihan
Latihan Bidirectional
Bidirectional List
List
1. Gambarkan bidirectional list berikut
3 head
10
3
20
28
38
-
10
38
28
70
28
3
10
30
38
2. Tambahkan sel berikut setelah sel yang berisi value “20”
128
27
3. Gambarkan kondisi bidirectional list, setelah sel yang berisi value “70”
dihapus. Kerjakan soal ini terhadap list yang diperoleh dari no.2 di atas.
Doubly
Doubly Linked
Linked List
List
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Beberapa
Beberapa Jenis
Jenis Struktur
Struktur Data
Data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1. Linked List
2. Circular List
3. Doubly Linked List
4. Multi list structure
3. Tree Structure
Outline
Outline
• Review doubly-linked list
• Latihan
Apakah
Apakah doubly-linked
doubly-linked list
list itu
itu ??
•
•
Semua sel yang terdapat pada list disambungkan dengan pointer,
sedangkan tiap sel memiliki TIGA komponen : value, pointer ke sel
sebelumnya dan pointer ke sel berikutnya
Dengan memiliki dua buah pointer ini, maka doubly-linked list dapat
diakses dengan DUA arah : ke arah depan dan ke belakang
prev value next
value next
prev value next
value next
Linked List
Bidirectional List
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
33
1
18
18
struct CELL {
struct CELL *prev;
struct CELL *next;
MYDATA value;
};
13
2
24
24
18
3
33
address
prev value next
Misalnya int, char, float, long, double, dsb
Kelebihan
Kelebihan dan
dan kelemahan
kelemahan
Kelebihan
1. List bisa diakses dengan dua arah : ke depan maupun ke
belakang
2. Penambahan dan penghapusan data menjadi mudah,
karena pada tipe ini kita dapat menambahkan sel baru
sesudah maupun sebelum sebuah sel. Demikian juga
dalam hal menghapus sel.
Kelemahan
1. Sebuah data memiliki dua buah pointer, sehingga
memerlukan space yang lebih besar
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
p
1
18
13
2
24
57
10
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
13
2
24
(1)
p
57
10
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
13
2
24
(1)
p
13
57
10
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
13
2
24
(2)
p
13
57
10
18
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
18
57
2
24
(3)
p
13
57
10
18
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menambahkan
menambahkan sel
sel baru
baru
Tambahkan sel baru yang ditunjuk oleh pointer x, sesudah suatu sel
yang ditunjuk oleh pointer p
13
18
33
1
57
57
2
24
(4)
p
13
57
10
18
x
x−>prev=p;
x−>next=p−>next;
p−>next−>prev=x;
p−>next=x;
(1)
(2)
(3)
(4)
Yang diubah bukan hanya
pointer next
tetapi juga pointer prev
Cara
Cara menghapus
menghapus sebuah
sebuah sel
sel
Hapuslah sel yang ditunjuk pointer p
p
13
33
1
18
18
13
2
24
24
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
18
(1)
(2)
Yang diubah bukan hanya pointer next
tetapi juga pointer prev
3
33
Cara
Cara menghapus
menghapus sebuah
sebuah sel
sel
Hapuslah sel yang ditunjuk pointer p
p
13
33
1
18
24
13
2
24
24
18
(1)
skip
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
(1)
(2)
Yang diubah bukan hanya pointer next
tetapi juga pointer prev
3
33
Cara
Cara menghapus
menghapus sebuah
sebuah sel
sel
Hapuslah sel yang ditunjuk pointer p
p
13
33
1
18
24
13
2
24
24
(2)
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
13
(1)
(2)
Yang diubah bukan hanya pointer next
tetapi juga pointer prev
3
33
Latihan
Latihan pemrograman
pemrograman
1. Downloadlah doublyll.c dari
http://asnugroho.net/lecture/ds.html
2. Selesaikan fungsi cell_insert()
3. Fungsi cell_insert() adalah menambahkan databaru pada
sebuah doubly linked list, dimana data harus dalam kondisi
terurutkan. Dimulai dari data dengan nilai kecil, dan
semakin ke belakang semakin besar.
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
33
10
18
18
struct CELL {
struct CELL *prev;
struct CELL *next;
int value;
};
13
20
24
address
prev value next
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
33
10
18
18
13
20
24
new_cell
25
15
Sel ini akan ditambahkan
ke list
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
new_cell
33
10
18
18
13
20
24
p=13
p->value=10 → 10 < 15 →pindah ke sel
berikutnya
25
15
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
33
10
18
18
13
20
24
p=18
p->value=20 → 20 > 15
new_cell
25
15
pindah ke sel sebelumnya
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
33
10
18
18
13
20
24
p=13
tambahkan sel baru sesudah sel yang ditunjuk
new_cell
25
15
Doubly-linked
Doubly-linked List
List
33
24
-
13
13
33
new_cell
13
10
18
25
25
15
18
25
20
24
Doubly-linked
Doubly-linked List
List
void cell_insert(int a)
{
cell *p, *new_cell;
①
①Mencari
Mencariposisi
posisidimana
dimananew_cell
new_cellharus
harusdimasukan
dimasukan
②
②Alokasi
Alokasimemory
memoryuntuk
untuknew_cell
new_cellmemakai
memakaimalloc
malloc
③
③Tambahkan
Tambahkannew_cell
new_cellpada
padaposisi
posisiyang
yangditentukan
ditentukan
}
Latihan
Latihan pemrograman
pemrograman
1. Gambarkan bidirectional list berikut
3 head
10
3
20
28
38
-
10
38
28
70
28
3
10
30
38
2. Tambahkan sel berikut setelah sel yang berisi value “20”
128
27
3. Gambarkan kondisi bidirectional list, setelah sel yang berisi value “70”
dihapus. Kerjakan soal ini terhadap list yang diperoleh dari no.2 di atas.
Tree
Tree Structure
Structure
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Beberapa
Beberapa Jenis
Jenis Struktur
Struktur Data
Data
1. Array
1. Linear List
2. Stack
3. Queue
2. List
1. Linked List
2. Circular List
3. Doubly Linked List
4. Multi list structure
3. Tree Structure
Outline
Outline
1.
2.
3.
4.
Apakah Tree Structure itu ?
Binary Tree & implementasinya
Tree Traversal
Implementasi tree (selain binary tree)
Apakah
Apakah Tree
Tree Structure
Structure itu
itu ??
•
Struktur data yang menunjukkan hubungan bertingkat (memiliki
hierarkhi)
•
Contoh: direktori/folder pada windows atau linux
My Document
My Pictures
My Music
Struktur data
Pointer & Structure
Linked list
Tree
Nama
Nama komponen
komponen pada
pada Tree
Tree
node 1
node
leaf
4
2
3
6
5
8
leaf
root
9
leaf
7
leaf
leaf
10
node
Hubungan
Hubungan antar
antar komponen
komponen
•
•
•
•
Hubungan antar elemen: parentchild, father-son, motherdaughter
Nama node: nama(angka) yang
dipakai untuk membedakan
sebuah node dengan node yang
lain. Dalam kuliah ini adalah
4
angka yang tertulis dalam
leaf
lingkaran.
Label: nilai yang diingat oleh
sebuah node
Tree vs Graph
– Tree: setiap node kecuali
root hanya memiliki sebuah
parent
– Graph: dapat memiliki lebih
dari sebuah parent
node 1
root
node 2
3
6
5
8
leaf
9
leaf
7
leaf
leaf
10
Contoh graph
node
Hubungan
Hubungan antar
antar komponen
komponen
•
•
•
sibling:node-node yang memiliki
parent yang sama
Ancestor dari node x: node yang
ditemukan, ketika menyusuri tree
ke atas dari node x
Descendant dari node x: node
yang ditemukan ketika menyusuri
tree ke bawah dari node x
node 1
node
leaf
4
2
3
6
5
8
leaf
root
9
leaf
7
leaf
leaf
10
node
Hubungan
Hubungan antar
antar komponen
komponen
•
•
•
sibling:node-node yang memiliki
parent yang sama
Ancestor dari node x: node yang
ditemukan, ketika menyusuri tree
ke atas dari node x
Descendant dari node x: node
yang ditemukan ketika menyusuri
tree ke bawah dari node x
node 1
node
leaf
4
2
3
6
5
8
leaf
root
9
leaf
7
leaf
leaf
10
node
Hubungan
Hubungan antar
antar komponen
komponen
•
•
•
sibling:node-node yang memiliki
parent yang sama
Ancestor dari node x: node yang
ditemukan, ketika menyusuri tree
ke atas dari node x
Descendant dari node x: node
yang ditemukan ketika menyusuri
tree ke bawah dari node x
node 1
node
leaf
4
2
3
6
5
8
leaf
root
9
leaf
7
leaf
leaf
10
node
Level
Level
0
1
2
4
6
5
8
9
3
1
7
2
10
3
Definisi
Definisi TREE
TREE
Sebuah tree didefinisikan sebagai struktur y ang dibentuk secara
recursive oleh kedua rule berikut:
1. Sebuah node adalah sebuah tree. Node satu-satunya pada
tree ini berfungsi sebagai root maupun leaf.
2. Dari k buah tree T1~Tk , dan masing-masing memiliki root
n1~nk.Jika node n adalah parent dari noden1~nk, akan
diperoleh sebuah tree baru T yang memiliki root n. Dalam
kondisi ini, tree T1~Tkmenjadi sub-tree dari tree T. Root
dari sub-tree n1~nkadalah child dari node n .
Tree
root
1
leaf
node
Definisi
Definisi TREE
TREE
Sebuah tree didefinisikan sebagai struktur y ang dibentuk secara
recursive oleh kedua rule berikut:
1. Sebuah node adalah sebuah tree. Node satu-satunya pada tree
ini berfungsi sebagai root maupun leaf.
2. Dari k buah tree T1~Tk , dan masing-masing memiliki root n1~
nk.Jika node n adalah parent dari noden1~nk, akan diperoleh
sebuah tree baru T yang memiliki root n. Dalam kondisi ini, tree
T1~Tkmenjadi sub-tree dari tree T. Root dari sub-tree n1~
nkadalah child dari node n .
T1
1 n1
2
4
3
5
T2
6
2
1 n2
3
T3
1 n3
2
3
T4
1 n4
Definisi
Definisi TREE
TREE
2.
Dari k buah tree T1~Tk , dan masing-masing memiliki root n1~
nk.Jika node n adalah parent dari noden1~nk, akan diperoleh
sebuah tree baru T yang memiliki root n. Dalam kondisi ini, tree
T1~Tkmenjadi sub-tree dari tree T. Root dari sub-tree n1~
nkadalah child dari node n .
1 n
T
2
T1
6
8
7
12
T2
n1
13
9
3 n2
10
T3
4 n3
11
14
T4
5 n4
Ordered
Ordered vs
vs Unordered
Unordered tree
tree
Ordered tree
– Antar sibling terdapat urutan “usia”
– Node yang paling kiri berusia paling tua (sulung),
sedangkan node yang paling kanan berusia paling
muda (bungsu)
– Posisi node diatur atas urutan tertentu
Unordered tree
– Antar sibling tidak terdapat urutan tertentu
Outline
Outline
1.
2.
3.
4.
Apakah Tree Structure itu ?
Binary Tree & implementasinya
Tree Traversal
Implementasi tree (selain binary tree)
Definisi
Definisi
Definisi Binary Tree
1.
Sebuah tree yang kosong juga merupakan sebuah binary tree
2.
Binary tree harus memenuhi salah satu syarat berikut
z Tidak memiliki anak
z Memiliki subtree di sebelah kiri (left subtree)
z Memiliki subtree di sebelah kanan (right subtree)
z Memiliki baik left subtree maupun right subtree
HATI-HATI DALAM MENGGAMBAR BINARY TREE
a
a
b
a
a
b
b
a
c
b
Subtree (child) yang dimiliki
bukan kiri maupun kanan
Implementasi
Implementasi Binary
Binary Tree
Tree
struct node {
struct node *left;
struct node *right;
mydata
label;
}
left
right label
a
b
a
c
b
c
Contoh
Contoh
A
10
10
14
14 18
14
B
18
H
26 38
26
C
D
26
18
56 78
56
E
56
100
78 F
100
G
100
H
B
38
C
38
A
G
D
78
E
F
Latihan
Latihan 11
•
Gambarkan implementasi dari binary tree berikut
10
20
C
40
A
30
B
D
50
80 G
F
E
60
70
90
I
H
100 J
Outline
Outline
1.
2.
3.
4.
Apakah Tree Structure itu ?
Binary Tree & implementasinya
Tree Traversal
Implementasi tree (selain binary tree)
Definisi
Definisi Tree
Tree Traversal
Traversal
z
z
z
Teknik menyusuri tiap node dalam sebuah tree secara
sistematis, sehingga semua node dapat dan hanya
satu kali saja dikunjungi
Ada tiga cara traversal
z
preorder
z
inorder
z
postorder
Untuk tree yang kosong, traversal tidak perlu
dilakukan
Preorder
Preorder
1.
2.
3.
Visit the root
Traverse the left subtree
Traverse the right subtree
A
B
H
D
C
E
F
G
A→B→C→D→E→G→F→H
Implementasi
Implementasi dalam
dalam bahasa
bahasa C
C
struct node {
struct node ∗left;
struct node ∗right;
char
label;
}
void preorder(struct node *p)
{
if (p==NULL) return;
jika empty-tree, tidak perlu lakukan apa-apa
printf(“visit %c ”, p−>label); tampilkan label node yang dikunjungi
preorder(p−>left);
traverse the left subtree
preorder(p−>right);
traverse the right subtree
}
Inorder
Inorder
1.
2.
3.
Traverse the left subtree
Visit the root
Traverse the right subtree
A
B
H
D
C
E
F
G
C→B→G→E→D→F→A→H
Implementasi
Implementasi dalam
dalam bahasa
bahasa C
C
struct node {
struct node ∗left;
struct node ∗right;
char
label;
}
void inorder(struct node *p)
{
if (p==NULL) return;
jika empty-tree, tidak perlu lakukan apa-apa
inorder(p−>left);
traverse the left subtree
printf(“visit %c ”, p−>label); tampilkan label node yang dikunjungi
inorder(p−>right);
traverse the right subtree
}
Postorder
Postorder
1. Traverse the left subtree
2. Traverse the right subtree
3. Visit the root
A
B
H
D
C
E
F
G
C→G→E→F→D→B→H→A
Implementasi
Implementasi dalam
dalam bahasa
bahasa C
C
struct node {
struct node ∗left;
struct node ∗right;
char
label;
}
void postorder(struct node *p)
{
if (p==NULL) return;
jika empty-tree, tidak perlu lakukan apa-apa
postorder(p−>left);
traverse the left subtree
postorder(p−>right);
traverse the right subtree
printf(“visit %c ”, p−>label); tampilkan label node yang dikunjungi
}
Latihan-2
Latihan-2
Tuliskan hasil preorder, inorder dan postorder traversal
untuk binary tree berikut.
A
I
B
D
C
E
F
J
G
H
K
L
Outline
Outline
1.
2.
3.
4.
Apakah Tree Structure itu ?
Binary Tree & implementasinya
Tree Traversal
Implementasi tree (selain binary tree)
Teknik
Teknik implementasi
implementasi tree
tree
•
•
Binary tree hanya memiliki dua anak: kiri dan kanan. Karena itu
implementasinya hanya memerlukan dua buah pointer untuk masingmasing subtree.
Untuk implementasi tree yang memiliki sebarang anak, dapat dilakukan
dengan dua cara
– memakai linked-list
– memakai binary tree
Contoh
Contoh
1
2
3
4
6
5
Implementasi
Implementasi memakai
memakai linked-list
linked-list
3
1
2
3
4
1
6
5
5
2
23
23
5
37
37
35
87
77
77
10
87
15
95
95
25
10
3
15
4
label child
25
5
35
6
struktur yang
Merepresentasikan node
struktur yang merepresentasikan
koneksi antar node
Implementasi
Implementasi memakai
memakai binary-tree
binary-tree
1000
1 1001
1
2
3
4
6
5
1001
2 1003 1002
1003
3
label child sibling
1004
1002
6
1004
4
1005
1005
5
Implementasi
Implementasi memakai
memakai binary-tree
binary-tree
1000
1 1001
1
2
6
3
4
1001
2 1003 1002
1002
6
5
1003
3
1004
1004
4
1005
1005
5
Implementasi
Implementasi memakai
memakai binary-tree
binary-tree
Rotasi ke kanan 45°
1001
2 1003 1002
6
3
4
3
1000
1 1001
6
2
2
1
1
1002
6
5
4
1003
3
1004
5
1004
4
1005
1005
5
Latihan-3
Latihan-3
Jelaskan implementasi tree berikut
a) memakai linked-list
b) memakai binary tree
10
50
C
100
300 G
250 F
B
D
A
150
E
200
H
350
450 J
400 I
500
K
Linear
Linear &
& Binary
Binary Search
Search
Dr. Anto Satriyo Nugroho, M.Eng
Email: asnugroho@gmail.com
Web: http://asnugroho.net/lecture/ds.html
Agenda
Agenda
• Linear Search
• Binary Search
3 operasi:
Penambahan data
Pencarian data
Penghapusan data
Linear
Linear Search
Search
struct {
int key;
int data;
} table[100];
int n;
(1)
(2)
(3)
(4)
(5)
(6)
int search(int key)
{
int i;
i=0;
while (i < n){
if(table[i].key==key)
return(table[i].data);
i++;
}
return -1;
}
statement
Cara
Cara kerja
kerja Linear
Linear Search
Search
key
data
table
1
3
4
8
13
14
18
20
21
10
12
14
16
18
20
22
24
26
0
1
2
3
4
5
6
7
8
…
130
26
99
Cara
Cara kerja
kerja Linear
Linear Search
Search
key
data
search(18)
i=0
table
1
3
4
8
13
14
18
20
21
10
12
14
16
18
20
22
24
26
0
1
2
3
4
5
6
7
8
…
130
26
99
Cara
Cara kerja
kerja Linear
Linear Search
Search
key
data
search(18)
i=1
table
1
3
4
8
13
14
18
20
21
10
12
14
16
18
20
22
24
26
0
1
2
3
4
5
6
7
8
…
130
26
99
Cara
Cara kerja
kerja Linear
Linear Search
Search
key
data
search(18)
i=2
table
1
3
4
8
13
14
18
20
21
10
12
14
16
18
20
22
24
26
0
1
2
3
4
5
6
7
8
…
130
26
99
Cara
Cara kerja
kerja Linear
Linear Search
Search
key
data
search(18)
i=