Modul Struktur Data
Modul Struktur Data
2. Record : adalah koleksi dari obyek-obyek yang tipenya tidak harus sama
dan akses individual / obyek dilakukan dengan menyebut namanya (field).
Nomhs Char <= field 1
Nama Char <= field 2
Nilai float <= field 3
Bentuk umum :
struct nama_struct { tipe1 field1; typedef struct { tipe1 field1;
tipe2 field2; tipe2 field2;
............ .............
tipeN fieldN; tipeN fieldN;
}; } nama_struct;
struct nama_struct var_struktur; nama_struct var_struct;
Contoh:
struct data_Nilai { char nomhs[9]; typedef struct {char nomhs[9];
char nama[16]; char nama[16];
float nilai; float nilai;
}; } data_nilai;
struct data_nilai nilai_mhs; data_nilai nilai_mhs;
1
1) Contoh 1-1 program struktur data record (mahasiswa1.cpp) :
#include <iostream>
#include <cstring>
using std::cout;
int main()
{ struct data_nilai {
char nomhs[10];
char nama[16];
float nilai;
};
struct data_nilai nilaimhs;
strcpy(nilaimhs.nomhs,"123090000");
strcpy(nilaimhs.nama,"Sponsbob");
nilaimhs.nilai=95.00;
cout << "Nama : " << nilaimhs.nama << "\n";
cout << "Nomhs : " << nilaimhs.nomhs << "\n";
cout << "Nilai : " << nilaimhs.nilai;
}
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{ struct data_nilai{
char nomhs[10];
char nama[16];
float nilai;};
struct data_nilai nilaimhs;
cout << "Nama : "; cin >> nilaimhs.nama;
cout << "Nomhs : "; cin >> nilaimhs.nomhs;
cout << "Nilai : "; cin >> nilaimhs.nilai;
cout << endl;
cout << "Nama : " << nilaimhs.nama << "\n";
cout << "Nomhs : " << nilaimhs.nomhs << "\n";
cout << "Nilai : " << nilaimhs.nilai;
}
3)#include <iostream>
Contoh 1-3 program struktur data record dengan array (mahasiswa3.cpp):
using std::cout;
using std::cin;
using std::endl;
int main()
{
struct data_nilai {
char nomhs[10];
char nama[16];
float nilai;
};
struct data_nilai nilaimhs[10];
int i;
Lanjutan program
for (i=1; struktur
i<=2; i++)data record dengan array:
{
cout << "Nama : "; cin >> nilaimhs[i].nama;
cout << "Nomhs : "; cin >> nilaimhs[i].nomhs;
cout << "Nilai : "; cin >> nilaimhs[i].nilai;
cout << endl;
};
M
2
for (i=1; i<=2; i++)
{
cout << "Nama : " << nilaimhs[i].nama << '\n';
cout << "Nomhs : " << nilaimhs[i].nomhs << '\n';
cout << "Nilai : " << nilaimhs[i].nilai << '\n';
cout << endl;
}
}
#include <iostream>
#include <cstring>
#include <malloc.h>
using std::cout;
using std::endl;
int main()
{
struct data_nilai{
char nomhs[10];
char nama[16];
float nilai;
};
struct data_nilai nilmhs, *ptrnil;
ptrnil=(data_nilai *) malloc (sizeof(data_nilai));
ptrnil=&nilmhs;
strcpy(nilmhs.nomhs,"123090000");
strcpy(nilmhs.nama,"Sponsbob");
nilmhs.nilai=95.00;
D. TUGAS PRAKTIKUM
1. Buatlah program menu yang berisi data-data KTP penduduk yang disimpan
dalam array struct 1 dimensi dan dapat dilakukan penambahan data, pencarian
data, penampilan data dan penghapusan data.
2. Tugas dari asisten masing-masing.
3
M
4
MODUL 2
POINTER
A. TUJUAN PRAKTIKUM
Memahami pengertian tentang tipe data pointer.
Mahasiswa dapat mengimplementasikan tipe pointer pada modul-modul program.
B. ALOKASI WAKTU
1 X pertemuan = 120 menit
C. DASAR TEORI
1. Pengertian Pointer
Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat memori dari
suatu variabel lain. Alamat ini merupakan lokasi dari obyek lain (biasanya variabel
lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat dari variabel lain,
variabel pertama dikatakan menunjuk ke variabel kedua.
Operator Pointer ada dua, yaitu :
a. Operator &
Operator & bersifat unary (hanya memerlukan satu operand saja), dan
menghasilkan alamat dari operandnya.
b. Operator *
Operator * bersifat unary (hanya memerlukan satu operand saja), dan
menghasilkan nilai yang berada pada sebuah alamat.
2. Deklarasi Pointer
Bentuk Umum :
tipe_data *nama_pointer;
Tipe data pointer mendefinisikan tipe dari obyek yang ditunjuk oleh pointer. Secara
teknis, tipe apapun dari pointer dapat menunjukkan lokasi (dimanapun) dalam memori.
Bahkan operasi pointer dapat dilaksanakan relatif terhadap tipe dasar apapun yang
ditunjuk. Contoh, ketika kita mendeklarasikan pointer dengan tipe int*, kompiler akan
menganggap alamat yang ditunjuk menyimpan nilai integer - walaupun sebenarnya
bukan (sebuah pointer int* selalu menganggap bahwa ia menunjuk ke sebuah obyek
bertipe integer, tidak peduli isi sebenarnya). Karenanya, sebelum mendeklarasikan
sebuah pointer, pastikan tipenya sesuai dengan tipe obyek yang akan ditunjuk.
Contoh :
int *px;
char *sh;
int *p
float *nilai
char *s
5
Untuk mendeklarasikan sebuah pointer kosong pada memory digunakan perintah :
*malloc(size_t size)
Contoh:
p=(int *)malloc(sizeof(int));
q=(int *)malloc(sizeof(int));
a) p q
Pointer p dan q bernilai NULL, artinya pointer p dan q belum menunjuk ke alamat tertentu.
b) *p=10 *q=20
10 20
p q
Mengisi nilai 10 ke alamat yang ditunjuk pointer p dan nilai 20 ke alamat yang ditunjuk q.
c) p=q
10
p
20
q
Pointer p menunjuk ke alamat yang ditunjuk oleh pointer q.
#include <iostream>
using std::cout;
using std::endl;
int main()
{
int x, y; /* x dan y bertipe int */
int *px; /* px pointer yang menunjuk objek */
x = 87;
px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang ditunjuk px*/
cout << "Alamat x = " << &x << endl;
3. Operasi Pointer
cout << "Isi px = " << px << endl;
cout << "Isi x = " << x << endl;
cout << "Nilai yang ditunjuk oleh px = " << *px << endl;
cout << "Nilai y = " << y << endl;
}
Operasi Penugasan
Suatu variable pointer seperti halnya variable yang lain, juga bisa mengalami
operasi penugasan. Nilai dari suatu variable pointer dapat disalin ke variable pointer
yang lain.
M
6
Contoh 2 Program (pointer2.ccp):
#include <iostream>
using std::cout;
using std::endl;
int main()
{
float *x1, *x2, y;
y = 13.45;
x1 = &y; /* Alamat dari y disalin ke variabel x1 */
x2 = x1; /* Isi variabel x1 disalin ke variabel x2 */
cout << "Nilai variabel y = " << y <<" ada di alamat "<< &y <<endl;
cout << "Nilai variabel x2 = " << *x2 <<" ada di alamat "<< x2 <<endl;
}
#include <iostream>
#include <malloc.h>
using std::cout;
using std::endl;
int main()
{
int *p, *q, *r;
int n=10;
p=(int *)malloc(sizeof(int));
q=(int *)malloc(sizeof(int));
p=&n;
*q=120;
r=p;
cout << "Isi info pointer \n";
cout << "*p = " << *p << endl;
cout << "*q = " << *q <<endl;
cout << "*r = " << *r << endl;
cout << "\nAlamat register pointer :\n";
cout << "p = " << p <<endl;
cout << "q = " << q << endl;
cout << "r = " << r << endl;
n=*q;
p=q;
cout << "\nKondisi akhir isi info pointer :\n";
cout << "n = " << n <<endl;
cout << "*p = " << *p <<endl;
cout << "*q = " << *q <<endl;
cout << "*r = " << *r <<endl;
}
Operasi Aritmatika
Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer
saja. Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan.
Operasi penambahan dengan suatu nilai menunjukkan lokasi data berikutnya (index
selanjutnya) dalam memori. Begitu juga operasi pengurangan.
7
Contoh 4 Program (pointer4.cpp)
#include <iostream>
using std::cout;
int main()
{
int a = 100, b = 200, *pa, *pb;
pa = &a;
pb = &b;
if(pa < pb)
cout << "pa menunjuk ke memori lebih rendah dari pb\n";
if(pa == pb)
cout << "pa menunjuk ke memori yang sama dengan pb\n";
if(pa > pb)
cout << "pa menunjuk ke memori lebih tinggi dari pb\n";
}
int main()
{
char tokoh[] = "Roronoa Zoro";
char *ptokoh = "Roronoa Zoro";
cout << "Tokoh = " << tokoh << endl;
cout << "pTokoh = " << ptokoh << endl;
//tokoh++; /*tidak boleh,kenapa?*/
ptokoh++;
5. Pointer Menunjuk Suatu Array
cout << endl;
cout << "Tokoh = " << tokoh << endl;
cout << "pTokoh = " << ptokoh << endl;
}
M
8
Contoh 7 Program (pointer7.cpp)
#include "iostream"
using std::cout;
using std::endl;
int main()
{
static int tgl_lahir[] = { 12,5,1988 };
int *ptgl;
ptgl = tgl_lahir; /* ptgl berisi alamat array */
cout << "Diakses dengan pointer \n";
cout << "Tanggal = " << *ptgl <<endl;
cout << "Bulan = " << *(ptgl + 1) << '\n';
cout << "Tahun = " << *(ptgl + 2) <<'\n';
cout << "\nDiakses dengan array biasa\n";
cout << "Tanggal = " << tgl_lahir[0] << endl;
cout << "Bulan = " << tgl_lahir[1] << endl;
cout << "Tahun = " << tgl_lahir[2] << endl;
}
D. TUGAS PRAKTIKUM
Apa yang tercetak dari program-program berikut ini ?
1. Program 1
#include <iostream>
using std::cout;
using std::endl;
void misteri1(char *);
int main() {
char string[] = "characters";
cout << "String sebelum proses adalah " << string << endl;
misteri1(string);
cout << "String setelah proses adalah " << string;
}
void misteri1(char *s) {
while ( *s != '\0' ) {
if ( *s >= 'a' && *s <= 'z' )
*s -= 32;
++s; }
}
9
2. Program 2
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int misteri3(const char *);
int main() {
char string[80];
cout << "Ketik sebuah string : "; cin >> string;
cout << " " << misteri3(string);
}
2. Buatlah program pointer yang menggunakan fungsi untuk merubah suatu nilai yang
semula adalah 70 menjadi 85.
3. Pointer bagai pedang bermata dua, bisa sangat menguntungkan dan juga bisa sangat
merugikan. Sebut dan jelaskan kelebihan dan kekurangan (bahaya) penggunaan
pointer.
M
10
MODUL 3
LINKED LIST/ SENARAI BERKAIT-LINKED LIST
DENGAN POINTER
A. TUJUAN PRAKTIKUM
Mempraktekkan bentuk linked list / senarai berkait beserta operasi-operasi yang
dikenakan padanya dan mengimple mentasikan linked list menggunakan pointer.
B. ALOKASI WAKTU
2 X pertemuan = 240 menit
C. DASAR TEORI
1. Linked List/ Senarai Berkait
List : Koleksi dari obyek-obyek homogen dengan sifat setiap elemen (kecuali yang
terakhir) memiliki penerus dan setiap elemen (kecuali yang pertama) memiliki
pendahulu.
Suatu list linier dikenali :
alamat elemen pertama (First / Awal)
alamat elemen berIkut (Next)
setiap elemen list memiliki alamat, jika tidak ada disebut NULL.
Elemen list / Node:
INFO NEXT
Contoh suatu list yang terdiri dari 3 elemen:
Awal
Info Next
Awal
Elemen pertama tidak memiliki pendahulu/predesor oleh sebab itu alamat elemen
pertama digambarkan dengan anak panah dari kotak yang namanya awal. Elemen
terakhir tidak memiliki penerus / suksesor oleh sebab itu field Next nya di-NULL-kan.
Setiap elemen menyimpan alamat elemen penerusnya sehingga elemen list saling
berkait, maka list seperti ini disebut dengan Linked List.
11
2. Linked List (terurut)
Node-2 dalam linked list diurutkan berdasarkan salah satu field dalam node (field kunci).
Operasi-operasi pada Linked List:
1. Buatlist(list)
Mendeklarasikan / mendefinisikan linked list kosong
2. Listkosong(list)
Mengecek apakah list dalam keadaan kosong atau tidak
3. Telusurlist(list) atau Cetaklist(list)
Menelusuri / mencetak semua node pada linked list.
4. Sisipnode(list)
Menambah/menyisipkan node baru bersisi info baru (IB) pada linked list
sedemikian sehingga linked list tetap terurut.
5. hapusnode(list)
Menghapus node pada linked list yang sesuai dengan info yang dihapus.
Implementasi Link List Menggunakan Pointer
Contoh 1. Program Link List Dengan Pointer
/* Implementasi Linked List dengan pointer */
#include <iostream>
#include <malloc.h>
#define true 1
#define false 0
using std::cout;
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{typeinfo info;
typeptr next;};
typeptr awal,akhir;
void buatlistbaru();
void sisipnode(typeinfo IB);
void hapusnode(typeinfo IH);
void bacamaju();
void bacamundur();
int listkosong();
int main()
{
cout << "List Mula-mula :\n";
buatlistbaru();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
bacamaju();
M
12
Lanjutan Program Link List Dengan Pointer
void buatlistbaru()
{
typeptr list;
list=NULL;
awal=list;
akhir=list;
}
int listkosong()
{ if(awal==NULL)
return(true);
else
return(false); }
13
Lanjutan Program Link List Dengan Pointer
void bacamaju()
{
typeptr bantu;
bantu=awal;
while (bantu!=NULL)
{
cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
}
}
void bacamundur()
{ typeptr depan,bantu;
depan=awal;
awal=akhir;
do { bantu=depan;
while (bantu->next!=akhir)
bantu=bantu->next;
akhir->next=bantu;
akhir=bantu;
} while (akhir!=depan);
akhir->next=NULL;
bantu=awal;
while (bantu!=NULL)
{ cout << " " << bantu->info;
cout << " ";
bantu=bantu->next; }
}
M
14
Lanjutan Program List
void buatlistbaru()
{
typeptr list;
list=(typenode *) malloc(sizeof(typenode));
list=NULL;
awal=list;
akhir=list;
}
void sisipdepan(typeinfo IB)
{
typeptr NB;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
if (awal==NULL)
{ awal=NB;
akhir=NB; }
else
{ NB->next=awal; }
awal=NB;
}
void sisipbelakang(typeinfo IB)
{
typeptr NB;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
if (awal==NULL)
{ awal=NB;
akhir=NB; }
else
{ akhir->next=NB; }
akhir=NB;
akhir->next=NULL;
}
void sisiptengah(typeinfo IB)
{
typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
NB->next=NULL;
if (awal==NULL)
{ awal=NB;
akhir=NB;
}
else
{ bantu=awal;
while ((IB > bantu->next->info) && (bantu->next!=NULL))
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
}
}
void hapuslist(typeinfo IH)
{
typeptr hapus, bantu;
if (awal==NULL)
{
cout << "List masih kosong!\n";
}
15
Lanjutan Program List
else
{ if (awal->info==IH) /* hapus awal list */
{ hapus=awal;
awal=hapus->next;
free(hapus); }
else
{ bantu=awal; /* cari list yang akan dihapus */
while ((bantu->next->info!=IH) && (bantu->next!=NULL))
{ bantu=bantu->next; }
hapus=bantu->next;
if (hapus==NULL)
{ cout << "List tidak ditemukan\n";
}
else
{ if (hapus==akhir) /* hapus akhir list */
{ akhir=bantu;
akhir->next=NULL; }
else /* hapus list ditengah */
{ bantu->next=hapus->next; }
free(hapus); }
}
}
}
void cetaklist()
{ typeptr bantu;
bantu=awal;
while (bantu!=NULL)
{ cout << " " << bantu->info;
cout << " ";
bantu=bantu->next; }
}
D. TUGAS PRAKTIKUM
1. Buatlah program untuk memasukkan beberapa data dalam sebuah senarai (linked
list), jika akan mengakhiri tekan n maka akan muncul semua node yang masuk ke
dalam linked list tersebut.
2. Ubahlah program diatas, menggunakan bentuk struktur tanpa typedef!
M
16
MODUL 4
LINKED LIST MENGGUNAKAN ARRAY
A. TUJUAN PRAKTIKUM
Mengimplementasikan linked list menggunakan array beserta operasi-operasinya.
B. ALOKASI WAKTU
1 X pertemuan = 120 menit
C. DASAR TEORI
Pada pembahasan sebelumnya telah disinggung meskipun node-node dalam linked
list secara skematis bisa digambar secara berurutan, tetapi dalam memory sebenarnya
node-node tersebut tidak harus disimpan secara berurutan pula. Untuk menggambarkanya
kita dapat menggunakan array untuk mengimplementasikan list dalam memory.
Misalkan linked list tersebut kita namakan dengan daftar yang dapat
direpresentasikan sebagai berikut:
INFO NEXT
1 25 8
2 9
3 6
List=5 Isi list : 10 15 25 40 60
4 0
5 10 7
Kosong=3 6 2 Tempat-tempat kosong
7 15 1
8 40 10 Index : 3 6 2 9 4
9 4
10 60 0
17
Linked List Penuh : Jika kosong = 0 (karena index dimulai dari 1)
INFO NEXT
1 25 8
2 80 9
List=5 3 65 4 Isi list : 10 15 25 40 60 65 70
4 70 2
80 90 100
5 10 7
6 100 0
Kosong=0 7 15 1 Tempat-tempat kosong
8 40 10
9 90 6 Index : 0
10 60 3
Menghapus Node :
Node yang dihapus akan menjadi tempat kosong yang pertama kali.
Contoh : Hapusnode(list,25)
INFO NEXT
1 25X 3/6
2 9
List=5 3 30 8 Isi list : 10 15 30 40 60
4 0
5 10 7
Kosong=6 X 6 2 Tempat-tempat kosong
Kosong=1 7 15 1/ 3 Index : 1 6 2 9 4
8 40 10
9 4
10 60 0
M
18
Contoh 1. Program List Dengan Array
/*Program List Dengan Array*/
#include <iostream>
#define max 12
#define true 1
#define false 0
using std::cout;
using std::endl;
typedef struct {int info; int next; }typenode;
typenode elemen[max];
int list,akhirlist,kosong,akhirkosong;
int listkosong();
void buatlist();
void sisipnode(int IB);
void hapusnode(int IH);
void cetaklist();
int main()
{ buatlist();
cetaklist();
sisipnode(7);
cout << "\n\n Sisip 7 \n\n";
cetaklist();
sisipnode(30);
cout << "\n\n sisip 30 \n\n";
cetaklist();
hapusnode(7);
cout << "\n\n hapus 7 \n\n";
cetaklist();
}
void buatlist()
{ list=5;
kosong=3;
akhirlist=10;
akhirkosong=4;
elemen[1].info=25; elemen[1].next=8;
elemen[2].info=0 ; elemen[2].next=9;
elemen[3].info=0; elemen[3].next=6;
elemen[4].info=0; elemen[4].next=0;
elemen[5].info=10; elemen[5].next=7;
elemen[6].info=0; elemen[6].next=2;
elemen[7].info=15; elemen[7].next=1;
elemen[8].info=40; elemen[8].next=10;
elemen[9].info=0; elemen[9].next=4;
elemen[10].info=60; elemen[10].next=0;
}
int listkosong()
{ if (list==0)
return(true);
else
return(false);
}
void sisipnode(int IB)
{ int listbaru,k,m,n,x;
//-------------------------- sisip di awal
if(IB<elemen[list].info)
{listbaru=kosong;
kosong=elemen[kosong].next;
elemen[listbaru].info=IB;
elemen[listbaru].next=list;
list=listbaru;
}
19
Lanjutan Program List Dengan Array
else
//-------------------------sisip di akhir
if(IB>elemen[akhirlist].info)
{listbaru=kosong;
kosong=elemen[kosong].next;
elemen[listbaru].info=IB;
elemen[listbaru].next=0;
elemen[akhirlist].next=listbaru;
akhirlist=listbaru;
}
else
//--------------------------sisip di tengah
{n=list;
x=elemen[n].info;
while(IB>x)
{m=n;
n=elemen[n].next;
x=elemen[n].info;
}
k=elemen[kosong].next;
elemen[m].next=kosong;
elemen[kosong].info=IB;
elemen[kosong].next=n;
kosong=k;
}
}
void cetaklist()
{ int n,m;
n=list;
m=kosong;
cout << "isi list : \n";
do{
cout << elemen[n].info << " ";
n=elemen[n].next;
}while (elemen[n].next!=0);
cout << " "<< elemen[akhirlist].info <<endl ;
cout << "\nIndex tempat-tempat kosong: \n";
do
{cout << m << " ";
m=elemen[m].next;
}while(elemen[m].next!=0);
cout << " " << akhirkosong;
}
M
20
MODUL 5
LINKED LIST BERKEPALA DAN BEREKOR
A. TUJUAN PRAKTIKUM
Mempraktekkan bentuk linked list berkepala dan berekor dan linked list melingkar
beserta operasi-operasi yang dikenakan padanya dan mengimplementasikan linked list
menggunakan pointer.
B. ALOKASI WAKTU
1 X pertemuan = 120 menit
C. DASAR TEORI
1. Linked List Berkepala dan Berekor
Linked List Berkepala & Berekor adalah linked list yang ditambahkan dua node
“dummy” masing-masing kepala dan ekor tetapi secara logik tidak termasuk anggota linked
list.
Kepala diberi nilai yang pasti lebih kecil dari semua kemungkinan nilai yang ada,
sedangkan ekor nilai yang pasti lebih besar dari semua kemungkinan nilai yang ada.
-9999 9999
21
Lanjutan Program Link List Berkepala dan Berekor
void bacamaju();
void bacamundur();
void bacaback();
int listkosong();
int main()
{
buatlist();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
sisipnode(40);
bacamaju();
cout << "\n\nHapus node 20\n";
cout << "\nList setelah dihapus, dibaca dari belakang :\n\n";
hapusnode(20);
bacamundur();
}
void buatlist()
{
kepala=(typenode *)malloc(sizeof(typenode));
ekor=(typenode *)malloc(sizeof(typenode));
kepala->info=-9999;
kepala->next=ekor;
ekor->info=9999;
ekor->next=NULL;
}
int listkosong()
{ if(kepala->next==ekor)
return(true);
else
return(false); }
void sisipnode(typeinfo IB)
{
typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
bantu=kepala;
while (IB > bantu->next->info)
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
}
void hapusnode(typeinfo IH)
{ typeptr hapus, bantu;
if (listkosong())
cout << "List masih kosong";
else
{ bantu=kepala;
while (bantu->next!=ekor && IH!=bantu->next->info)
bantu=bantu->next;
if (IH==bantu->next->info)
{ hapus=bantu->next;
bantu->next=hapus->next;
free(hapus); }
else
cout << "Node tidak ditemukan!\n";
}
}
M
22
Lanjutan Program Link List Berkepala dan Berekor
void bacamaju()
{
typeptr bantu;
bantu=kepala->next;
while (bantu!=ekor)
{
cout << " " << bantu->info;
bantu=bantu->next;
}
}
void bacamundur()
{
typeptr depan,bantu;
depan=kepala;
kepala=ekor;
do { bantu=depan;
while (bantu->next!=ekor)
bantu=bantu->next;
ekor->next=bantu;
ekor=bantu;
} while (ekor!=depan);
ekor->next=NULL;
bantu=kepala->next;
while (bantu!=ekor)
{ cout << " " << bantu->info;
bantu=bantu->next; }
}
Kepala List
Contoh 2 Program Link List Circle
/* Linked List CIRC*/
#include <iostream>
#include <malloc.h>
using std::cout;
#define true 1
#define false 0
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{typeinfo info;
typeptr next;};
typeptr awal,akhir;
void buatlistbaru();
void sisipnode(typeinfo IB);
void hapusnode(typeinfo IH);
23
Lanjutan Program Link List Circle
void bacamaju();
void bacamundur();
int listkosong();
int main()
{ cout << "List Mula-mula :\n";
buatlistbaru();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
bacamaju();
cout << "\n\nHapus node 50\n";
cout << "\nList terakhir :\n";
hapusnode(50);
bacamaju();
return 0;}
void buatlistbaru()
{ typeptr list;
list=(typenode *) malloc(sizeof(typenode));
list=NULL;
awal=list;
akhir=list;}
int listkosong()
{ if(awal==NULL)
return(true);
else
return(false); }
void sisipnode(typeinfo IB)
{ typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
NB->next=NULL;
if (listkosong())
{ awal=NB;
akhir=NB; }
else if (IB <= awal->info)
{ NB->next=awal;
awal=NB; }
else
{ bantu=awal;
while (bantu->next!=NULL && IB > bantu->next->info)
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
if (IB>akhir->info)
akhir=NB;
}
}
void hapusnode(typeinfo IH)
{ typeptr hapus, bantu;
if (listkosong())
cout << "List masih kosong\n";
else if (awal->info==IH)
{ hapus=awal;
awal=hapus->next;
free(hapus);
}
M
24
Lanjutan Program Link List Circle
else
{ bantu=awal;
while (bantu->next->next!=NULL && IH!=bantu->next->info)
bantu=bantu->next;
if (IH==bantu->next->info)
{ hapus=bantu->next;
if (hapus==akhir)
{ akhir=bantu;
akhir->next=NULL; }
else
bantu->next=hapus->next;
free(hapus);
}
else
cout << "Node tidak ditemukan!\n";
}
}
void bacamaju()
{
typeptr bantu;
bantu=awal;
while (bantu!=NULL)
{
cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
}
}
void bacamundur()
{
typeptr depan,bantu;
depan=awal;
awal=akhir;
do { bantu=depan;
while (bantu->next!=akhir)
bantu=bantu->next;
akhir->next=bantu;
akhir=bantu;
} while (akhir!=depan);
akhir->next=NULL;
bantu=awal;
while (bantu!=NULL)
{ cout << " " << bantu->info;
cout << " ";
bantu=bantu->next; }
}
D. Tugas Praktikum
Tambahkan tiga (3) proses hapus untuk masing-masing program diatas, buatlah
ilustrasinya dengan tulis tangan dikerjakan dengan rapi dan tertib.
25
M
26
MODUL 6
STACK / TUMPUKAN
A. TUJUAN PRAKTIKUM
Mempraktekkan bentuk stack / tumpukan beserta operasi-operasi yang dikenakan
padanya dan mengimplemen tasikan stack menggunakan array, record dan pointer
B. ALOKASI WAKTU
1 X pertemuan = 120 menit
C. DASAR TEORI
1. Stack / Tumpukan
Koleksi dari obyek-obyek yang homogen dengan operasi penambahan (push) dan
pengambilan elemen (pop) melalui suatu tempat yang disebut dengan TOS (Top of Stack).
4) Push (stack,IB)
a. Tujuan : Menambah elemen baru pada stack yang berisi info baru (IB) pd
posisi teratas
b. Input : Stack dan IB
c. Syarat awal : stack tidak penuh
d. Output : stack
e. Syarat akhir : stack bertambah satu
27
5) Pop (stack,IP)
a. Tujuan : Menengambil elemen dari stack yg berada pada posisi paling
atas dan infonya disimpan dalam info pop (IP)
b. Input : Stack
c. Syarat awal : stack tidak kosong
d. Output : stack dan IP
e. Syarat akhir : stack berkurang satu
1) Push
Caranya:
1. Naikkan nilai topnya
2. Tambahkan info baru (IB) pada stack paling atas (top)
2) Pop
Caranya:
1. Ambil/keluarkan elemen teratas dan simpan dalam info pop (IP)
2. Turunkan nilai topnya.
M
28
Contoh 1. Program Implementasi stack menggunakan array
29
3) Kelemahan Menggunakan Array
1. Stack hanya bisa menyimpan data tipe integer ! mengapa ?
2. Antara fisik dan logik tidak sama (tidak sinkron) ! mengapa ?
Untuk mengatasi hal tersebut, elemen dan nilai top dipisah.
1) Push
Caranya: 1. Naikkan nilai topnya
2. Tambahkan info baru (IB) pada stack paling atas (top)
2) Pop
Caranya: 1. Ambil/keluarkan elemen teratas dan simpan dalam info pop (IP)
2. Turunkan nilai topnya.
Tugas : Gambarkan Ilustrasinya
Contoh 2. Implementasi stack menggunakan record
M
30
Lanjutan Implementasi stack menggunakan record:
int main()
{
buatstack();
push(10);
push(76);
push(12);
push(1);
cetakstack();
cout << " \n\n";
pop();
pop();
pop();
cetakstack();
}
void buatstack()
{ stack.top=-1; }
int stackkosong()
{ if (stack.top==-1)
return(True);
else
return(False); }
int stackpenuh()
{ if (stack.top==max)
return(True);
else
return(False); }
void pop()
{ int IP;
if(stackkosong())
cout << "stack underflow\n";
else
{IP=stack.elemen[stack.top];
stack.top--;}; }
void cetakstack()
{
int i=0;
while (i<=stack.top)
{ cout << " " << stack.elemen[i] << endl;
i++;
}
}
5. Implementasi Stack Menggunakan pointer
Jumlah stack pada implementasi menggunakan array bersifat statis, artinya jumlah data
yang dapat ditampung pada stack tebatas sesuai dengan jumlah array yang disediakan.
Namun jika array hanya sebagian saja yang digunakan maka akan mubajir. Cara lain untuk
31
mengatasi hal tersebut adalah membuat stack bersifat dinamis dengan menggunakan
pointer.
1) Push
Caranya: 1. Buat node baru lalu diisi info baru (IB)
2. Sambungkan node baru (NB) ke stack
3. Belokkan stack ke NB
2) Pop
Caranya: 1. Letakkan pointer bantu dibawah stack teratas
2. Tunjuk node terakhir dengan pointer hapus
3. Belokkan stack ke node bantu
4. Hapus node hapus.
Contoh 3.Program Implementasi stack menggunakan Pointer:
/*Program Stack menggunakan pointer*/
#include <iostream>
#include <malloc.h>
#define True 1
#define False 0
using std::cout;
typedef int typeinfo;
typedef struct typestack *typeptr;
typedef struct typestack{typeinfo info;
typeptr next;
};
typeptr stack, stackawal;
void buatstack();
int stackkosong();
void push(typeinfo IB);
void pop();
void cetakstack();
int main()
{ buatstack();
push(25);
push(15);
push(20);
push(100);
cetakstack();
cout << " \n\n";
pop();
cetakstack();
}
M
32
Lanjutan Program Implementasi stack menggunakan Pointer
void buatstack()
{ typeptr NS;
NS=(typestack *) malloc(sizeof(typestack));
NS=NULL;
stackawal=NS;
}
int stackkosong()
{ if(stackawal==NULL)
return(True);
else
return(False);
}
void push(typeinfo IB)
{ typeptr NS;
NS=(typestack *) malloc(sizeof(typestack));
NS->info=IB;
if (stackawal==NULL)
stackawal=NS;
else
stack->next=NS;
stack=NS;
stack->next=NULL;
}
void pop()
{ typeptr hapus, bantu;
if (stackkosong())
{ cout <<"Stack kosong !\n"; }
else
{ bantu=stackawal;
hapus=stack;
if (hapus==stackawal)
{ stackawal=NULL;}
else
{ while(bantu->next->next!=NULL)
bantu=bantu->next;
stack=bantu;
stack->next=NULL;
};
free(hapus);
}
}
void cetakstack()
{
typeptr bantu;
bantu=stackawal;
while(bantu!=NULL)
{ cout << " " << bantu->info << '\n';
bantu=bantu->next;
}
}
33
Contoh 4 Implementasi program Stack dengan List
/* Implementasi Stack Menggunakan List */
#include <iostream>
#include <malloc.h>
#define True 1
#define False 0
using std::cout;
using std::endl;
typedef int typeinfo;
typedef struct typestack *typeptr;
typedef struct typestack{typeinfo info;
typeptr next;
};
typeptr awalstack, akhirstack;
void buat_stack();
int stack_kosong();
void buat_stack()
{ typeptr NS;
NS=NULL;
awalstack=NS;
akhirstack=NS; }
int stack_kosong()
{ if(awalstack==NULL)
return(True);
else
return(False); }
void pop()
{ typeptr hapus, bantu;
if (stack_kosong())
{ cout << "Stack kosong !\n";
}
M
34
Lanjutan Implementasi Program Stack dengan List
else
{ bantu=awalstack;
hapus=akhirstack;
if (hapus==awalstack)
awalstack=NULL;
else
{ while(bantu->next->next!=NULL)
bantu=bantu->next;
akhirstack=bantu;
akhirstack->next=NULL; }
free(hapus); }
}
void cetak_stack()
{ typeptr depan,bantu;
depan=awalstack;
awalstack=akhirstack;
do { bantu=depan;
while (bantu->next!=akhirstack)
bantu=bantu->next;
akhirstack->next=bantu;
akhirstack=bantu;
} while (akhirstack!=depan);
akhirstack->next=NULL;
bantu=awalstack;
while(bantu!=NULL)
{ cout << "" << bantu->info << endl;
bantu=bantu->next; }
}
D. Tugas Praktikum
Tambahkan lagi beberapa fungsi push dan pop untuk tiap program, pelajari dan
pahami.
Buatlah suatu program dengan memakai menu (push,pop,lihat,exit) untuk salah satu
program diatas. Sehingga untuk membuat isi stack kita isi sendiri, begitu juga untuk
menghapus isi stack juga kita tentukan sendiri.
35
M
36
MODUL 7
QUEUE / ANTRIAN
A. TUJUAN PRAKTIKUM
Mempraktekkan bentuk queue / antrian beserta operasi-operasi yang dikenakan
padanya dan mengimplementasikan queue meng-gunakan array dan pointer.
B. ALOKASI WAKTU
2 X pertemuan = 240 menit
C. DASAR TEORI
1. Queue/Antrian
Koleksi dari obyek-obyek yang homogen dengan operasi penambahan elemen
(Enqueue) dan pengambilan elemen (Dequeue) melalui dua tempat yang berbeda
yaitu belakang dan depan.
2. Operasi-operasi Pada Queue
1) Buat Queue (Queue)
Menginisialisasi / mendefinisikan Queue yang kosong
2) Queue kosong (Queue)
Mengecek apakah Queue dalam kedaan kosong atau tidak ?
3) Queue penuh (Queue)
Mengecek apakah Queue dalam kedaan penuh atau tidak ?
4) Enqueue (Queue, IB)
Menambah elemen baru pada Queue yang berisi info baru (IB) pd posisi paling
belakang
Syarat awal : Queue tidak penuh
Syarat akhir : Queue bertambah satu elemen
5) Dequeue (Queue, ID)
Menengeluarkan elemen dari Queue yg berada pada posisi paling depan dan
infonya disimpan dalam info dequeue (ID)
Syarat awal : Queue tidak kosong
Syarat akhir : Queue berkurang satu elemen
37
Buatqueue(queue)
Implementasi Queue menggunakan array dan depan selalu sama dengan nol (0)
1 2 3 4 5 6 7
A B C D E F G
Elemen
Depan = 1
Belakang = 4
Belakang = 4 maka isi queue adalah ABCD
Belakang = 1 maka isi queue adalah A
Belakang = 7 maka isi queue adalah ABCDEFG (queue penuh)
Belakang = 0 maka isi queue kosong
Enqueue(Queue, IB)
1. Naikkan nilai belakang
2. Masukkan info baru pada posisi belakang
Dequeue(Queue, ID)
1. Ambil elemen paling depan dan simpan pada ID
2. Geser semua elemen ke kiri
3. Turunkan nilai belakang
M
38
Belakang = 4 maka isi queue menjadi BCDK
Kelemahan:
1. Antara fisik dan logik tidak sama (tidak sinkron) ! mengapa ?
2. Setiap kali ada operasi dequeue semua elemen harus digeser kekiri.
Untuk mengatasi hal tersebut diimplementasikan queue melingkar !
Queue Melingkar
Enqueue(Queue, IB)
1. Geser nilai belakang (depan tetap)
2. Masukkan info baru pada posisi paling belakang
Dequeue(Queue, ID)
1. Ambil elemen paling depan dan simpan pada ID
2. Geser nilai depan (belakang tetap)
39
Sekarang perhatikan kasus di bawah ini
Ket : Dengan posisi yang sama kita tidak tahu kapan queue kosong dan kapan queue
penuh ? Untuk itu mengatasi hal tersebut implementasi queue menggunakan array
melingkar dengan mengorbankan satu tempat kosong tepat di depan elemen pertama !
M
40
Queue kosong jika : depan = belakang
Kelemahan:
1. Bersifat statis, karena menggunakan array dan jika ada array yang tidak digunakan akan
mubazir.
Untuk mengatasi implemtasi menggunakan pointer (linked list).
Ilustrasi jika ada penambahan (enqueue) dan ada pengambilan (dequeue) dengan linked
list.
41
Contoh 1. Program Queue Menggunakan Array
/* Implementasi queue menggunakan Array */
#include <iostream>
#include <malloc.h>
#define max 50
#define True 1
#define False 0
using std::cout;
typedef struct typequeue{int belakang;
int elemen[max]; };
struct typequeue queue;
void buatqueue();
void cetakqueue();
void enqueue(int IB);
void dequeue();
int queuekosong();
int queuepenuh();
int main()
{ buatqueue();
enqueue(12);
enqueue(78);
enqueue(5);
enqueue(34);
cetakqueue();
cout << "\n\n";
dequeue();
cetakqueue();
cout << "\n\n";
dequeue();
cetakqueue();
cout << "\n\n";
enqueue(89);
cetakqueue();
}
void buatqueue()
{
queue.belakang=0;
}
int queuekosong()
{
if(queue.belakang==0)
return(True);
else
return(False);
}
int queuepenuh()
{ if(queue.belakang==max)
return(True);
else
return(False); }
M
42
Lanjutan Program Queue Menggunakan Array
void dequeue()
{ int ID, i;
if(queuekosong())
cout << "queue underflow\n";
else
{ID=queue.elemen[1];
for (i=1; i<queue.belakang; i++)
queue.elemen[i]=queue.elemen[i+1];
queue.belakang--; }
}
void cetakqueue()
{ int i=1;
while(i<=queue.belakang)
{ cout << " " << queue.elemen[i];
i++; }
}
void buatqueue()
{ queue.depan=1;
queue.belakang=1; }
43
Lanjutan Program Queue Melingkar dengan Mengorbankan 1 tempat kosong
int queuekosong()
{ if(queue.depan==queue.belakang)
return(True);
else
return(False); }
int queuepenuh()
{ int next_belakang;
if(queue.belakang==max)
next_belakang=1;
else
next_belakang=queue.belakang+1;
if (queue.depan==next_belakang)
return(True);
else
return(False);
}
void dequeue()
{ typeinfo ID;
if(queuekosong())
cout << "queue underflow\n";
else
{ID=queue.elemen[queue.depan+1];
if(queue.depan==max)
queue.depan=1;
else
queue.depan++; }
}
void cetakqueue()
{ int i;
if(queue.depan==queue.belakang)
cout << "Queue kosong !";
else
{ if(queue.depan<queue.belakang)
{ i=queue.depan+1;
while(i<=queue.belakang)
{ cout << " " << queue.elemen[i];
i++; }
}
else
{ for(i=queue.depan+1;i<=max;i++)
cout << " " << queue.elemen[i];
for(i=1;i<=queue.belakang;i++)
cout << " " << queue.elemen[i];
}
}
}
M
44
Contoh 3. Program Implementasi Queue menggunakan List
/* Implementasi queue menggunakan list */
#include <iostream>
#include <malloc.h>
#define True 1
#define False 0
using std::cout;
typedef char typeinfo;
typedef struct typequeue *typeptr;
typedef struct typequeue{typeinfo info;
typeptr next;
};
typeptr qdepan, qbelakang;
void buatqueue();
int queuekosong();
void enqueue(typeinfo *IB);
void dequeue();
void cetakqueue();
int main()
{ buatqueue();
cout << "Kondisi Awal queue setelah di enqueue : \n";
enqueue("A");
enqueue("B");
enqueue("C");
enqueue("D");
cetakqueue();
cout << "\n\nKondisi queue setelah di dequeue : \n";
dequeue();
cetakqueue();
cout << "\n\nKondisi Akhir queue setelah di enqueue : \n";
enqueue("E");
enqueue("F");
cetakqueue();
}
void buatqueue()
{ qdepan=(typequeue *) malloc(sizeof(typequeue));
qdepan=NULL;
qbelakang=qdepan;
}
int queuekosong()
{ if(qdepan==NULL)
return(True);
else
return(False);
}
void enqueue(typeinfo *IB)
{ typeptr NB;
NB=(typequeue *) malloc(sizeof(typequeue));
NB->info=*IB;
if (qdepan==NULL)
qdepan=NB;
else
qbelakang->next=NB;
qbelakang=NB;
qbelakang->next=NULL;
}
45
Lanjutan Program Implementasi Queue menggunakan List
void dequeue()
{
typeptr hapus;
if (queuekosong())
{
cout << "Queue masih kosong !";
}
else
{ hapus=qdepan;
qdepan=hapus->next;
free(hapus); }
}
void cetakqueue()
{
typeptr bantu;
bantu=qdepan;
do { cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
} while(bantu!=NULL);
}
D. Tugas Praktikum
M
46
MODUL 8
GRAPH & POHON TELUSUR BINER (PTB)
A. TUJUAN PRAKTIKUM
Mendefinisikan graph, macam macam graph dan implemen-tasi graph
menggunakan array dan pointer.
Mendeskripsikan pengertian Pohon Telusur Biner (PTB) / Binary Search Tree (BST)
dan operasi-operasi yang dikena-kan padanya.
B. DASAR TEORI
1. Graph
Andaikan V adalah himpunan vertex-vertex/titik/node dan E adalah himpunan edge-
edge/garis, maka pasangan G=(V,E) disebut Graph, dimana E < V x V.
e E disebut elemen garis
v V disebut vertex / titik / node.
Contoh :
V = { v1, v2, v3, v4, v5 } v3
v2
e1
e2
e4
v4
v1 e3
v5
v4 v3
v6
47
v1 - v2 adalah lintasan
v1 - v6 - v5 adalah lintasan
v1 - v2 - v3 - v4 adalah lintasan
v2 - v3 – v4 adalah lintasan
Lintasan yang berawal dan berakhir pada vertex yang sama disebut dengan lintasan
tertutup atau cycle atau sirkuit.
v1 - v2 - v3 - v4 - v1 disebut sirkuit
Graph Berarah :
Jika edge-edge mempunyai arah (atau diberi arah) maka dikatakan graph berarah.
v2
v3
v1
v4 v5
v3 – v1 – v2 adalah lintasan
v2 – v1 bukan lintasan
Graph Terhubung :
Graph dengan sifat setiap 2 vertex terdapat lintasan yang menghubungkannya
Pohon :
Graph terhubung yang tidak memuat cycle.
Contoh pohon:
Pohon
Pohon Berakar
Pohon dengan sifat salah satu vertexnya diperlakukan secara khusus yang disebut akar.
A
A punya 3 anak yaitu B, C, D
B punya 1 anak yaitu E B C
C punya 2 anak yaitu F dan G
G
D punya 2 anak yaitu H dan I E D
F
A adalah orang tua dari B, C, D
B, C dan D bersaudara H I
*) Vertex yg tidak punya anak disebut daun, E, F, G, H, I adalah daun.
*) Vertex yg punya anak disebut cabang, A, B, C, D adalah cabang.
M
48
Pohon Berakar Biner:
Pohon berakar dengan sifat setiap vertex/node memiliki anak max 2.
A
Sub tree kiri
Sub tree
B kanan
C
F
D
G
K L
H J
I
Tree adalah suatu graf tak-berarah terhubung yang tidak mempunyai sirkuit sehingga
dapat dikatakan bahwa tree adalah graph yang khusus. Dalam sejumlah aplikasi data yang
tersimpan serta struktur hierarkisnya tidak akan berubah sejak mulai proses hingga selesai.
Sehingga digunakan struktur tree yang statis.
Untuk aplikasi lain data dan informasi yang digunakan berubah-ubah karena
munculnya data baru, dihilangkan suatu data tersimpan atau perubahan harga data
tersimpan umumnya mengakibatkanperubahan struktur hierarkis, sehingga digunakan
struktur tree dinamis. Jika suatu struktur didalamnya banyak tree yang saling tidak
berhubungan maka struktur tersebut disebut sebagai forest.. Atau forest adalah
sekumpulan graf tidak terhubung yang tidak mengandung sirkuit.
Binary Tree
Secara sederhana binaty tree didefinisikan sebagai suatu kelas dari tree yang
memiliki sifat setiap node hanya dapat bercabang satu atau dua atau tidak memiliki cabang
sama sekali. Terdapat beberapa jenis binary tree antara lain :
Rekursif Binary Tree : tree kosong atau suatu node yang memiliki subtree
kiri dan kanan yang merupakan binary tree.
49
Complete Binary Tree : subkelas binary tree yang mana node-node leafnya hanya
berada pada satu atau dua level terrendah yang sama dan terletak merapat
kesebelah kiri.
Perfect Binary Tree : subkelas binary tree yang mana semua node leaf berada
pada level yang sama.
Pointer-pointer berharga NULL apabila tidak ada lagi cabang pada arah yang
bersangkutan. Beberapa varian dari struktur ini memanfaatkan pointer untuk menunjuk ke
node pada suksesor atau predesornya dalam penelusuran.
Binary Tree atau Pohon biner berakar memiliki sifat pada setiap vertex/node menyimpan
data yang lebih besar dari semua node pada sub tree kiri tetapi lebih kecil dari semua
node pada sub tree kanan.
M
50
Traversal Binary Tree
Sama dengan Proses menalusuri satu persatu elemen data pada struktur. Penelusuran ini
disertai suatu proses tertentu pada node yang didatangi misalnya pencetakan, pencarian
atau kompilasi.
Cara-cara penelusuran :
Preorder : mengunjungi root dari tree (subtree), penelusuran preorder node-node
subtree kiri, penelusuran preorder node-node subtree kanan.
Postorder : penelusuran postorder subtree kiri, penelusuran postorder subtree kanan,
mengunjungi root dari tree (subtree) tersebut.
Inorder : penelusuran inorder node-node subtree kiri, mengunjungi root dari tree
(subtree) tersebut, penelusuran inorder node-node subtree kanan.
Contoh:
50
30 70
20 40 90
60
35
80
Operasi-operasi pada PTB :
1. Buat PTB
2. Cek PTB apakah osong
3. Telusuri PTB : Pre-In-Post order
4. Sisip node
5. Hapus node
6. Cari node
1. Buat Pohon Telusur Biner (PTB):
Node
Kiri Info kanan
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{ typeinfo info;
typeptr kiri, kanan;
};
typeptr akar;
51
Contoh:
50
30 70
2. Operasi Penelusuran
Seperti yang telah disebutkan diatas, terdapat 3 cara operasi penulusan pada PTB, yaitu:
A. Preorder (node – kiri – kanan)
1) Kunjungi node / akar
2) Kunjungi anak kiri
3) Kunjungi anak kanan
Kerjakan secara rekursif
Contoh di atas:
50 30 20 40 35 70 60 90 80
B. Inorder (kiri – node – kanan)
1) Kunjungi anak kiri
2) Kunjungi node / akar
3) Kunjungi anak kanan
Kerjakan secara rekursif
Contoh di atas:
20 30 35 40 50 60 70 80 90
*) Jika suatu PTB kunjungan secara inorder dan preorder diketahui maka PTB tersebut
dapat ditentukan dengan tunggal sehingga kunjungan secara post order bisa ditentukan.
Contoh:
Preorder : 50 30 20 40 35 70 60 90 80
Inorder : 20 30 35 40 50 60 70 80 90
*) Jika suatu PTB kunjungan secara inorder dan postorder diketahui maka PTB tersebut
dapat ditentukan.
M
52
Contoh:
Inorder : 20 30 35 40 50 60 70 80 90
Postorder : 20 35 40 30 60 80 90 70 50
*) Jika kunjungan secara preorder dan postorder diketahui ternyata PTB tidak tunggal
sehingga sulit ditentukan.
Contoh:
Preorder : B A
Postorder : A B
3. Sisip Node
Setiap node baru yang ditambah/disisipkan pasti menjadi daun. Bandingkan node baru
dengan node pada akar.
Jika node baru lebih kecil maka bandingkan dengan anak kiri
Jika node baru lebih besar maka bandingkan dengan anak kanan
Ulangi proses sampai ditemukan daun.
Prosedur sisipnode
1) Buat node baru (NB) diisi infobaru (IB)
2) Cari tempat penyisipan
53
Reoresentasi alokasi dinamis
Preorder(binarytreenode *P)
{ if(P!=NULL)
{ visit(P);
preorder(P->left);
preorder(P->right);
}
}
postorder(binarytreenode *P)
{ if(P!=NULL)
{ postorder(P->left);
postorder(P->right);
visit(P);
}
}
intorder(binarytreenode *P)
{ if(P!=NULL)
{ inorder(P->left);
visit(P);
inorder(P->right);
}
}
M
54
Lanjutan Program Pohon Telusur Biner (PTB)
sisipnode(70);
sisipnode(50);
sisipnode(10);
cetak();
cout << "\n\nNode yg dihapus harus terdapat pada PTB!";
cout << "\n\nMasukkan node yg dihapus : ";
cin >> NH;
hapusnode(NH);
cetak();
return 0;
}
void buat_ptb()
{ typeptr ptb;
ptb=NULL;
akar=ptb;
Lanjutan Progr }
int ptb_kosong()
{ if(akar==NULL)
return(true);
else
return(false); }
void sisipnode(typeinfo IB)
{ typeptr NB;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
NB->kiri=NULL;
NB->kanan=NULL;
if (ptb_kosong())
akar=NB;
else
{ b=akar;
p=akar;
// mencari tempat untuk menyisipkan node
while(p!=NULL && IB!=p->info)
{ b=p;
if (IB<p->info)
am Pohon Telusur Biner p=b->kiri;
else
p=b->kanan; }
if (IB==b->info)
cout << "\n\nNode " << IB << " sudah ada !\n\n";
else
{ if (IB<b->info)
b->kiri=NB;
else
b->kanan=NB; }
}
}
void cetak()
{
cout << "\nPre-order : ";
preorder(akar);
cout << "\nIn-order : ";
inorder(akar);
cout << "\nPost-order: ";
postorder(akar);
return;
}
55
Lanjutan Program Pohon Telusur Biner (PTB)
void preorder(typeptr akar)
{ if (akar!=NULL)
{ cout << " " << akar->info;
preorder(akar->kiri);
preorder(akar->kanan); }
}
void inorder(typeptr akar)
{ if (akar!=NULL)
{ inorder(akar->kiri);
cout << " " << akar->info;
inorder(akar->kanan); }
}
void postorder(typeptr akar)
{ if (akar!=NULL)
{ postorder(akar->kiri);
postorder(akar->kanan);
cout << " " << akar->info; }
}
void hapusnode(typeinfo IH)
{
if (ptb_kosong())
cout << "PTB Kosong !\n\n";
else
{ b=akar;
p=akar;
// Bila PTB memiliki anak kiri dan anak kanan dgn banyak anak cabang
else if (p->kiri!=NULL && p->kanan!=NULL)
{
temp=p->kiri;
b=p;
while (temp->kanan != NULL)
{ b=temp;
temp=temp->kanan; }
p->info=temp->info;
if (b==p)
b->kiri = temp->kiri;
else
b->kanan = temp->kiri;
free(temp);
}
// Bila PTB memiliki anak kiri saja dgn banyak anak cabang
else if (p->kiri!=NULL && p->kanan==NULL)
{
if (b==p)
akar=p->kiri;
else
{ if (p==b->kiri)
b->kiri=p->kiri;
else
b->kanan=p->kiri;
}
free(p);
}
// Bila PTB memiliki anak kanan saja dgn banyak anak cabang
else if (p->kiri==NULL && p->kanan!=NULL)
{
if (b==p)
akar=p->kanan;
else
{ if (p==b->kanan)
b->kanan=p->kanan;
else
b->kiri=p->kanan;
}
free(p);
}
}
D. Tugas Praktikum
Buatlah ilustrasi struktur pohon dari program di atas.
57