LISTING PROGRAM:
#include
#include
#include
#include
typedef struct Tree
{
char
info[5];
struct
Tree *left;
struct
Tree *midle;
struct
Tree *right;
} T,*PT;
#define true 1
#define false 0
char init = false;
void preorder(PT root);
PT NewRoot(char info[]);
void destruct(PT root);
void DestructTree();
void DFS(PT root);
void create();
void insert(struct Tree **root,char
info[]);
void input();
void CetakDFS();
void cetak();
PT hPohon = {0};
int main()
{
int
pil;
clrscr();
do
{
printf("Tree\n\n");
printf("1.
Create Tree\n");
printf("2.
Insert Data\n");
printf("3.
Print DFS\n");
printf("4.
Exit\n\n");
printf("Pilihan
[1..4] : ");
scanf("%d",&pil);
switch(pil)
{
case 1:
create();
break;
case
2:
input();
break;
case
3:
cetak();
break;
case
4:
DestructTree();
break;
default:
printf("Pilihan
salah\n");
}
printf("\n");
}while(pil
!= 4);
getch();
return
0;
}
void preorder(PT root)
{
if(root
!= NULL)
{
printf("%s",root->info);
preorder(root->left);
preorder(root->midle);
preorder(root->right);
}
}
PT NewRoot(char info[])
{
PT
dummy;
dummy = (PT)malloc(sizeof(T)); //
Alokasi memori sebesar T
//dummy->info = info;
strcpy(dummy->info,info);
dummy->left
= NULL;
dummy->midle
= NULL;
dummy->right
= NULL;
return
dummy;
}
void destruct(PT root)
{
if(root
!= NULL)
{
destruct(root->left);
destruct(root->midle);
destruct(root->right);
free(root);
// Membersihkan memori
}
}
void DestructTree(void)
{
destruct(hPohon);
}
void DFS(PT root)
{
if(root
!= NULL)
{
printf("%s",root->info);
preorder(root->left);
preorder(root->midle);
preorder(root->right);
}
}
void create(void)
{
char
pil[4];
if(hPohon
!= NULL)
{
printf("Inisialisasi
Tree Baru [Y/T] : ");
scanf("%s",pil);
if(pil[0]
== 'Y' || pil[0] == 'y')
{
destruct(hPohon);
hPohon
= NULL;
printf("Tree
Reinitialized\n");
}
}
else
{
hPohon
= NULL;
printf("Tree
Initialized\n");
}
init
= true;
}
void insert(struct Tree **root,char
info[])
{
char
pil[4];
if(*root
== NULL)
(*root)
= NewRoot(info);
else
{
printf("Penunjuk
di -> %s\n",(*root)->info);
printf("Kiri (L), Tengah (M) atau
Kanan (R) : ");
scanf("%s",pil);
if(pil[0]
== 'R' || pil[0] == 'r')
insert(&(*root)->right,info);
else
if(pil[0] == 'M' || pil[0] == 'm')
insert(&(*root)->midle,info);
else
insert(&(*root)->left,info);
}
}
void input(void)
{
char
info[5];
if(!init)
printf("Initialized
Tree Needed\n");
else
{
printf("Input
data : ");
scanf("%s",info);
insert(&hPohon,info);
printf("Data
Telah masuk di Tree\n");
}
}
void CetakDFS(void)
{
printf("Depth
First Search : ");
DFS(hPohon);
}
void cetak(void)
{
if(!init)
printf("Initialized
Tree Needed\n");
else
CetakDFS();
}
LOGIKA PROGRAM:
#include
#include
#include
#include
Pertama-tama kita tuliskan file header apa saja yang akan
kita gunakan dalam program ini agar fungsi-fungsi didalam file header tersebut
dapat dijalankan. Salah satunya pada program ini kita menggunakan fungsi
getch(), maka kita harus menuliskan file header di preprocessor
#include ini.
typedef struct Tree
{
char
info[5];
struct
Tree *left;
struct
Tree *midle;
struct
Tree *right;
} T,*PT;
Selanjutnya kita mendeklarasikan
struct dengan nama Tree. Didalam struct ini kita mendeklarasikan info dengan indeks 5 tipe datanya char. Kemudian kita mendeklarasikan struct Tree*left, Tree*midle,
dan Tree*right. Lalu tipe dari struct ini adalah T. Dan pointer yang menunjuk
dari struct ini *PT.
#define true 1
#define false 0
char init = false;
void preorder(PT root);
PT NewRoot(char info[]);
void destruct(PT root);
void DestructTree();
void DFS(PT root);
void create();
void insert(struct Tree **root,char
info[]);
void input();
void CetakDFS();
void cetak();
PT hPohon = {0};
Setelah kita membuat struct, kita mendefinisikan konstanta
true dengan nilai 1 dan konstanta false dengan nilai 0. Kemudian memberi nilai
init dengan tipe data char yaitu nilai konstanta false. Lalu kita deklarasikan
fungsi-fungsi yang akan kita gunakan pada program ini. Disini kita mendeklarasikan
fungsi preorder dengan parameter root yang bertipe PT(struct yang tadi telah
kita buat), Fungsi NewRoot dengan parameter array info, fungsi Destruct dengan
parameter root, fungsi DestructTree, fungsi DFS dengan parameter root, fungsi
create, fungsi insert, fungsi input, fungsi cetakDFS, dan fungsi cetak. Selanjutnya
kita mendeklarasikan variabel hPohon dengan tipe data PT.
int main()
{
int
pil;
clrscr();
do
{
printf("Tree\n\n");
printf("1.
Create Tree\n");
printf("2.
Insert Data\n");
printf("3.
Print DFS\n");
printf("4.
Exit\n\n");
printf("Pilihan
[1..4] : ");
scanf("%d",&pil);
switch(pil)
{
case
1:
create();
break;
case
2:
input();
break;
case
3:
cetak();
break;
case
4:
DestructTree();
break;
default:
printf("Pilihan
salah\n");
}
printf("\n");
}while(pil
!= 4);
getch();
return
0;
}
Sekarang kita masuk ke fungsi main. Pertama
kita deklarasikan variabel pil untuk nanti menyimpan inputan user dan nilainya
kita gunakan pada seleksi kondisi switch. Saat program dijalankan, program akan
membersihkan layar terlebih dahulu. Kemudian kita masuk ke perulangan
do...while. Program akan mencetak tampilan menu untuk menanyakan inputan nilai
yang akan disimpan dalam variabel pil. Tampilan menu diatas akan terus dicetak
selama kondisi nilai dari variabel pil yang diinput user tidak sama dengan 4.
Untuk setiap nilai yang diinput user
untuk variabel pil, maka kita akan masuk ke seleksi kondisi switch...case. Jika
nilai yang diinput adalah 1 maka program akan memanggil fungsi create. Jika
nilai yang diinput adalah 2 maka program akan memanggil fungsi input. Jika
nilai yang diinput adalah 3 maka program akan memanggil fungsi cetak. Jika
nilai yang diinput adalah 4 maka program akan memanggil fungsi DestructTree.
Tetapi jika nilai yang diinput selain 1 sampai 4 maka program akan mencetak
”Pilihan salah”.
void preorder(PT root)
{
if(root
!= NULL)
{
printf("%s",root->info);
preorder(root->left);
preorder(root->midle);
preorder(root->right);
}
}
Sekarang kita masuk ke fungsi
preorder. Didalam fungsi ini program akan mengecek apakah nilai dari parameter
root tidak sama dengan null atau tidak. Jika nilai dari parameter root tidak
sama dengan null maka program akan mencetak nilai dari root->info. Maksudnya
adalah kita akan mencetak nilai dari info yang merupakan variabel dari struct
PT yang diakses oleh root(karena root bertipe data PT).
Selanjutnya program akan memanggil
fungsi preorder lagi dengan mengirimkan parameter root->left. Lalu program
akan melakukan memanggil fungsi preorder lagi dengan mengirimkan parameter
root->midle. Lalu program akan melakukan memanggil fungsi preorder lagi
dengan mengirimkan parameter root->right.
PT NewRoot(char info[])
{
PT
dummy;
dummy
= (PT)malloc(sizeof(T)); // Alokasi memori sebesar T
//dummy->info
= info;
strcpy(dummy->info,info);
dummy->left
= NULL;
dummy->midle
= NULL;
dummy->right
= NULL;
return
dummy;
}
Sekarang kita masuk ke fungsi NewRoot. Didalam fungsi ini kita
mendeklarasikan variabel dummy dengan tipe data PT. Lalu kita alokasikan memori
sebesar T ke dalam variabel dummy. Kemudian kita akan mengkopi nilai string
dari variabel info ke variabel dummy->info. Lalu memberi pada variabel
dummy->left, dummy->midle, dan dummy->right sama dengan null. Setelah
itu program mengembalikan nilai variabel dummy melalui parameter info.
void destruct(PT root)
{
if(root
!= NULL)
{
destruct(root->left);
destruct(root->midle);
destruct(root->right);
free(root);
// Membersihkan memori
}
}
Sekarang kita masuk ke fungsi destruct.
Didalam fungsi ini program akan mengecek apakah nilai dari parameter root tidak
sama dengan null atau tidak. Jika nilai dari parameter root tidak sama dengan
null maka program akan memanggil fungsi destruct lagi dengan mengirimkan
parameter root->left. Lalu program akan melakukan memanggil fungsi destruct
lagi dengan mengirimkan parameter root->midle. Lalu program akan melakukan
memanggil fungsi destruct lagi dengan mengirimkan parameter root->right.
Setelah itu program akan membersihkan memori parameter root.
void DestructTree(void)
{
destruct(hPohon);
}
Sekarang kita masuk ke fungsi destruct.
Pada fungsi DestructTree ini program akan memanggil fungsi destruct dengan
mengirimkan parameter hPohon.
void DFS(PT root)
{
if(root != NULL)
{
printf("%s",root->info);
preorder(root->left);
preorder(root->midle);
preorder(root->right);
}
}
Sekarang kita masuk ke fungsi DFS.
Didalam fungsi ini program akan mengecek apakah nilai dari parameter root tidak
sama dengan null atau tidak. Jika nilai dari parameter root tidak sama dengan
null maka program akan mencetak nilai dari root->info.
Selanjutnya program akan memanggil
fungsi preorder lagi dengan mengirimkan parameter root->left. Lalu program
akan melakukan memanggil fungsi preorder lagi dengan mengirimkan parameter
root->midle. Lalu program akan melakukan memanggil fungsi preorder lagi
dengan mengirimkan parameter root->right.
void create(void)
{
char
pil[4];
if(hPohon
!= NULL)
{
printf("Inisialisasi
Tree Baru [Y/T] : ");
scanf("%s",pil);
if(pil[0]
== 'Y' || pil[0] == 'y')
{
destruct(hPohon);
hPohon
= NULL;
printf("Tree
Reinitialized\n");
}
}
else
{
hPohon
= NULL;
printf("Tree
Initialized\n");
}
init
= true;
}
Sekarang kita masuk ke fungsi create.
Didalam fungsi ini kita deklarasikan string pil dengan indeks 4. Lalu program
akan mengecek apakah nilai dari variabel hPohon tidak sama dengan null atau
tidak. Jika nilai dari variabel hPohon tidak sama dengan null maka program akan
mencetak ”Inisialisasi Tree Baru [Y/T] :”. Lalu nilai yang diinput akan
dimasukkan kedalam variabel pil.
Selanjutnya nilai dari variabel pil
tersebut akan diseleksi dengan perintah if. Jika nilai yang diinput adalah ”Y”
atau ”y” maka program akan memanggil
fungsi destruct dengan mengirim parameter hPohon. Lalu memberi nilai variabel hPohon
sama dengan null. Setelah itu mencetak ”Tree Reinitialized”.
Tetapi jika nilai yang diinput
untuk variabel pil bukan ”Y” atau ”y”
maka program akan memberi nilai variabel hPohon sama dengan null.
Setelah itu mencetak ”Tree Reinitialized”.
Setelah selesai dengan seleksi
kondisi nilai pil untuk melakukan proses yang akan dilakukan, selanjutnya
memberi nilai variabel init sama dengan true.
void insert(struct Tree **root,char
info[])
{
char
pil[4];
if(*root
== NULL)
(*root)
= NewRoot(info);
else
{
printf("Penunjuk
di -> %s\n",(*root)->info);
printf("Kiri (L), Tengah (M) atau
Kanan (R) : ");
scanf("%s",pil);
if(pil[0]
== 'R' || pil[0] == 'r')
insert(&(*root)->right,info);
else
if(pil[0] == 'M' || pil[0] == 'm')
insert(&(*root)->midle,info);
else
insert(&(*root)->left,info);
}
}
Sekarang kita masuk ke fungsi insert.
Didalam fungsi ini kita deklarasikan string pil dengan indeks 4. Lalu program
akan mengecek apakah nilai dari pointer *root tidak sama dengan null atau
tidak. Jika nilai dari pointer *root tidak sama dengan null maka nilai dari
NewRoot(info) akan ditunjuk oleh pointer *root.
Tetapi Jika nilai dari pointer
*root tidak sama dengan null maka program akan mencetak ”Penunjuk
di->(disertai nilai dari variabel ifo yang ditunjuk pointer *root.
Selanjutnya program akan mencetak "Kiri (L), Tengah (M) atau Kanan (R) :
" untuk menanyakan inputan yang akan disimpan ke dalam variabel pil.
Selanjutnya nilai dari variabel pil
tersebut akan diseleksi dengan perintah if. Jika nilai yang diinput adalah ”R”
atau ”r” maka program akan memanggil
fungsi insert dengan mengirim parameter (&(*root)->right,info). Tetapi
jika yang diinput adalah ”M” atau ”m”
maka program akan memanggil fungsi insert dengan mengirim parameter (&(*root)->midle,info).
Tetapi jika nilai yang diinput
untuk variabel pil bukan ”R” atau ”r” maupun
”M” atau ”m” maka program akan memanggil fungsi insert dengan mengirim
parameter (&(*root)->left,info).
void input(void)
{
char
info[5];
if(!init)
printf("Initialized
Tree Needed\n");
else
{
printf("Input
data : ");
scanf("%s",info);
insert(&hPohon,info);
printf("Data
Telah masuk di Tree\n");
}
}
Sekarang kita masuk ke fungsi input.
Didalam fungsi ini kita deklarasikan string info dengan indeks 5. Kemudian kita masuk ke seleksi kondisi
if. Jika nilainya tidak init maka program akan mencetak ”Initialized Tree
Needed”. Tetapi jika nilainya adalah string init maka program akan mencetak
:Input data :” untuk menanyakan inputan yang akan disimpan ke dalam variabel
info. Kemudian program akan memanggil fungsi insert dengan mengirimkan
parameter &hPohon,info. Setelah itu program mencetak ”Data Telah masuk di
Tree”.
void CetakDFS(void)
{
printf("Depth
First Search : ");
DFS(hPohon);
}
Sekarang kita masuk ke fungsi CetakDFS.
Didalam fungsi ini program akan mencetak ”Depth First Search :”. Kemudian
program akan memanggil fungsi DFS dengan mengirimkan parameter hPohon.
void cetak(void)
{
if(!init)
printf("Initialized
Tree Needed\n");
else
CetakDFS();
}
Sekarang kita masuk ke fungsi
cetak. Didalam fungsi ini
kita masuk ke seleksi kondisi if. Jika nilainya tidak init maka program akan mencetak
”Initialized Tree Needed”. Tetapi jika nilainya adalah string init maka program
akan memanggil fungsi CetakDFS.
OUTPUT PROGRAM:
Untuk memeriksa pembuatan program
tekan tombol Alt+F9. Jika tidak ada kesalahan, tekan
sembarang tombol lalu tekan Ctrl+F9. Kemudian setelah kita input maka hasilnya
adalah: