Tentang Saya
MK :
Bahasa Pemrograman, Struktur Data, Sistem Digital, Grafika Komputer Pengolahan Citra Digital Sistem Pakar atau Sistem Berbasis Pengetahuan
KONTRAK KULIAH
Toleransi keterlambatan 30 menit terhitung mulai pukul 10.00, berlaku bagi dosen dan mahasiswa Pakaian SOPAN, berkerah, bebas rapi dan bersepatu. NILAI :
Tugas dan quiz Final Project (Tim)
MATERI KULIAH
Fungsi Rekursi Review : Array, Struct, Pointer Sorting Searching Linked List Stack Queue Graph dan Tree
12.
13. 14. 15. 16.
Pengantar + Fungsi Rekursi 1 Fungsi Rekursi 2 Review Array dan Struct Sorting 1 : Bubble dan Insertion Sorting 2 : Selection Searching Review Pointer UTS Linked List 1 : Single Linked List Linked List 2 : Linked List Lanjut Stack 1 Operasi Dasar Stack 2 Contoh Penggunaan Queue Graph Tree UAS
Buku Referensi
Data Structures Using C and C++ 2nd edition, Yedidyah Langsam, dkk Text book lain Internet www.google.com
What is programming?
STRUKTUR DATA :
ARRAY
TREE, DLL
MINGGU PERTAMA
Fungsi Rekursif
Definisi fungsi rekursif. Contoh 1 : Faktorial Contoh 2 : Perkalian Contoh 3 : Fibonacci Contoh 4 : Tower of Hanoi
Fungsi Rekursif
Fungsi biasa dipanggil oleh fungsi lain. Sedangkan fungsi rekursif dipanggil oleh dirinya sendiri.
B C D A A A A
Fungsi Rekursif
Setara dengan proses looping/ iterasi faktorial, perkalian Kadang rekursif lebih baik dari iterasi tower of hanoi Terkadang sebaliknya fibonacci Komponen :
Simple Example
#include<stdio.h> int main(void) { printf("Never ends\n"); main(); return 0; }
Faktorial
ALGORITMA n! = 1 if n == 0 n! = n * ( n 1 )! if n > 0 4! = 4 x 3! 3! = 3 x 2! 2! = 2 x 1! 1! = 1 x 0! 0! = 1 SOURCE CODE int factorial ( int n ) { int x, y; if ( n == 0 ) return ( 1 ); x = n 1; y = factorial ( x ); return ( n * y ); }
Perkalian
ALGORITMA
a * b = a if b == 1 a * b = a * ( b 1 ) + a if b > 1 6x3=(6x2)+6 =(6x1)+6+6 =6+6+6 = 18
SOURCE CODE
int mult ( int a, int b ) { int c, d, sum; if ( b == 1 ) return ( a ); c = b 1; d = mult ( a, c ); sum = d + a; return ( sum ); }
Minggu Kedua
Fibonacci
The Fibonacci series fn0 is a famous series defined by: f0 : 0, f1 : 1, fn2 : fn1 + fn2 f2 = f0 + f1 = 0 + 1 = 1 f3 = f1 + f2 = 1 + 1 = 2 f4 = f2 + f3 = 1 + 2 = 3 f5 = f3 + f4 = 2 + 3 = 5
Fibonacci
ALGORITMA fibo( n ) = n if n == 0 or n == 1 fibo( n ) = fibo(n 2) + fibo( n 1 ) if n >= 2 fibo( 4 ) = fibo( 3 ) + fibo( 2 ) = fibo( 2 ) + fibo ( 1 ) + fibo( 2 ) = fibo(1) + fibo(0) + fibo(1) + fibo(2) = 1 + fibo(0) + fibo(1) + fibo(2) = 1 + 0 + fibo(1) + fibo(2) = 1 + fibo(1) + fibo(2) = 1 + 1 + fibo(2) = 2 + fibo(2) = 2 + fibo(1) + fibo(0) = 2 + 1 + fibo(0) =2+1+0 =2+1 =3 SOURCE CODE int fibo ( int n ) { int x, y; if ( n <= 1 ) return ( n ); x = fibo ( n 1); y = fibo ( n 2); return ( x + y ); }
Tracing Fibonacci
fibo (4) = ?
1+1=2 F(3) 1+0=1 F(2) 1 F(1)
F(4)
1 F(1) F(0) 0
Towers of Hanoi
ALGORITMA 1. If n == 1, move the single disk from A to C and stop. 2. Move the top n 1 disks from A to B, using C as auxiliary. 3. Move the remaining disk from A to C. 4. Move the n 1 disks from B to C, using A as auxiliary.
SOURCE CODE void towers( int n, char from, char to, char aux) { if ( n == 1 ) { printf(\nmove disk 1 from %c to %c, from, to); return; } towers( n 1, from, aux, to ); printf(\nmove disk %d from %c to %c, n, from, to); towers( n 1, aux, to, from ); }
towers(3, A, C, B) = ?
Minggu Ketiga
ARRAY
Tipe data turunan. Contoh deklarasi : int x[20]; SATU variabel untuk menyimpan BANYAK data dengan TIPE data yang SAMA. Mempunyai INDEKS. 3 4 2 1 7 Struktur data : Alokasi memori bersifat statis/ tetap. Konsep : string, array multidimensi
Contoh program
Program menghitung rata-rata nilai. Algoritma :
Deklarasikan variabel array untuk menyimpan data-data nilai. Input data nilai dengan perintah looping. Akses elemen dengan operator kurung siku ([]). Hitung penjumlahan data-data nilai. Hitung rata-rata = jumlah total/ jumlah data.
STRUCT
Tipe data turunan. Contoh deklarasi : struct { int jari_jari; float luas; float keliling; } lingkaran;
STRUCT Contd.
SATU variabel bisa menyimpan BANYAK data yang BERBEDA TIPE datanya. Mempunyai ELEMEN. 10 Struktur data :
314.0 62.8
Contoh program
Program tentang lingkaran. Algoritma :
Inventarisasi
atribut-atribut yang dimiliki oleh sebuah objek lingkaran. Akses masing-masing elemen dengan memakai operator tanda titik (.).
ARRAY OF STRUCT
Struktur data berupa array yang setiap elemennya bertipe struct. Contoh deklarasi : struct { int NPM; char nama[30]; float IPK; } mhs[100];
Struktur data :
100 Abdullah 3.80 101 Budi 3.45 102 Candra 3.22 103 Daud 3.17
Untuk akses elemen dimulai dari indeks array kemudian diikuti nama elemennya mhs[3].NPM = 1234;
Contoh Program
Program data mahasiswa. Program tabel fungsi kuadrat.
Minggu Keempat
Sorting
Tujuan : memahami proses tracing algoritma pengurutan. Beberapa jenis algoritma sorting :
Bubble
Bubble Sort
void bubble ( int X [ ], int n ) { int hold, j, pass; for ( pass = 0; pass < n-1; pass++) for ( j = 0; j < n-pass-1; j++) if ( X[j] > X[j+1] ) { hold = X[j]; X[j] = X[j+1]; X[j+1] = hold; } }
Insertion Sort
void insertion ( int X [ ], int n ) { int i, k, y; for ( k = 1; k < n; k++) { y = X[k]; for ( i = k-1; i >= 0 && y < X[i]; i--) X[i+1] = X[i]; X[i+1] = y; } }
Minggu Kelima
Kuis kecil
void urutkan ( int X [ ], int n ) { int temp, i, j; i=0; while(i<n-1){ for ( j = 0; j < n-i-1; j++){ temp = X[j+1]; if ( X[j] < X[j+1] ){ X[j+1] = X[j]; X[j] = temp; } } i++; } }
Selection Sort
void selection ( int X [ ], int n ) { int i, j, index, large; for ( i = n-1; i > 0; i--) { large = x[0]; index = 0; for ( j = 1; j <= i; j++) if ( X[j] > large ) { large = X[j]; index = j; } X[index] = X[i]; X[i] = large; }
Tugas :
Minggu Keenam
Searching
Tujuan : memahami proses tracing algoritma pencarian. Jenis algoritma searching :
Sequential
Sequential Search
int SequentialSearch(int key, int data[], int n) { int i; for (i = 0; i < n; i++) if (key == data[i]) return (i); return (-1); }
Latihan tracing
Binary Search
int BinarySearch(int key, int data[], int n) { int low, high, middle low = 0; high = n 1; while (low <= high) { middle = (low + high)/2; if (key == data[middle] return(middle); if (key < data[middle] high = middle 1; else low = middle + 1; } return(-1); }
Latihan tracing
Minggu Ketujuh
POINTER
Adalah TIPE DATA TURUNAN Contoh deklarasi : int *pointerX; Variabel bertipe pointer digunakan untuk menyimpan ALAMAT sebuah data, BUKAN NILAI datanya. Operator yang sering dipakai:
#include stdio.h void main() { int data, *pointer_data; data = 100; pointer_data = &data; printf(Data = %d di alamat %p\n, data, pointer_data); }
POINTER KE ARRAY
#include stdio.h void main() { int data[5] = {2,4,3,1,5}; int *pdata; pdata = &data[0]; for(int i=0; i<5; i++) printf(%d\t, *(pdata + i)); }
POINTER KE STRUCT
#include stdio.h void main() { struct { int jari_jari; float luas; }lingkaran, *pdata; pdata = &lingkaran; pdata->jari_jari = 10; pdata->luas = 314; printf(Jari jari = %d\tLuas = %f\n, pdata->jari_jari, pdata->luas); }
Minggu Kedelapan
Ujian Tengah Semester
Minggu Kesembilan
Next node
Data 4
Data 4
NO NEXT
In this linked list example, each node has two pieces of data. Each node also has a pointer to the next node. So, we need two things to form a linked list: a way to combine various datatypes and variables together into one datatype and a way to point to the next one of these combination datatypes. Sohow can we accomplish this?
The first goal, combining various datatypes and variables into one datatype, is easily handled with a structure. The second goal, being able to point to the next structure is easily handled using pointers. So, we have all of the components we need in order to construct a linked list.
Linked List
Struktur data yang terdiri dari beberapa simpul (node) dimana setiap simpulnya saling terhubung (linked). Simpul berupa struct, sedangkan link berupa komponen simpul yang bertipe pointer ke simpul. Bersifat dinamis. Memakai perintah malloc() dan free(). Umumnya memiliki pointer head untuk menunjukkan alamat simpul terdepan dan pointer tail untuk menunjukkan simpul terakhir. Operasi penambahan/ penghapusan sebuah simpul akan meng-update nilai pointer link-nya. Pointer link simpul terakhir diberi nilai NULL (kecuali untuk circular linked list).
void main()
simpulku *simpul1, *simpul2, *simpul3;
//alokasi memori simpul1 = (simpulku *)malloc(sizeof(simpulku)); simpul2 = (simpulku *)malloc(sizeof(simpulku)); simpul3 = (simpulku *)malloc(sizeof(simpulku)); //isi data strcpy(simpul1->nama, Amin); strcpy(simpul2->nama, Budi); strcpy(simpul3->nama, Citra); simpul1->nilai=90; simpul2->nilai=20; simpul3->nilai=100; //sambungkan link-nya simpul1->next_simpul = simpul2; simpul2->next_simpul = simpul3; simpul3->next_simpul = NULL;
Alamat = 1000
Amin
Alamat = 1080
Budi
Alamat = 2370
Citra
90
1080
20
2370
100
NULL
simpul1
1000
simpul2
1080
simpul3
2370
Alamat = 1000
Amin
Alamat = 1080
Budi
Alamat = 2370
Citra
90
1080
20
2370
100
NULL Pointer Tail
simpul1
1000
Pointer Head
Alamat = 1000
Amin
Alamat = 1080
Budi
Alamat = 2370
Citra
90
1080
20
8460
100
NULL
simpul1
1000
New
Alamat = 1000
Amin
Alamat = 1080
Budi
Alamat = 2370
Citra
90
2370
20
2370 free()
100
NULL
simpul1
1000
void main() { simpul baru, head=NULL, tail=NULL, temp; int pilih; do { printf("MENU\n"); printf("1. Insert\n"); printf("2. View\n"); printf("3. Search\n"); printf("4. Delete\n"); printf("PILIH: "); scanf("%d", &pilih); switch(pilih) { } }while (pilih!=5); }
Insert Node
case 1: int data; printf("Data Masuk: "); scanf("%i", &data); baru = (simpul) malloc(sizeof (struct node)); baru->info = data; baru->next = NULL; if (head == NULL) //list masih kosong { //simpul yg pertama kali head = baru; tail = baru; } else { tail->next = baru; tail = baru; } break;
Search a Node
case 3: int cari; printf("Cari Angka: "); scanf("%i", &cari); temp = head; while((temp!=NULL)&&(temp->info!=cari)) { temp = temp->next; } if(temp != NULL && temp->info == cari) printf("Data Ditemukan"); else //if(temp == NULL) printf("Data Tidak Ditemukan"); printf("\n"); break;
Delete a Node
case 4: int hapus; char jwb; simpul prev = NULL; printf("Hapus Angka: "); scanf("%i", &hapus);
//temukan dulu node yang akan dihapus temp = head; while((temp!=NULL)&&(temp->info!=hapus)) { prev = temp; temp = temp->next; } //bersambung
if(temp != NULL && temp->info == hapus) //ditemukan { printf("Yakin Dihapus? (y/t)"); flushall(); jwb=getch(); if(jwb == 'y') { if(temp->next != NULL && temp != head) prev->next = temp->next; else if (temp->next == NULL) prev->next = NULL; else if (temp == head && head->next == NULL) head = NULL; else if (temp == head && head->next != NULL) head = head->next; free(temp); //hapus node-nya } else printf("Batal Dihapus"); } else printf("Data Tidak Ditemukan"); printf("\n"); break;
Capture Program
Minggu Kesepuluh
Macam-macam List
Singly linked list Doubly linked list Singly circular linked list Doubly circular linked list
A linked list node containing a single forward pointer may be declared as follows
struct Node { int struct Node };
A linked list node containing a forward and a backward pointer may be declared as follows
struct Node { int struct Node struct Node };
data; *next_in_line; *previous_in_line;
Minggu Kesebelas
Stack
Definisi Stack Operasi-operasi dasar Stack
Push Pop
STACK (TUMPUKAN)
Kumpulan items yang teratur dimana items baru akan dimasukkan ke dan sebuah items akan dikeluarkan dari satu ujung yang sama, yaitu dari TOP sebuah stack. Struktur data linier dimana hanya bagian TOPnya saja yang bisa diakses. Bersifat LIFO = Last In First Out. Bisa diimplementasikan menggunakan array atau Linked List.
Penggunan Stack
History pada web browser. Undo Log pada text editor. Pemrosesan struktur bersarang (nested) : loop, rekursi, fungsi, dll. Algoritma back tracking Artificial Intelegence
Note : pop dan push dilakukan melalui ujung yang sama (TOP)
Y
O P K K P K P K K T R T W R T W R T
D
a
D
b
D
c
D
d
D
e
D
f
D
g
D
h
D
i
D
j
initialize ( stack *s) pop ( stack *s, char *x ) push ( stack *s, char x ) show ( stack *s )
Fungsi Initialize
void initialize ( stack *s) // operasi initialize dg parameter // s bertipe pointer stack { s -> top = -1; // top = -1 stack dlm kondisi empty }
Fungsi Push
void push ( stack *s, char x ) { if (s->top > maxsize) // stack is full printf("\nERROR: the stack is full!"); else { s->top = s->top + 1; s->items [ s->top ] = x; printf("\nPUSH SUCCEED"); } }
Fungsi Pop
void pop ( stack *s, char *x ) { if (s->top < 0) // stack is empty printf("\nERROR: the stack is empty!"); else { *x = (s->items [ s->top ]); s->top = s->top - 1; printf("\nPOP SUCCEED"); } }
Fungsi Show
void show( stack *s ) { printf("\nISI STACK :\n"); for(int i=s->top; i>=0; i--) printf("\t%c\n", s->items[i]); printf("\n"); }
Fungsi Main
void main() { stack *my_stack, s; char item, *x; my_stack = &s; x = &item; initialize(my_stack); push(my_stack, 'A'); push(my_stack, 'R'); push(my_stack, 'I'); push(my_stack, 'F'); show(my_stack); pop(my_stack, x); pop(my_stack, x); show(my_stack); pop(my_stack, x); pop(my_stack, x); show(my_stack); }
Output Program
Push Operation
Pop Operation
Minggu Keduabelas
Example Case
1. 2. 3.
Evaluasi Postfix
Postfix adalah bentuk persamaan matematika dimana operator ditulis setelah kedua operannya. Contoh :
AB+ CDE*-
FG/H+
(D E))^(F+G)
Latihan :
Jika A = 1, B = 2, C = 3, hitunglah : 1. AB+C 2. ABC+ 3. AB*CD+^
Minggu Ketigabelas
Queue
Definisi Queue Operasi-operasi dasar Queue
Insert/
Queue
Sequence of items. Items dimasukkan dari ujung belakang, dikeluarkan dari ujung depan. Bersifat FIFO (First In First Out).
Jenis Queue
Normal queue. Circular queue. DE-queue (double ended). Ex. High and low priority policy Priority queue.
Penggunaan Queue
Waiting list birokrasi. Simulasi sistem antrian. Antrian printer jobs. Antrian proses multitasking dalam CPU. Antrian playlist winamp.
Operasi Dasar
Enqueue Memasukkan item ke dalam queue. Dequeue Mengeluarkan item dari queue. Is_Full Mengecek apakah queue penuh. Is_Empty Mengecek apakah queue kosong. Initialize Membuat queue untuk pertama kali.
Initialize
void initialize ( queue *q ) { q -> jumlah = 0; q -> depan = 0; q -> belakang = 0; }
Is_Empty
int Is_Empty ( queue *q ) { if (q -> jumlah == 0) return (1); else return (0); }
Is_Full
int Is_Full ( queue *q ) { if (q -> jumlah == maxsize) return (1); else return (0); }
Enqueue
void enqueue ( char X, queue *q ) { if ( Is_Full(q) ) printf(\nERROR: queue sudah penuh\); else { q->data[q->belakang] = X; q->belakang = (q->belakang+1)%maxsize; ++(q->count); } }
Dequeue
void dequeue ( queue *q, char X ) { if ( Is_Empty(q) ) printf(\nERROR: queue sudah kosong\); else { X = q->data[q->depan]; q->depan = (q->depan+1)%maxsize; --(q->count); } }
Show_Queue
void show_queue(queue *q) { printf("\nIsi Queue:\n"); for(int i=q->depan; i<q->belakang; i++) printf("%c ", q->data[i]); printf("\n"); }
Note: script ini khusus untuk normal queue
void main()
queue kyu, *q; char x, *px; q = &kyu; px = &x; inisialisasi(q); enqueue('Q', q); show_queue(q); enqueue('U', q); show_queue(q); enqueue('E', q); show_queue(q); enqueue('U', q); show_queue(q); enqueue('E', q); show_queue(q); dequeue(q,px); show_queue(q); dequeue(q,px); show_queue(q); dequeue(q,px); show_queue(q); dequeue(q,px); show_queue(q); dequeue(q,px); show_queue(q);
Output
Enqueue Operation
Dequeue Operation
Minggu Keempatbelas
Graph
LINIER
Elemen data tersusun secara berurutan. Contoh : stack dan queue
HIRARKI
Elemen data tersusun secara bertingkat. Contoh : tree
KOMPLEK
Elemen data tersusun secara kombinasional. Contoh : graph
Struktur data non-linier. Penambahan atau penghapusan elemen data tidak mengakibatkan strukturnya tumbuh atau menyusut secara linier (garis lurus). Strukturnya bersifat hierarkis multidimensi 2 dimensi atau lebih. Umumnya diimplementasikan dengan array multidimensi atau linked list multilink.
Pengenalan Graph
Komponen penyusun :
Vertices
Jenis :
Weighted/
Traversal (penelusuran) :
DFS
DFS
Pencarian dilakukan dari node awal (root) lalu ke simpul anak hingga yang paling akhir (leaf) Jika tujuan yang diinginkan belum tercapai maka pencarian dilanjutkan ke cabang sebelumnya
BFS
Pencarian dilakukan dengan mengunjungi setiap node pada level yang sama sampai mencapai tujuan atau sampai node terakhir
Minggu Kelimabelas
Presentasi Tree
Pengenalan Tree
All other data structures we have discussed only contain one nodes contain two links
None, one, or both of which may be NULL
Binary trees
All
The
root node is the first node in a tree. Each link in the root node refers to a child A node with no children is called a leaf node
Struktur Data
#define NUMNODES 500 Struct nodetype{ int info; int left; int right; int father; }; Struct nodetype node[NUMNODES]; Struct nodetype{ int info; struct nodetype *left; struct nodetype *right; struct nodetype *father; }; Struct nodetype *NODEPTR;
Tree traversals
Inorder traversal
1. Traverse the left subtree with an inorder traversal 2. Process the value in the node (i.e., print the node value) 3. Traverse the right subtree with an inorder traversal
Preorder traversal
1. Process the value in the node 2. Traverse the left subtree with a preorder traversal 3. Traverse the right subtree with a preorder traversal
Postorder traversal
1. Traverse the left subtree with a postorder traversal 2. Traverse the right subtree with a postorder traversal 3. Process the value in the node
Minggu Keenambelas
Ujian Akhir Semester