Hari
: Rabu
Tanggal Praktikum
: 28 November 2001
Shift
:4
Pertemuan
: 4
Tujuan Instruksional Khusus Mahasiswa memahami penggunaan BST / AVL Tree Pokok Bahasan BST / AVL Materi Membuat program dengan menggunakan BST / AVL Tree Data dalam file diurutkan dengan Binary Search Tree (BST). BST adalah binary tree yang nilai di node kirinya selalu lebih kecil dari node yang di kanan. Sedangkan cara penampilan datanya ada tiga, yaitu secara preorder, inorder, dan postorder. Preorder menampilkan berurutan dimulai dari root, lalu bagian kiri, dan terakhir kanan. Inorder mulai dari kiri, root, lalu kanan. Postorder mulai dari kiri, lanjut ke kanan, dan terakhir root. Sintaks yang digunakan : •
FILE *file1 Menentukan handle yang akan digunakan dalam program. Di sini hanya diperlukan satu handle, yaitu file1, karena operasi-operasi yang ada tidak memerlukan handle tambahan.
•
fread (void *ptr, size_t size, size_t n, FILE *stream) Perintah ini digunakan untuk membaca data dari FILE *stream. n menunjukkan banyaknya data yg dibaca per kali baca. Size menunjukkan sepanjang apa data yang akan kita baca. Sedangkan *ptr menunjuk pada bagian data yang dibaca.
•
fopen (const char *filename, const char *mode) Sebelum data dalam suatu file bisa diakses, maka filenya harus dibuka terlebih dahulu dengan sintaks fopen. *filename menunjukkan nama file yang akan
dibuka, sedangkan mode menunjukkan status file yang dibuka tsb. Mode yang dipakai dalam program ini adalah r (read), rt (read text ). •
fclose(FILE *stream) Untuk menutup FILE *stream yang sebelumnya telah dibuka.
•
fseek (FILE *stream, long offset, int whence) Fungsi ini berguna untuk mencari data kemudian memindahkan posisi kursor ke alamat tertentu. FILE *stream adalah file tempat data yang hendak dicari. Long offset adalah alamat (offset) tempat data tsb berada. Sedangkan int whence adalah tempat awal pencarian, biasanya digunakaan SEEK_SET yang berarti dari awal file. Khusus pada program ini ada mode lain yaitu SEEK_CUR, yaitu pencarian dilakukan dari posisi sekarang.
•
ftell(FILE *stream) Untuk mencari/mendapatkan alamat offset dari suatu data dalam file *stream.
•
fscanf (FILE *stream, const char *format [, address, ...]) Untuk membaca data dari FILE *stream disertai dengan jenis data dan nama data yang hendak diambil.
Hari
: Rabu
Tanggal Praktikum
: 28 November 2001
Shift
:4
Pertemuan
: 4
Pembahasan Soal ALGORITMA þ Pilih library yang ingin dipakai (di sini yang dipakai adalah stdio.h, conio.h, stdlib.h, dan string.h). Tetapkan pula file handle yang akan digunakan. Pada program ini dipakai satu file handle yaitu file1. Buat variabel yang akan dipakai dengan struct. Di sini dipakai dua buah struct, yaitu untuk BST dan untuk data.data. Deklarasikan pula modul yang akan dibuat. File data sudah disiapkan sebelumnya (dalam program ini dipakai “data.txt”) Program akan berlanjut ke main program. Main program hanya memanggil modul proses. Modul proses akan mulai dengan membersihkan layar dan menjalankan modul insert. Setelah itu akan menampilkan menu utama, di mana user harus memilih. Jika pilihan user tidak sesuai menu, maka menu utama akan tampil terus. Program akan keluar dan kembali ke prompt jika user memilih exit (4). þ Algoritma Insert Deklarasikan variabel yang akan digunakan. Di sini dipakai kode yang nantinya dipakai untuk menampung data. Buka file1 dengan mode r (read). Lalu siapkan tempat untuk curr. Curr kiri dan curr kanan diassign dengan nilai nol. Baca kode dari file1 dan lakukan hal- hal berikut selama semua kode belum dibaca habis : •
cek apakah root sama dengan NULL.
Jika ya copy kode ke curr kode, lalu assign NULL ke root kiri dan kanan. Jika tidak, maka jadikan temp sama dengan root, bentuk tempat baru untuk curr, copy kode ke curr kode, cari alamat curr, dan bandingkan apakah temp kode lebih besar atau kecil daripada curr kode. Jika lebih besar, masuk ke modul left, selain itu ke modul right dengan temp sebagai transfer parameter. Pindahkan posisi kursor sebanyak 46 dimulai dari awal file. Terakhir, tutup kembali file1. þ Algoritma right Jika temp kanan bernilai NULL, assign nol ke curr kiri, curr kanan, dan temp kanan. Jika tidak bernilai NULL, temp dibuat sama dengan temp kanan, bandingkan antara temp kode dengan curr kode. Jika temp kode lebih besar maka masuk ke modul left, selain itu ke right dengan temp sebagai transfer parameter. Jadi ada kemungkinan terjadi rekursif. þ Algoritma left Jika temp kiri bernilai NULL, assign NULL ke curr kiri, curr kanan, dan temp kiri. Selain itu, jadikan nilai temp kiri sebagai nilai temp. Bandingkan apakah temp kode lebih besar atau lebih kecil daripada curr kode. Jika lebih besar jalankan modul left lagi (rekursif), jika tidak jalankan modul right. þ Algoritma cetak_data Buka file1 dengan mode rt (read text). Cari letak data sesuai alamat dari temp, pencarian data dimulai dari awal file. Baca kode dari data, nama dari data, jabatan dari data, serta umur dari data. Cetak kesemua data yang telah dibaca di atas baris ini. Tutup kembali file1. þ Algoritma prefix
Cek apakah temp bernilai NULL atau tidak. (Ingat, untuk prefix, urutan pertama adalah root,.disusul dengan kiri, dan terakhir kanan). Jika tidak panggil modul cetak_data dengan temp sebagai transfer parameter, lalu panggil modul prefix dengan temp kiri sebagai parameter, lalu prefix dengan temp kanan sebagai parameter. Prefix dengan temp kiri akan dijalankan dahulu sampai semua habis, lalu baru jalankan prefix dengan temp kanan. þ Algoritma infix Cek apakah temp NULL atau tidak. Jika tidak, panggil modul infix dengan temp kiri sebagai parameter (Ingat, untuk infix, urutan pertama adalah kiri,.disusul dengan root, dan terakhir kanan). Setelah selesai, panggil cetak_data dengan temp sebagai parameter. Setelah cetak_data dijalankan, lakukan rekursif kembali dengan temp kanan sebagai parameter. þ Algoritma postfix Cek apakah temp bernilai NULL atau tidak. Jika tidak, jalankan modul postfix dengan temp kiri sebagai parameter. (Ingat, untuk postfix, urutan pertama adalah kiri,.disusul dengan kanan, dan terakhir root). Setelah temp kiri tidak ada lagi, jalankan fungsi yang sama dengan temp kanan sebagai parameter. Setelah selesai, jalankan cetak_data dengan temp sebagai parameter..
CODING #include<stdio.h> #include
#include<stdlib.h> #include<string.h> FILE *file1;
struct BST { char kode[5]; long alamat; struct BST*kanan, *kiri; } *root=NULL, *curr, *temp; struct { char kode[6]; char nama[21]; char jabatan[21]; int umur; } data; void left(struct BST*temp); void right(struct BST*temp); void right(struct BST*temp) { if(temp->kanan==NULL) { curr->kiri=NULL; curr->kanan=NULL; temp->kanan=curr; } else { temp=temp->kanan; if(strcmp(temp->kode, curr->kode)<0) right(temp); if(strcmp(temp->kode, curr->kode)>0) left(temp); } }
void left(struct BST*temp) { if(temp->kiri==NULL) { curr->kiri=NULL; curr->kanan=NULL; temp->kiri=curr; } else { temp=temp->kiri; if(strcmp(temp->kode, curr->kode)<0) right(temp); if(strcmp(temp->kode, curr->kode)>0) left(temp); } } void insert() { char kode[5]; fflush(stdin);
clrscr(); file1=fopen("data.txt", "r"); curr=(struct BST*)malloc(sizeof(struct BST)); curr->kiri=NULL; curr->kanan=NULL; while(fread(kode, 5, 1, file1)!=NULL) { if(root==NULL) { strcpy(curr->kode, kode); curr->alamat=0; root=curr; root->kiri=NULL; root->kanan=NULL; } else { temp=root; curr=(struct BST*)malloc(sizeof(struct BST)); strcpy(curr->kode, kode); curr->alamat=ftell(file1)-5; if(strcmp(temp->kode, curr->kode)<0) right(root); if(strcmp(temp->kode, curr->kode)>0) left(root); } fseek(file1, 46, SEEK_CUR); } fclose(file1); } void cetak_data(struct BST *temp) { file1=fopen("data.txt", "rt"); fseek(file1, temp->alamat, SEEK_SET); fread(data.kode, 5, 1, file1); fread(data.nama, 20, 1, file1); fread(data.jabatan, 20, 1, file1); fscanf(file1,"%d", &data.umur); printf("\n%s%s%s%d", data.kode, data.nama, data.jabatan, data.umur); fclose(file1); } void prefix(struct BST* temp) { if(temp!=NULL) { cetak_data(temp); prefix(temp->kiri); prefix(temp->kanan); } getch(); } void infix(struct BST* temp) { if(temp!=NULL) { infix(temp->kiri);
cetak_data(temp); infix(temp->kanan); } getch(); } void postfix(struct BST* temp) { if(temp!=NULL) { postfix(temp->kiri); postfix(temp->kanan); cetak_data(temp); } getch(); } void display() { clrscr(); printf("1. Show Prefix"); printf("\n2. Show Infix"); printf("\n3. Show Postfix"); printf("\n4. Exit"); printf("\nPilihan Anda : "); } void proses() { char a; insert(); do { display(); a=getch(); switch (a) { case '1' : { prefix(root); break; } case '2' : { infix(root); break; } case '3' : { postfix(root); break; } case '4' : break; default } }
: display();
while(a!='4'); } void main() { proses(); }