Senarai,
Tumpukan, Antrian, dan Pohon
5.1 Pengantar
Struktur data yang telah dipelajari
sejauh ini, seperti array subskript-tunggal dan array subskript-ganda, adalah
struktur data berukuran tetap. Bab ini akan mengintroduksi struktur data
dinamais, yang dapat bertumbuh dan menyusut pada saat eksekusi. Senarai berantai adalah koleksi item
data, dimana pengguna dapat menyisipkan dan menghapus sembarang item di mana
saja di dalam senarai tersebut. Tumpukan
penting pada kompiler dan sistem operasi; penyisipan dan penghapusan hanya
berlaku untuk item pada posisi paling atas tumpukan. Antrian merepresentasikan baris antrian; penyisipan hanya dilakukan
di belakang (disebut juga dengan ekor) antrian, dan penghapusan hanya dilakukan
di depan (disebut pula dengan kepala) antrian. Pohon biner memfasilitasi pencarian dan pengurutan
kecepatan-tinggi, dimana di dalamnya dilakukan eliminasi efisien atas item-item
data duplikat. Antrian
merepresentasikan hirarki sistem-file dan kompilasi ekspresi menjadi bahasa
mesin.
Pada bab ini, akan didiskusikan setiap
tipe struktur data dan diimplementasikan beberapa program yang menciptakan dan
memanipulasi setiap struktur data tersebut. Kelas, pewarisan, dan komposisi
diciptakan sehingga dapat meningkatkan kapabilitas struktur data.
5.2 Kelas
Referensi-Diri
Sebuah kelas referensi-diri memuat
sebuah anggota referensi yang menunjuk ke suatu objek kelas yang memili tipe
kelas yang sama. Sebagai contoh, definisi kelas pada Gambar 5.1 mendefinisikan
tipe Simpul. Tipe ini memiliki dua
variabel instans private, data dan referensi Simpul berikutnya.
Anggota berikutnya mereferensi sebuah objek bertipe Simpul, tipe yang sama dengan kelasnya. Jadi, istilah
referensi-diri sangat tepat untuk kasus ini. Anggota berikutnya dikenal dengan sebuah link atau rantai (ini berarti
bahwa berikutnya dapat dipakai untuk
“merantai atau mengikat” sebuah objek bertipe Simpul dengan objek lain bertipe sama). Kelas Simpul juga memiliki dua properti: satu untuk variabel data, dinamai Data, dan yang lain untuk variabel berikutnya, dinamai Berikutnya.
Objek referensi-diri dapat dirantai
atau dihubungkan bersama untuk membentuk struktur data, seperti senarai,
antrian, tumpukan, dan pohon. Gambar 5.2 mengilustrasikan pengikatan dua objek
referensi-diri untuk membentuk sebuah senarai. Garis-miring (backslash) \, yang merepresentasikan referensi null), ditempatkan pada anggota dari objek referensi-diri kedua
bertujuan untuk mengindikasikan bahwa link atau rantai tidak menunjuk ke objek
lain. Referensi null biasanya
mendefinisikan akhir sebuah struktur data.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
// Gambar 5.1 Kelas Simpul
class Simpul
{
private
int data;
private
Simpul berikutnya;
public
Simpul( int d )
{
// tubuh konstruktor
}
public
int Data
{
get
{
// tubuh get
}
set
{
// tubuh set
}
}
public
Simpul Berikutnya
{
get
{
// tubuh get
}
set
{
// tubuh set
}
}
}
|
Gambar 5.2 Dua objek kelas referensi-diri
dirantai atau dihubungkan bersama
Penciptaan struktur data dinamis
memerlukan alokasi memori dinamis, yaitu kemampuan program untuk mendapatkan
memori tambahan (untuk menampung variabel-variabel baru) dan untuk melepaskan
memori yang sudah tidak lagi dibutuhkan pada saat eksekusi. Ingat bahwa program
C# secara otomatis melakukan koleksi sampah memori.
Katakunci new penting dalam alokasi memori dinamis. Katakunci new mengambil nama kelas suatu objek
sebagai operand. Ia kemudian secara dinamis mengalokasikan memori untuk objek
yang baru, memanggil konstruktor kelas, dan menghasilkan sebuah referensi yang
menunjuk ke objek yang baru saja diciptakan. Sebagai contoh, statemen:
Simpul
simpulYgAkanDitambahkan = new Simpul( 10 );
mengalokasikan sejumlah memori tertentu
untuk menyimpan sebuah Simpul dan
menyimpan sebuah referensi yang menunjuk ke objek ini di dalam simpulYgAkanDitambahkan.
Beberapa topik ke depan akan
mendiskusikan senarai, tumpukan, antrian, dan pohon. Semua struktur data
tersebut diciptakan dan dikembangkan dengan alokasi memori dinamis dan kelas
referensi-diri.
5.3
Senarai Berantai
Senarai berantai adalah sebuah koleksi
linier (runtun) atas objek-objek kelas referensi-diri, yang dinamakan dengan
simpul, yang dikoneksi oleh rantai-rantai referensi. Program dapat mengakses
sebuah senarai berantai melalui referensi yang menunjuk ke simpul pertama pada
senarai. Setiap simpul diakses via anggota referensi pada simpul sekarang.
Secara konvensi, referensi pada simpul terakhir ditetapkan menjadi null untuk menandai akhir senarai. Data
disimpan pada sebuah senarai berantai secara dinamis, dimana setiap simpul
diciptakan jika diperlukan. Simpul dapat memuat sembarang tipe data, termasuk
objek-objek dari kelas lain.
Meskipun array juga dapat menyimpan
koleksi data, senarai berantai memberikan beberapa keuntungan dan keunggulan
lebih. Sangat tepat untuk menggunakan senarai berantai apabila jumlah elemen
data yang akan disajikan pada struktur data tidak dapat diprediksi. Tidak
seperti senarai berantai, ukuran dari array C# konvensional tidak dapat diubah,
karena ukuran array tetap ketika array diciptakan. Array konvensional bisa
menjadi penuh, tetapi senarai berantai hanya bisa penuh ketika sistem tidak
lagi mempunyai memori untuk memenuhi permintaan pengalokasian dinamis.
Programer dapat mengembangkan
(membengkakkan ukuran dari) senarai berantai secara berurutan hanya dengan
menyisipkan setiap elemen baru pada titik yang tepat di dalam senarai. Jadi,
penyisipan elemen baru tidak menyebabkan pemindahan elemen-elemen yang sudah
ada.
Normalnya, memori tidak menyimpan
simpul-simpul senarai berantai secara bertetangga di dalam memori. Gambar 5.3
mengilustrasikan sebuah senarai berantai yang memuat beberapa simpul.
Gambar 5.3 Representasi grafikal atas senarai
berantai
Program pada Gambar 5.4-5.5 menggunakan
sebuah objek kelas Senarai untuk
memanipulasi sekumpulan objek bertipe Object.
Metode Main pada module UjiSenarai (Gambar 5.5) menciptakan
beberapa objek, menyisipkan objek di awal senarai (menggunakan metode Senarai SisipDiDepan), menyisipkan objek di akhir senarai (menggunakan metode
Senarai SisipDiBelakang), menghapus objek dari depan senarai (menggunakan
metode Senarai HapusDariDepan), dan menghapus objek dari belakang senarai
(menggunakan metode Senarai HapusDariBelakang). Setiap operasi
penyisipan atau penghapusan akan memanggil metode Senarai Tampil untuk
menampilkan isi senarai sekarang. Diskusi detil atas program akan diberikan.
Sebuah EksepsiSenaraiKosong terjadi
jika percobaan untuk menghapus sebuah item dari senarai kosong dilakukan.
Program memuat empat kelas, SimpulSenarai (Gambar 5.4, baris 9-52),
Senarai (Gambar 5.4, baris 55-193), EksepsiSenaraiKosong (Gambar 5.4, baris
196-203), dan kelas UjiSenarai
(Gambar 5.5). Kelas-kelas pada Gambar 5.4 menciptakan sebuah pustaka
senarai-berantai. Ketiga kelas tersebut berada di dalam namespace PustakaSenaraiBerantai.
Terenkapsulasi di dalam tiap objek Senarai adalah sebuah senarai berantai
yang memuat objek-objek SimpulSenarai.
Kelas SimpulSenarai (Gambar 5.3,
baris 9-52) memuat dua variabel anggota, data
dan berikutnya. Anggota data dapat menunjuk ke sembarang objek.
Anggota berikutnya menyimpan sebuah
referensi yang menunjuk ke objek SimpulSenarai
berikutnya pada senarai berantai. Sebuah Senarai
mengakses variabel-variabel anggota SimpulSenarai
melalui properti Data (baris 44-50)
dan Berikutnya (baris 30-41).
Kelas Senarai memuat anggota-anggota private
simpulPertama (sebuah referensi yang menunjuk ke SimpulSenarai pertama pada sebuah Simpul) dan simpulAkhir
(sebuah referensi yang menunjuk ke SimpulSenarai
terakhir pada sebuah Simpul).
Konstruktor (baris 62-66 dan 69-71) menginisialisasi kedua referensi menjadi null. Metode SisipDiDepan (baris 76-87), SisipDiBelakang
(baris 92-104), HapusDariDepan
(baris 107-125), dan HapusDariBelakang
(baris 128-156) adalah metode-metode utama pada kelas Senarai. Setiap metode menggunakan blok lock untuk memastikan bahwa objek-objek CSenarai menjadi multithread
safe.
Metode ApaKosong (baris 159-165) adalah metode predikat yang menentukan
apakah senarai kosong (apakah referensi ke simpul pertama senarai adalah null). Metode predikat secara umum
menguji sebuah kondisi dan tidak memodifikasi objek. Jika senarai kosong,
metode ApaKosong menghasilkan true; sebaliknya, ia menghasilkan false. Metode Tampil (baris 168-191) menampilkan isi senarai. Kedua metode ApaKosong dan metode Tampil menggunakan blok lock untuk memastikan bahwa keadaan
senarai tidak berubah ketika metode-metode tersebut melakukan tugasnya.
Kelas EksepsiSenaraiKosong (baris 196-203) mendefinisikan sebuah kelas
eksepsi untuk menangani operasi-operasi ilegal pada Senarai yang kosong. Sebagai contoh, sebuah EksepsiSenaraiKosong terjadi jika program mencoba menghapus sebuah
simpul dari Senarai yang kosong.
Kelas UjiSenarai (Gambar 5.5) menggunakan pustaka senarai-berantai untuk
menciptakan dan memanipulasi sebuah senarai berantai. Baris 14 menciptakan
sebuah instans bertipe Senarai,
dinamai senarai. Kemudian, baris
17-20 menciptakan data yang akan ditambahkan ke dalam senarai. Baris 23-30
menggunakan metode-metode penyisipan Senarai
untuk menyisipkan objek-objek dan menggunakan metode Senarai Tampil untuk menampilkan isi senarai setelah tiap penyisipan dilakukan. Kode di dalam blok try (baris 36-53) menghapus objek-objek
(menggunakan metode-metode penghapusan Senarai),
menampilkan objek yang dihapus, dan menampilkan isi senarai setelah setiap penghapusan dilakukan. Jika terdapat
percobaan untuk menghapus sebuah objek dari senarai kosong, maka blok try (baris 68-69) akan menangkap EksepsiSenaraiKosong. Perhatikan bahwa
kelas UjiSenarai menggunakan namespace LinkedListLibrary. Jadi, projek yang memuat kelas UjiSenarai harus memuat sebuah
referensi yang menunjuk ke pustaka kelas PustakaSenaraiBerantai.
Pada beberapa halaman ke depan, akan
didisikusikan setiap metode dari kelas Senarai
secara detil. Metode SisipDiDepan
(Gambar 5.4, baris 76-87) menempatkan sebuah simpul baru di depan senarai.
Metode ini terdiri-dari tiga langkah, yang dapat dijelaskan berikut:
1.
Memanggil ApaKosong untuk
menentukan apakah senarai kosong (baris 80).
2.
Jika senarai kosong, kedua simpulPertama
dan simpulAkhir ditetapkan untuk
menunjuk ke SimpulSenarai yang baru
yang diinisialisasi dengan objek itemSisip
(baris 81-82). Konstruktor SimpulSenarai
pada baris 16-19 (kode 14.2) memanggil konstruktor SimpulSenarai pada baris
23-27 (Gambar 5.4) untuk
menetapkan variabel instans data
untuk menunjuk ke object yang
dilewatkan sebagai argumen pertama dan kemudian menetapkan berikutnya untuk menunjuk ke null.
Jika senarai tidak kosong, maka simpul
baru dirantaikan ke dalam senarai dengan menetapkan simpulPertama agar menunjuk ke objek SimpulSenarai yang baru, yang diinisialisasi dengan objek itemSisip dan simpulPertama (baris 84-85). Ketika konstruktor SimpulSenarai (baris 23-27 pada Gambar
5.4) dieksekusi, ia akan menetapkan variabel instans data agar menunjuk ke object
yang dilewatkan sebagai argumen pertama dan melakukan penyisipan dengan
menetapkan referensi berikutnya agar
menunjuk ke SimpulSenarai yang
dilewatkan sebagai argumen kedua.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
|
// Gambar 5.4: PustakaSenaraiBerantai.cs
// Definisi Kelas SimpulSenarai dan kelas Senarai.
using System;
namespace PustakaSenaraiBerantai
{
// kelas untuk
merepresentasikan satu simpul di dalam senarai
class SimpulSenarai
{
private object data;
private SimpulSenarai berikutnya;
//
konstruktor untuk menciptakan SimpulSenarai yang menunjuk ke nilaiData
// dan
merupakan simpul akhir di dalam senarai
public SimpulSenarai( object nilaiData )
: this( nilaiData, null )
{
}
//
konstruktor untuk menciptakan SimpulSenarai yang menunjuk ke nilaiData
// dan
menunjuk ke SimpulSenarai berikutnya di dalam senarai
public SimpulSenarai( object nilaiData, SimpulSenarai
simpulBerikutnya )
{
data =
nilaiData;
berikutnya = simpulBerikutnya;
}
// properti
Berikutnya
public SimpulSenarai Berikutnya
{
get
{
return berikutnya;
}
set
{
berikutnya = value;
}
}
// properti
Data
public object Data
{
get
{
return data;
}
}
} // akhir kelas
SimpulSenarai
// definisi kelas
Senarai
public class Senarai
{
private SimpulSenarai simpulPertama;
private SimpulSenarai simpulAkhir;
private string nama; // string seperti
"senarai" untuk ditampilkan
//
menciptakan Senarai kosong dengan nama yang dispesifikasi
public Senarai( string namaSenarai )
{
nama =
namaSenarai;
simpulPertama = simpulAkhir = null;
}
//
menciptakan Senarai kosong dengan "senarai" sebagai namanya
public Senarai() : this( "senarai" )
{
}
//
Menyisipkan objek di depan Senarai. Jika Senarai kosong,
// maka
simpulPertama dan simpulAkhir akan menunjuk ke objek yang sama.
// Sebaliknya, simpulPertama menunjuk ke simpul yang baru.
public void SisipDiDepan( object
itemSisip )
{
lock ( this )
{
if ( ApaKosong() )
simpulPertama = simpulAkhir =
new SimpulSenarai(
itemSisip );
else
simpulPertama =
new SimpulSenarai( itemSisip, simpulPertama );
}
}
//
Menyisipkan objek di akhir Senarai. Jika Senarai kosong,
// maka
simpulPertama dan simpulAkhir akan menunjuk ke objek yang sama.
// Sebaliknya,
properti Berikutnya pada
simpulAkhir menunjuk ke simpul baru.
public void SisipDiBelakang( object
itemSisip )
{
lock ( this )
{
if ( ApaKosong() )
simpulPertama = simpulAkhir =
new SimpulSenarai(
itemSisip );
else
simpulAkhir = simpulAkhir.Berikutnya =
new SimpulSenarai(
itemSisip );
}
}
// menghapus
simpul pertama dari Senarai
public object HapusDariDepan()
{
lock ( this )
{
if ( ApaKosong() )
throw new EksepsiSenaraiKosong( nama );
object itemHapus =
simpulPertama.Data; // mengambil data
//
mereset referensi simpulPertama dan simpulAkhir
if ( simpulPertama == simpulAkhir )
simpulPertama = simpulAkhir = null;
else
simpulPertama = simpulPertama.Berikutnya;
return itemHapus; // menghasilkan
data terhapus
}
}
// menghapus
simpul akhir dari Senarai
public object HapusDariBelakang()
{
lock ( this )
{
if ( ApaKosong() )
throw new
EksepsiSenaraiKosong( nama );
object itemHapus = simpulAkhir.Data;
// mengambil data
//
mereset referensi simpulPertama dan simpulAkhir
if ( simpulPertama == simpulAkhir )
simpulPertama = simpulAkhir = null;
else
{
SimpulSenarai sekarang = simpulPertama;
// loop selama simpul sekarang tidak simpulAkhir
while ( sekarang.Berikutnya !=
simpulAkhir )
sekarang = sekarang.Berikutnya; // maju ke simpul berikutnya
// sekarang adalah simpulAkhir yang baru
simpulAkhir = sekarang;
sekarang.Berikutnya = null;
}
return itemHapus; // menghasilkan
item terhapus
}
}
//
menghasilkan true jika Senarai kosong
public bool ApaKosong()
{
lock ( this )
{
return simpulPertama == null;
}
}
//
menampilkan isi Senarai
virtual public void Tampil()
{
lock ( this )
{
if ( ApaKosong() )
{
Console.WriteLine( nama + " Kosong"
);
return;
}
Console.Write( "# " + nama + " adalah: " );
SimpulSenarai sekarang = simpulPertama;
//
menampilkan data simpul sekarang apabila tidak di akhir senarai
while ( sekarang != null )
{
Console.Write( sekarang.Data + " " );
sekarang = sekarang.Berikutnya;
}
Console.WriteLine( "\n" );
}
}
} // akhir kelas
Senarai
// definisi kelas
EksepsiSenaraiKosong
public class EksepsiSenaraiKosong : ApplicationException
{
public EksepsiSenaraiKosong(string nama)
: base("# " + nama + " kosong")
{
}
} // akhir kelas
EksepsiSenaraiKosong
} // akhir namespace
PustakaSenaraiBerantai
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
// Gambar 5.5: UjiSenarai.cs
// Menguji kelas Senarai.
using System;
using PustakaSenaraiBerantai;
namespace UjiSenarai
{
// kelas untuk
menguji fungsionalitas kelas Senarai
class UjiSenarai
{
static void Main( string[]
args )
{
Senarai
senarai = new Senarai(); //
menciptakan kontainer Senarai
//
menciptakan data untuk disimpan di dalam Senarai
bool aBoolean = true;
char aKarakter = '$';
int aInteger = 34567;
string aString = "hallo";
//
menggunakan metode-metode penyisipan Senarai
senarai.SisipDiDepan( aBoolean );
senarai.Tampil();
senarai.SisipDiDepan( aKarakter );
senarai.Tampil();
senarai.SisipDiBelakang( aInteger );
senarai.Tampil();
senarai.SisipDiBelakang(aString);
senarai.Tampil();
//
menggunakan metode-metode penghapusan Senarai
object objekHapus;
// menghapus
data dari senarai dan menampilkannya (data yang terhapus)
try
{
objekHapus
= senarai.HapusDariDepan();
Console.WriteLine( objekHapus + " dihapus" );
senarai.Tampil();
objekHapus = senarai.HapusDariDepan();
Console.WriteLine(objekHapus + " dihapus");
senarai.Tampil();
objekHapus = senarai.HapusDariBelakang();
Console.WriteLine(objekHapus + " dihapus");
senarai.Tampil();
objekHapus = senarai.HapusDariBelakang();
Console.WriteLine(objekHapus
+ " dihapus");
senarai.Tampil();
}
//
melempar eksepsi jika senarai kosong ketika
//
percobaan penghapusan item dilakukan
catch (EksepsiSenaraiKosong
eksepsiSenaraiKosong)
{
Console.Error.WriteLine("\n" + eksepsiSenaraiKosong);
}
} // akhir
metode Main
} // akhir kelas
UjiSenarai
}
|
# senarai adalah: True
# senarai adalah: $ True
# senarai adalah: $ True 34567
# senarai adalah: $ True 34567 hallo
$ dihapus
# senarai adalah: True 34567 hallo
True dihapus
# senarai adalah: 34567 hallo
hallo dihapus
# senarai adalah: 34567
34567 dihapus
senarai
Kosong
|
Gambar 5.6 mengilustrasikan metode SisipDiDepan. Bagian a) menggambarkan
senarai dan simpul baru selama operasi SisipDiDepan
dan sebelum perantaian SimpulSenarai
yang baru (memuat nilai 12) ke dalam senarai. Anak panah putus-putus pada
bagian b) mengilustrasikan langkah 3 pada operasi SisipDiDepan, yang membuat SimpulSenarai
menjadi bagian depan senarai yang baru.
Gambar 5.6 Representasi grafikal atas SisipDiDepan
Metode SisipDiBelakang (Gambar 5.4, baris 92-104) menempatkan sebuah
simpul baru di belakang senarai. Metode ini memuat tiga langkah:
1.
Memanggil ApaKosong untuk
menentukan apakah senarai kosong (baris 96).
2.
Jika senarai kosong, kedua simpulPertama
dan simpulAkhir ditetapkan untuk
menunjuk ke SimpulSenarai yang baru
yang diinisialisasi dengan objek itemSisip
(baris 97-98). Konstruktor SimpulSenarai
pada baris 9-11 (Gambar 5.4) memanggil
konstruktor CSimpulSenarai pada baris 16-19 (Gambar 5.4) untuk
menetapkan variabel instans data
untuk menunjuk ke object yang
dilewatkan sebagai argumen pertama dan kemudian menetapkan berikutnya untuk menunjuk ke null.
3. Jika senarai
tidak kosong, maka simpul baru dirantaikan ke dalam senarai dengan menetapkan simpulAkhir dan simpulAkhir.berikutnya agar menunjuk ke objek SimpulSenarai yang baru, yang diinisialisasi dengan objek itemSisip (baris 101-102). Ketika
konstruktor SimpulSenarai (baris
16-19 pada Gambar 5.4) dieksekusi,
ia akan menetapkan variabel instans data
agar menunjuk ke object yang
dilewatkan sebagai argumen dan melakukan penyisipan dengan menetapkan referensi
berikutnya agar menunjuk ke null.
Gambar 5.7 mengilustrasikan metode SisipDiBelakang. Bagian a)
menggambarkan senarai dan SimpulSenarai
yang baru (yang memuat nilai 5) selama operasi SisipDiBelakang dan sebelum perantaian simpul yang baru tersebut ke
dalam senarai. Anak panah putus-putus pada bagian b) mengilustrasikan
langkah-langkah pada operasi SisipDiBelakang,
yang membuat SimpulSenarai menjadi
bagian belakang senarai yang baru.
Gambar 5.7 Representasi grafikal atas SisipDiBelakang
Metode HapusDariDepan (Gambar 5.4, baris 107-127) menghapus simpul depan
dari senarai dan menghasilkan (menjadikan nilai balik) sebuah referensi yang menunjuk
ke data terhapus. Metode ini melemparkan EksepsiSenaraiKosong
(baris 114) jika program mencoba menghapus sebuah simpul dari senarai kosong.
Metode ini memuat empat langkah:
1.
Menugaskan simpulPertama.Data
(data yang akan dihapus dari senarai) kepada referensi itemHapus (baris 116).
2.
Jika objek-objek yang ditunjuk oleh simpulPertama
dan simpulAkhir adalah objek yang
sama, maka ini mengindikasikan bahwa senarai hanya memuat satu elemen saja
sebelum operasi penghapusan dilakukan. Pada kasus ini, metode HapusDariDepan menetapkan simpulPertama dan simpulAkhir menjadi null
(baris 120) untuk menghapus simpul dari senarai (sehingga senarai menjadi
kosong).
3.
Jika senarai memuat lebih dari satu simpul sebelum penghapusan, maka
metode ini membiarkan simpulAkhir seperti
adanya dan hanya menugaskan simpulPertama.
Berikunya untuk menunjuk ke simpulPertama
(baris 123). Jadi, simpulPertama
mereferensi simpul kedua sebelum pemanggilan metode HapusDariDepan.
4. Menghasilkan
referensi itemHapus.
Gambar 5.8 mengilustrasikan metode HapusDariDepan. Bagian a)
mengilustrasikan senarai sebelum operasi penghapusan. Bagian b) memotret
manipulasi referensi yang terjadi.
Gambar 5.8 Representasi grafikal atas HapusDariDepan
Metode HapusDariBelakang (Gambar 5.4, baris 130-160) menghapus simpul
akhir pada sebuah senarai dan menghasilkan sebuah referensi yang menunjuk ke
data terhapus. Metode ini melemparkan EksepsiSenaraiKosong
(baris 137) jika program mencoba menghapus sebuah simpul dari senarai kosong.
Metode ini terdiri-dari tujuh langkah:
1.
Menugaskan simpulAkhir.Data
(data yang akan dihapus dari senarai) kepada referensi itemHapus (baris 139).
2. Jika objek-objek yang ditunjuk oleh simpulPertama dan simpulAkhir adalah objek yang sama (baris 142), maka ini mengindikasikan bahwa
senarai hanya memuat satu elemen saja sebelum operasi penghapusan dilakukan.
Pada kasus ini, metode HapusDariBelakang
menetapkan simpulPertama dan simpulAkhir menjadi null (baris 143) untuk menghapus simpul dari senarai
(sehingga senarai menjadi kosong).
3.
Jika senarai memuat lebih dari satu simpul sebelum penghapusan, maka diciptakan referensi SimpulSenarai, sekarang, dan menugasinya simpulPertama
(baris 147).
4.
Menggunakan sekarang untuk
menjelajahi senarai sampai sekarang
mereferensi simpul yang secara langsung berada tepat sebelum simpul akhir. Loop
while (baris 150-151) menugaskan sekarang.Berikutnya untuk mereferensi sekarang asalkan sekarang. Berikutnya tidak sama dengan simpulAkhir.
5.
Setelah mengetahui lokasi simpul kedua terakhir, dilakukan penugasan sekarang kepada simpulAkhir (baris 154) untuk menghapus simpul akhir dari senarai.
6.
Menetapkan sekarang.Berikutnya
menjadi null (baris 155) pada simpul
akhir yang baru.
Menghasilkan referensi itemHapus (baris 113).
Gambar 5.9 Representasi grafikal atas HapusDariBelakang
5.3
Tumpukan
Tumpukan adalah versi terkekang dari
sebuah senarai berantai, dimana simpul baru dapat ditambahkan pada dan dihapus
dari tumpukan hanya dari atasnya. Karena alasan ini, tumpukan disebuah dengan
struktur data LIFO (least-in, first-out). Anggota link pada simpul bawah
tumpukan ditetapkan menjadi Nothing
untuk mengindikasikan bagian bawah tumpukan.
Beberapa operasi utama yang digunakan
untuk memanipulasi tumpukan adalah push
dan pop. Operasi push menambahkan sebuah simpul baru di atas tumpukan. Operasi pop menghapus sebuah simpul dari atas
tumpukan dan menjadikan data dari simpul yang terhapus sebagai nilai balik.
Tumpukan memiliki banyak aplikasi.
Sebagai contoh, ketika program memanggil sebuah metode, metode terpanggil harus
mengetahui bagaiman kembali kepada pemanggilnya, sehingga alamat kembali
ditempatkan di atas tumpukan eksekusi
program. Jika serangkaian pemanggilan metode terjadi, alamat-alamat kembali
ditempatkan ke atas tumpukan deengan gaya LIFO sehingga setiap metode dapat
kembali kepada pemanggilnya.
Relasi yang dekat antara senarai dan
tumpukan akan dipakai untuk mengimplementasikan kelas tumpukan dengan
mendaur-ulang kelas senarai. Dua bentuk pendaur-ulangan kode akan
didemons-trasikan. Pertama, akan diimplementasikan kelas tumpukan dengan
mewarisi kelas CSenarai pada Gambar
5.4. Kemudian, akan diimplementasikan kelas tumpukan yang identik melalui
komposisi dengan menyertakan objek Senarai
sebagai anggota private dari kelas
tumpukan.
Program pada Gambar 5.10 dan Gambar
5.11 menciptakan sebuah kelas tumpukan dengan mewarisi kelas Senarai pada Gambar 5.4. Diinginkan
bahwa tumpukan menyediakan metode Push,
Pop, ApaKosong, dan Tampil.
Secara esensial, semuanya adalah metode SisipDiDepan,
HapusDariDepan, ApaKosong, dan Tampil
dari kelas Senarai. Kelas Senarai memiliki beberapa metode lain,
seperti SisipDiBelakang dan HapusDariBelakang, yang tidak bisa
diakses melalui antarmuka public
pada tumpukan. Ingat bahwa semua metode pada antarmuka public pada kelas Senarai
adalah metode public pada kelas
terderivasi PewarisanTumpukan (Gambar
5.10).
Ketika metode-metode tumpukan
diimplementasikan, setiap metode PewarisanTumpukan
memanggil metode Senarai yang
sesuai, yaitu metode Push memanggil SisipDiDepan dan metode Pop memanggil HapusDariDepan. Kelas PewarisanTumpukan
tidak mendefinisikan metode ApaKosong dan Tampil, karena PewarisanTumpukan
mewarisi kedua metode ini dari kelas Senarai.
Semua metode pada kelas PewarisanTumpukan
tidak menggunakan statemen lock.
Setiap metode pada kelas ini memanggil metode dari kelas Senarai yang menggunakan lock.
Metode Main pada UjiPewarisanTumpukan
(Gambar 5.11) menggunakan kelas PewarisanTumpukan
untuk menginstansiasi sebuah tumpukan object,
dinamai tumpukan. Baris 18-21
mendefinisikan empat objek yang akan ditempatkan ke atas tumpukan dan dihapus
dari tumpukan. Program menempatkan sebuah bool
dengan nilai true, sebuah char dengan nilai $, sebuah integer dengan
nilai 34567, dan sebuah string dengan nilai “hallo” ke atas tumpukan (baris 24, 26,
28, dan 30). Loop while tak-hingga
(baris 36-41) menghapus elemen-elemen tersebut dari tumpukan. Ketika tidak ada
lagi objek yang akan dihapus, metode Pop
melempar Eksepsi-SenaraiKosong, dan
program menampilkan jejak tumpukan eksepsi, yang menggambarkan tumpukan
eksekusi program ketika eksepsi terjadi. Program menggunakan metode Tampil (diwarisi dari kelas Senarai) untuk menampilkan isi tumpukan
setelah tiap operasi dilakukan.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
// Gambar 5.10:
PustakanPewarisanTumpukan.cs
// Mengimplementasikan
sebuah tumpukan dengan mewarisi kelas Senarai.
using System;
using PustakaSenaraiBerantai;
namespace PustakaPewarisanTumpukan
{
// kelas PewarisanTumpukan mewarisi
kapabilitas kelas Senarai
public
class PewarisanTumpukan : Senarai
{
// melewatkan nama
"tumpukan" kepada konstruktor Senarai
public
PewarisanTumpukan() : base( "tumpukan" )
{
}
// menempatkan nilaiData di atas
tumpukan dengan menyisipkan
// nilaiData di depan senarai
berantai
public
void Push( object nilaiData )
{
SisipDiDepan( nilaiData );
}
// menghapus item dari atas tumpukan
dengan menghapus
// item di depan senarai berantai
public
object Pop()
{
return HapusDariDepan();
}
} // akhir kelas PewarisanTumpukan
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
// Gambar 5.11: UjiPewarisanTumpukan.cs
// Menguji kelas PewarisanTumpukan.
using System;
using PustakaPewarisanTumpukan;
using PustakaSenaraiBerantai;
namespace UjiPewarisanTumpukan
{
// demonstrasi
fungsionalitas kelas PewarisanTumpukan
class UjiPewarisanTumpukan
{
static void Main( string[]
args )
{
PewarisanTumpukan tumpukan = new
PewarisanTumpukan();
//
menciptakan objek-objek untuk disimpan di dalam tumpukan
bool aBoolean = true;
char aKarakter = '$';
int aInteger = 34567;
string aString = "hallo";
//
menggunakan metode Push untuk menambah item ke atas tumpukan
tumpukan.Push( aBoolean );
tumpukan.Tampil();
tumpukan.Push( aKarakter );
tumpukan.Tampil();
tumpukan.Push( aInteger );
tumpukan.Tampil();
tumpukan.Push( aString );
tumpukan.Tampil();
//
menggunakan metode Pop untuk menghapus item dari tumpukan
try
{
while ( true )
{
object objekHapus = tumpukan.Pop();
Console.WriteLine( objekHapus + " dihapus" );
tumpukan.Tampil();
}
}
// jika
eksepsi terjadi, tampilkan jejak tumpukan
catch (EksepsiSenaraiKosong
eksepsiSenaraiKosong)
{
Console.Error.WriteLine(
eksepsiSenaraiKosong.StackTrace);
}
} // akhir
metode Main
} // akhir kelas
UjiPewarisanTumpukan
}
|
# tumpukan adalah: 34567 $ True
# tumpukan adalah: hallo 34567 $ True
hallo dihapus
# tumpukan adalah: 34567 $ True
34567 dihapus
# tumpukan adalah: $ True
$ dihapus
# tumpukan adalah: True
True dihapus
tumpukan Kosong
at
PustakaSenaraiBerantai.Senarai.HapusDariDepan() in
E:\PustakaSenaraiBerantai.cs:line 114
at
PustakaPewarisanTumpukan.PewarisanTumpukan.Pop() in
E:\PustakaPewarisanTumpukan.cs:line 27
at
UjiPewarisanTumpukan.UjiPewarisanTumpukan.Main(String[] args)
in E:\UjiPewarisanTumpukan.cs:line 37
|
Cara lain dalam mengimplementasikan
sebuah kelas tumpukan adalah dengan mendaur-ulang kelas senarai melalui
komposisi. Kelas pada Gambar 5.12 menggunakan sebuah objek private dari kelas Senarai
(baris 12) di dalam definisi kelas KomposisiTumpukan.
Komposisi memampukan Anda untuk menyembunyikan metode-metode kelas Senarai yang tidak perlu muncul di
dalam antarmuka public tumpukan. Hal
ini dilakukan dengan menyediakan antarmuka public
bagi metode-metode yang diperlukan oleh metode-metode Senarai. Kelas KomposisiTumpukan
mengimplemen-tasikan setiap metode tumpukan dengan mendelgasikan pekerjaanya
kepada metode Senarai yang sesuai.
Kelas KomposisiTumpukan memanggil
metode-metode Senarai, seperti SisipDi-Depan, HapusDariDepan, ApaKosong,
dan Tampil.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
// Gambar 5.12:
PustakaKomposisiTumpukan.cs
// Definisi
KomposisiTumpukan dengan objek Senarai terkomposisi.
using System;
using PustakaSenaraiBerantai;
namespace PustakaKomposisiTumpukan
{
// kelas KomposisiTumpukan
mengenkapsulasi kapabilitas Senarai
public
class KomposisiTumpukan
{
private
Senarai tumpukan;
// menciptakan tumpukan kosong
public
KomposisiTumpukan()
{
tumpukan = new Senarai( "tumpukan"
);
}
// menambahkan objek ke atas tumpukan
public
void Push( object nilaiData )
{
tumpukan.SisipDiDepan( nilaiData
);
}
// menghapus objek dari tumpukan
public
object Pop()
{
return tumpukan.HapusDariDepan();
}
// menentukan apakah tumpukan kosong
public
bool ApaKosong()
{
return tumpukan.ApaKosong();
}
// menampilkan isi tumpukan
public
void Tampil()
{
tumpukan.Tampil();
}
} // akhir kelas KomposisiTumpukan
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
// Gambar 5.13: UjiKomposisiTumpukan.cs
// Menguji kelas KomposisiTumpukan.
using System;
using PustakaKomposisiTumpukan;
using PustakaSenaraiBerantai;
namespace UjiKomposisiTumpukan
{
// demonstrasi
fungsionalitas kelas PewarisanTumpukan
class UjiKomposisiTumpukan
{
static void Main( string[]
args )
{
KomposisiTumpukan tumpukan = new
KomposisiTumpukan();
//
menciptakan objek-objek untuk disimpan di dalam tumpukan
bool aBoolean = true;
char aKarakter = '$';
int aInteger = 34567;
string aString = "hallo";
//
menggunakan metode Push untuk menambahkan item ke atas tumpukan
tumpukan.Push( aBoolean );
tumpukan.Tampil();
tumpukan.Push( aKarakter );
tumpukan.Tampil();
tumpukan.Push( aInteger );
tumpukan.Tampil();
tumpukan.Push( aString );
tumpukan.Tampil();
//
menggunakan metode Pop untuk menghapus item dari tumpukan
try
{
while ( true )
{
object objekHapus = tumpukan.Pop();
Console.WriteLine( objekHapus + " dihapus" );
tumpukan.Tampil();
}
}
// jika
eksepsi terjadi, tampilkan jejak tumpukan
catch (EksepsiSenaraiKosong
eksepsiSenaraiKosong)
{
Console.Error.WriteLine(
eksepsiSenaraiKosong.StackTrace);
}
} // akhir
metode Main
} // akhir kelas
UjiKomposisiTumpukan
}
|
# tumpukan adalah: 34567 $ True
# tumpukan adalah: hallo 34567 $ True
hallo dihapus
# tumpukan adalah: 34567 $ True
34567 dihapus
# tumpukan adalah: $ True
$ dihapus
# tumpukan adalah: True
True dihapus
Kosong tumpukan
at CSenarai.HapusDariDepan() in
E:\CSenarai.vb:line 65
at CKomposisiTumpukan.Pop() in
E:\CKomposisiTumpukan.vb:line 20
at modUjiKomposisiTumpukan.Main() in
E:\modUjiKomposisiTumpukan.vb:line 38
|
5.4
Antrian
Struktur data lain yang umum dijumpai
adalah antrian. Antrian sama seperti
antrian di pusat perbelanjaan, dimana orang pertama dalam antrian akan dilayani
lebih dahulu, dan para pelanggan lainnya harus menunggu untuk dilayani. Simpul
antrian dihapus hanya dari kepala antrian dan disisipkan hanya di ekor antrian.
Karena alasan ini, antrian disebut dengan struktur data FIFO (first-in first-out). Operasi penyisipan dan operasi
penghapusan dikenal sebagai enqueue
dan dequeue.
Program pada Gambar 5.14 dan Gambar
5.15 menciptakan sebuah kelas antrian melalui pewarisan dari kelas senarai.
Diinginkan bahwa kelas PewarisanAntrian
(Gambar 5.14) untuk menyertakan metode-metoe Enqueue, Dequeue, ApaKosong, dan Tampil. Perhatikan bahwa secara esensial semua metode tersebut
adalah SisipDiBelakang, HapusDariDepan, ApaKosong, dan Tampil
dari kelas Senarai.
Ketika Anda mengimplementasikan
metode-metode antrian, setiap pemanggilan metode PewarisanAntrian akan memanggil metode Senarai yang sesuai, dimana metode Enqueue memanggil SisipDiBelakang,
dan metode Dequeue memangil HapusDariDepan, sedangkan ApaKosong dan Tampil memanggil versi kelas-basisnya.
Metode Main pada kelas UjiAntrian
(Gambar 5.15) menggunakan kelas PewarisanAntrian
untuk menginstansiasi sebuah antrian object,
dinamai antrian. Baris 18-21
mendefinisikan empat objek yang akan ditempatkan ke dalam antrian dan dihapus
dari antrian. Program menempatkan sebuah boolean
dengan nilai true, sebuah char dengan nilai $, sebuah integer dengan
nilai 34567, dan sebuah string dengan nilai “hallo” ke dalam antrian (baris 24, 26,
28, dan 30).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
// Gambar 5.14:
PustakaPewarisanAntrian.cs
// Mengimplementasikan
sebuah antrian dengan mewarisi kelas Senarai.
using System;
using PustakaSenaraiBerantai;
namespace PustakaPewarisanAntrian
{
// PewarisanAntrian mewarisi kapabilitas
Senarai
public
class PewarisanAntrian : Senarai
{
// melewatkan nama
"antrian" kepada konstruktor Senarai
public
PewarisanAntrian() : base("antrian")
{
}
// menempatkan nilaiData di akhir
antrian dengan menyisipkan
// nilaiData di akhir senarai
berantai
public
void Enqueue( object nilaiData )
{
SisipDiBelakang( nilaiData );
}
// menghapus item dari depan antrian
dengan menghapus
// item di depan senarai berantai
public
object Dequeue( )
{
return HapusDariDepan();
}
} // akhir PewarisanAntrian
}
|
Loop while tak-hingga (baris 39-44) menghapus elemen-elemen tersebut
dari antrian dengan urutan FIFO. Ketika tidak ada lagi objek yang akan dihapus,
metode Dequeu akan melempar Eksepsi-SenaraiKosong, dan program
menampilkan jejak tumpukan eksepsi, yang menggambarkan tumpukan eksekusi
program ketika eksepsi terjadi. Program menggunakan metode Tampil (diwarisi dari kelas Senarai)
untuk menampilkan isi tumpukan setelah tiap operasi dilakukan.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// Gambar 5.15: UjiAntrian.cs
// Menguji kelas PewarisanAntrian.
using System;
using PustakaPewarisanAntrian;
using PustakaSenaraiBerantai;
namespace UjiAntrian
{
// demonstrasi
fungsionalitas kelas PewarisanAntrian
class UjiAntrian
{
static void Main( string[]
args )
{
PewarisanAntrian antrian = new
PewarisanAntrian();
//
menciptakan objek-objek untuk disimpan di dalam antrian
bool aBoolean = true;
char aKarakter = '$';
int aInteger = 34567;
string aString = "hallo";
//
menggunakan metode Enqueue untuk menambahkan item pada antrian
antrian.Enqueue( aBoolean );
antrian.Tampil();
antrian.Enqueue( aKarakter );
antrian.Tampil();
antrian.Enqueue(
aInteger );
antrian.Tampil();
antrian.Enqueue( aString );
antrian.Tampil();
//
menggunakan metode Dequeue untuk menghapus item dari antrian
object objekHapus = null;
//
menghapus item dari antrian
try
{
while ( true )
{
objekHapus = antrian.Dequeue();
Console.WriteLine( objekHapus + " dihapus dari antrian" );
antrian.Tampil();
}
}
// jika
eksepsi terjadi, tampilkan jejak tumpukan pemanggilan
catch (EksepsiSenaraiKosong
eksepsiSenaraiKosong)
{
Console.Error.WriteLine(
eksepsiSenaraiKosong.StackTrace);
}
} // akhir
metode Main
} // akhir kelas
UjiAntrian
}
|
# tumpukan adalah: True
# tumpukan adalah: $ True
# tumpukan adalah: 34567 $ True
# tumpukan adalah: hallo 34567 $ True
hallo dihapus
# tumpukan adalah: 34567 $ True
34567 dihapus
# tumpukan adalah: $ True
$ dihapus
# tumpukan adalah: True
True dihapus
Kosong tumpukan
at CSenarai.HapusDariDepan() in
E:\CSenarai.vb:line 65
at CKomposisiTumpukan.Pop() in
E:\CKomposisiTumpukan.vb:line 20
at modUjiKomposisiTumpukan.Main() in
E:\modUjiKomposisiTumpukan.vb:line 38
|
5.5
Pohon
Senarai berantai, tumpukan, dan antrian
adalah struktur data linier. Sebaliknya, pohon adalah struktur data tak-linier,
dua dimensi, dengan beberapa sifat spesial. Setiap simpul pada pohon mempunyai
dua atau lebih link atau rantai. Bagian ini akan mendiskusikan pohon biner
(Gambar 5.16), atau pohon dengan setiap simpul memiliki dua link (tidak ada,
satu atau keduanya bisa null).
Simpul akar adalah simpul pertama pada pohon. Setiap link pada simpul akar
disebut dengan anak. Anak kiri adalah simpul pertama pada
subpohon kiri, dan anak kanan adalah
simpul pertama pada subpohon kanan. Semua anak dari simpul tertentu disebut
dengan sibling atau saudara. Sebuah
simpul yang tidak memiliki anak disebut dengan simpul daun.
Contoh pohon-biner yang disajikan akan
menciptakan sebuah pohon biner spesial, yang dikenal dengan pohon pencarian
biner (binary search tree). Sebuah
pohon pencarian biner (tanpa nilai simpul duplikat) memiliki karakteristik
bahwa nilai-nilai pada sembarang subpohon kiri lebih rendah dari nilai simpul
induk subpohon, dan bahwa nilai-nilai pada sembarang subpohon kanan lebih
tinggi dari simpul induk subpohon. Gambar 5.17 mengilustrasikan sebuah pohon
pencarian biner yang memuat 12 integer. Perhatikan bahwa bentuk sebuah pohon
pencarian biner yang terkait dengan suatu himpunan data sangat bergantung pada
urutan penyisipan nilai-nilai ke dalam pohon.
Gambar 5.16 Representasi grafikal atas pohon biner
Gambar 5.17 Pohon pencarian biner yang memuat 12
integer
Pohon
Pencarian Biner dengan Nilai-Nilai Integer
Aplikasi pada Gambar 5.18 dan Gambar
5.19 menciptakan sebuah pohon pencarian biner dengan nilai-nilai integer dan
kemudian menjelajahi pohon tersebut (berjalan melalui semua simpulnya) dalam
tiga cara, yaitu menggunakan penjelajahan inorder,
preorder, dan postorder rekursif. Program membangkitkan 10 angka acak dan
menyisipkan setiap angka acak itu ke dalam pohon. Gambar 5.18 mendefinisikan
kelas Pohon. Gambar 5.19
mendefinisikan UjiPohon, yang
mendemonstrasikan fungsionalitas kelas Pohon.
Metode Main pada UjiPohon menginstansiasi sebuah objek Pohon kosong, yang secara acak
membangkitkan 10 integer dan menyisipkan setiap nilai ke dalam pohon
menggunakan metode SisipSimpul.
Program kemudian melakukan penjelajahan pohon secara preorder, inorder, dan
postorder.
Kelas SimpulPohon Gambar 5.18) merupakan sebuah kelas referensi-diri yang
memuat tiga anggota data private,
yaitu simpulKiri dan simpulKanan yang keduanya bertipe SimpulPohon dan data yang bertipe int.
Awalnya, setiap SimpulPohon adalah
simpul daun, jadi konstruktor (baris 16-20) menginisialisasi referensi simpulKiri dan simpulKanan dengan null.
Properti SimpulKiri (baris 23-34), Data (baris 37-48), dan SimpulKanan (baris 51-62) menyediakan
akses terhadap anggota-anggota private
kelas SimpulPohon.
Kelas Pohon (baris 98-198, Gambar 5.18) memanipulasi objek-objek kelas SimpulPohon. Kelas Pohon memuat sebuah simpul private
akar (baris 100), yaitu sebuah referensi yang menunjuk ke simpul akar
pohon. Kelas ini juga memuat anggota public
SisipSimpul (baris 111-121), yang menyisipkan sebuah simpul ke dalam pohon,
dan metode-metode public
PenjelajahanPreorder (baris 124-130), PenjelajahanInorder
(baris 149-155), dan PenjelajahanPostorder
(baris 174-180), yang memulai penjelajahan pohon. Setiap metode penjelajah
memanggil metode utilitas rekursif secara terpisah untuk melakukan operasi
penjelajahan pada pohon. Konstruktor Pohon
(baris 103-106) menginisialisasi akar
dengan null untuk mengindikasikan
bahwa pohon awalnya kosong.
Metode SisipSimpul pada kelas Pohon
pertama-tama mengunci objek Pohon
dan kemudian menentukan apakah pohon kosong atau tidak. Jika kosong, baris 116
akan menginstansiasi sebuah objek SimpulPohon,
menginisialisasi simpul dengan integer yang akan disisipkan, dan menugaskan
simpul baru kepada akar. Jika pohon
tidak kosong, maka metode SisipSimpul
akan memanggil metode Sisip (baris
67-93) dari kelas SimpulPohon, yang
secara rekursif menentukan lokasi untuk simpul baru di dalam pohon dan
menyisipkan simpul pada lokasi itu.
Metode Sisip pada kelas SimpulPohon
melakukan perbandingan atas nilai yang akan disisipkan dengan nilai data pada simpul akar. Jika nilai yang
akan disisipkan kurang dari data simpul-akar, maka program menentukan apakah
subpohon kiri kosong atau tidak (baris 73). Jika kosong, maka baris 74 akan
menginstansiasi sebuah objek SimpulPohon,
menginisialisasinya dengan integer yang akan disisipkan, dan menugaskan simpul
baru pada referensi simpulKiri.
Sebaliknya, jika subpohon kiri tidak kosong, maka baris 90 akan secara rekursif
memanggil metode Sisip pada subpohon
kiri untuk menyisipkan nilai ke dalam subpohon kiri.
Metode-metode PenjelajahanInorder, PenjelajahanPreorder,
dan PenjelajahanPostorder memanggil
metode-metode pembantu PembantuInorder
(baris 158-171), PembantuPreorder
(baris 133-146), dan PembantuPostorder
(baris 183-196) untuk menjelajah pohon dan menampilkan nilai setiap simpul.
Setiap metode pembantu pada kelas Pohon
membuat programer dapat mengawali penjelajahan tanpa perlu terlebih dahulu
mendapatkan sebuah referensi yang menunjuk ke simpul pertama akar dan kemudian memanggil metode
rekursif dengan referensi itu. Metode-metode PenjelajahanInorder, PenjelajahanPreorder,
dan PenjelajahanPostorder cukup
mengambil referensi private akar dan
melewatkannya kepada metode pembantu yang sesuai untuk mengawali penjelajahan
pohon.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
// Gambar 5.18: PustakaPohonBiner.cs
// Definisi kelas SimpulPohon dan kelas Pohon.
using System;
namespace PustakaPohonBiner
{
// definisi kelas
SimpulPohon
class SimpulPohon
{
private SimpulPohon simpulKiri;
private int data;
private SimpulPohon simpulKanan;
//
inisialisasi data dan membuat simpul daun
public SimpulPohon( int dataSimpul )
{
data =
dataSimpul;
simpulKiri = simpulKanan = null;
// simpul tidak memiliki anak
}
// properti
SimpulKiri property
public SimpulPohon SimpulKiri
{
get
{
return simpulKiri;
}
set
{
simpulKiri = value;
}
}
// properti
Data
public int Data
{
get
{
return data;
}
set
{
data
= value;
}
}
// properti
SimpulKanan
public SimpulPohon SimpulKanan
{
get
{
return simpulKanan;
}
set
{
simpulKanan = value;
}
}
//
menyisipkan SimpulPohon ke dalam Pohon yang memuat simpul-simpul;
//
mengabaikan nilai-nilai duplikat
public void Sisip( int
nilaiSisip )
{
// sisip
di subpohon kiri
if ( nilaiSisip < data )
{
//
sisip SimpulPohon yang baru
if ( simpulKiri == null )
simpulKiri = new
SimpulPohon( nilaiSisip );
//
melanjutkan penjelajahan subpohon kiri
else
simpulKiri.Sisip( nilaiSisip );
}
// sisip
di subpohon kanan
else if ( nilaiSisip > data )
{
//
sisip SimpulPohon yang baru
if ( simpulKanan == null )
simpulKanan = new
SimpulPohon( nilaiSisip );
//
melanjutkan penjelajahan subpohon kanan
else
simpulKanan.Sisip( nilaiSisip );
}
} // akhir
metode Sisip
} // akhir kelas
SimpulPohon
// definisi kelas
Pohon
public class Pohon
{
private SimpulPohon akar;
//
menciptakan sebuah Pohon kosong yang memuat integer-integer
public Pohon()
{
akar = null;
}
//
menyisipkan sebuah simpul baru di dalam pohon pencarian biner.
// jika
simpul akar kosong, ciptakan simpul akar di sini.
//
Sebaliknya, panggil metode sisip dari kelas SimpulPohon.
public void SisipSimpul( int
nilaiSisip )
{
lock ( this )
{
if ( akar == null )
akar = new SimpulPohon(
nilaiSisip );
else
akar.Sisip( nilaiSisip );
}
}
// memulai
penjelajahan preorder
public void PenjelajahanPreorder()
{
lock ( this )
{
PembantuPreorder( akar );
}
}
// metode
rekursif untuk melakukan penjelajahan preorder
private void PembantuPreorder(SimpulPohon simpul)
{
if ( simpul == null )
return;
//
menampilkan data simpul
Console.Write( simpul.Data + " " );
//
menjelajah subpohon kiri
PembantuPreorder(simpul.SimpulKiri);
//
menjelajah subpohon kanan
PembantuPreorder(simpul.SimpulKanan);
}
// memulai
penjelajahan inorder
public void PenjelajahanInorder()
{
lock ( this )
{
PembantuInorder( akar );
}
}
// metode
rekursif untuk melakukan penjelajahan inorder
private void PembantuInorder(SimpulPohon simpul)
{
if ( simpul == null )
return;
//
menjelajah subpohon kiri
PembantuInorder(simpul.SimpulKiri);
//
menampilkan data simpul
Console.Write( simpul.Data + " " );
//
menjelajah subpohon kanan
PembantuInorder(simpul.SimpulKanan);
}
// memulai
penjelajahan postorder
public void PenjelajahanPostorder()
{
lock ( this )
{
PembantuPostorder( akar );
}
}
// metode
rekursif untuk melakukan penjelajahan postorder
private void PembantuPostorder(SimpulPohon simpul)
{
if ( simpul == null )
return;
//
menjelajah subpohon kiri
PembantuPostorder(simpul.SimpulKiri);
//
menjelajah subpohon kanan
PembantuPostorder(simpul.SimpulKanan);
//
menampilkan data simpul
Console.Write( simpul.Data + " " );
}
} // akhir kelas
Pohon
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
// Gambar 5.19:
UjiPohon.cs
// Program ini menguji
kelas Pohon.
using System;
using PustakanPohonBiner;
namespace UjiPohon
{
// definisi kelas UjiPohon
public
class UjiPohon
{
// menguji kelas Pohon
static
void Main( string[] args )
{
Pohon pohon = new Pohon();
int nilaiSisip;
Console.WriteLine( "Menyisipkan nilai-nilai: " );
Random acak = new
Random();
// menyisipkan 10 integer acak
dari 0-99 ke dalam pohon
for ( int i = 1; i
<= 10; i++ )
{
nilaiSisip = acak.Next( 100
);
Console.Write( nilaiSisip +
" " );
pohon.SisipSimpul( nilaiSisip
);
}
// melakukan penjelajahan
preorder pada pohon
Console.WriteLine( "\n\nPenjelajahan Preorder" );
pohon.PenjelajahanPreorder();
// melakukan penjelajahan inorder
pada pohon
Console.WriteLine( "\n\nPenjelajahan Inorder" );
pohon.PenjelajahanInorder();
// melakukan penjelajahan
postorder pada pohon
Console.WriteLine( "\n\nPenjelajahan Postorder" );
pohon.PenjelajahanPostorder();
Console.WriteLine();
}
} // akhir kelas UjiPohon
}
|
Menyisipkan nilai-nilai:
2 64 74 52 32 57 99 46 10 55
Penjelajahan Preorder
2 64 52 32 10 46 57 55 74 99
Penjelajahan Inorder
2 10 32 46 52 55 57 64 74 99
Penjelajahan Postorder
10 46 32 55
57 52 99 74 64 2
|
Pohon
Pencarian Biner dengan Objek-Objek IComparable
Contoh pohon-biner sebelumnya dapat
bekerja dengan baik ketika semua data bertipa int. Namun, bila dimisalkan bahwa seorang programer ingin
memanipulasi sebuah pohon pencarian biner yang memuat nilai-nilai double, maka
ia harus menuliskan-ulang kelas SimpulPohon
dan Pohon sehingga dapat dipakai
untuk memanipulasi nilai-nilai double.
Pada contoh selanjutnya, akan digunakan
kapabilitas polimorfik pada C#. Akan diimplementasikan kelas CSimpulPohon dan CPohon, yang memanipulasi objek-objek yang mengimplementasikan
antarmuka IComparable (dari namespace System). Kelas yang mengimplementasikan antarmuka IComparable mendefinisikan metode CompareTo, yang membanding-kan objek
yang memanggil metode dengan objek yang diterima metode tersebut sebagai
argumen. Metode menghasilkan sebuah nilai int
yang kurang dari nol jika objek pemanggil kurang dari objek argumen, nol jika
kedua objek sama, atau sebuah Integer lebih besar dari nol jika objek pemanggil
lebih besar dari objek argumen. Di samping itu, kedua objek pemanggil dan objek
argumen harus bertipe data sama; jika tidak, metode akan melemparkan ArgumentException.
Program pada Gambar 5.20 dan Gambar
5.21 memperbaiki program sebelumnya untuk memanipulasi objek IComparable. Satu pembatasan pada versi
baru dari kelas SimpulPohon dan Pohon adalah bahwa setiap objek Pohon dapat memuat objek dengan satu
tipe data (misalnya, semuanya string
atau semuanya double). Jika program
mencoba untuk menyisipkan beberapa data berbeda pada objek Pohon yang sama, maka ArgumentException
akan terjadi. Yang dimodifikasi hanyalah enam baris kode pada kelas SimpulPohon (baris 13, 17, 38, 67, 70,
dan 82) dan satu baris kode pada kelas Pohon
(baris 111) untuk memampukan pemrosesan objek IComparable. Dengan pengecualian pada baris 70 dan 82, semua
modifikasi hanya mengganti tipe int
dengan tipe IComparable. Baris 70
dan 82 sebelumnya menggunakan operator < dan > dalam membandingkan nilai
yang disisipkan dengan nilai di dalam simpul tertentu. Kedua baris tersebut
sekarang membandingkan objek-objek IComparable
menggunakan metode CompareTo; Metode
ini dipakai untuk menentukan nilai balik kurang dari nol (objek pemanggil
kurang dari objek argumen), nol (objek pemanggil sama dengan objek argumen),
atau lebih besar dari nol (objek pemanggil lebih besar dari objek argumen).
Kelas UjiPohon (Gambar 5.21) menciptakan tiga objek Pohon untuk menyimpan nilai-nilai int, double, dan string, yang semuanya didefinisikan C#
sebagai tipe IComparable. Program
mengisi pohon dari nilai-nilai pada array arrayInteger
(baris 15), arrayDouble (baris
16-17), dan arrayString (baris
18-19), dan kemudian memanggil metode jelajahanPohon
untuk menampilkan penjelajahan preorder, inorder, dan postorder atas pohon Pohon. Metode isiPohon (baris 38-48) menerima sebagai argumen sebuah Array yang memuat nilai-nilai
penginisialisasi untuk Pohon, sebuah
Pohon yang akan diisi oleh
elemen-elemen array, dan sebuah string
yang merepresentasikan nama Pohon.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
// Gambar 5.20: PustakaPohonBiner2.cs
// Definisi atas kelas SimpulPohon dan kelas Pohon untuk
objek-objek
// IComparable.
using System;
namespace PustakaPohonBiner2
{
// definisi kelas
SimpulPohon
class SimpulPohon
{
private SimpulPohon simpulKiri;
private IComparable data;
private SimpulPohon simpulKanan;
//
inisialisasi data dan membuat simpul daun
public SimpulPohon(IComparable dataSimpul)
{
data =
dataSimpul;
simpulKiri = simpulKanan = null; // simpul tidak memiliki anak
}
// properti
SimpulKiri property
public SimpulPohon SimpulKiri
{
get
{
return simpulKiri;
}
set
{
simpulKiri = value;
}
}
// properti
Data
public IComparable Data
{
get
{
return data;
}
set
{
data
= value;
}
}
// properti
SimpulKanan
public SimpulPohon SimpulKanan
{
get
{
return simpulKanan;
}
set
{
simpulKanan = value;
}
}
//
menyisipkan SimpulPohon ke dalam Pohon yang memuat simpul-simpul;
//
mengabaikan nilai-nilai duplikat
public void Sisip(IComparable
nilaiSisip)
{
// sisip
di subpohon kiri
if (nilaiSisip.CompareTo(data) <
0)
{
//
sisip SimpulPohon yang baru
if (simpulKiri == null)
simpulKiri = new
SimpulPohon(nilaiSisip);
// melanjutkan
penjelajahan subpohon kiri
else
simpulKiri.Sisip(nilaiSisip);
}
// sisip
di subpohon kanan
else if (nilaiSisip.CompareTo(data) > 0)
{
//
sisip SimpulPohon yang baru
if (simpulKanan == null)
simpulKanan = new
SimpulPohon(nilaiSisip);
//
melanjutkan penjelajahan subpohon kanan
else
simpulKanan.Sisip(nilaiSisip);
}
} // akhir
metode Sisip
} // akhir kelas
SimpulPohon
// definisi kelas
Pohon
public class Pohon
{
private SimpulPohon akar;
//
menciptakan sebuah Pohon kosong yang memuat integer-integer
public Pohon()
{
akar = null;
}
//
menyisipkan sebuah simpul baru di dalam pohon pencarian biner.
// jika
simpul akar kosong, ciptakan simpul akar di sini.
//
Sebaliknya, panggil metode sisip dari kelas SimpulPohon.
public void SisipSimpul(IComparable nilaiSisip)
{
lock (this)
{
if (akar == null)
akar = new SimpulPohon(nilaiSisip);
else
akar.Sisip(nilaiSisip);
}
}
// memulai
penjelajahan preorder
public void PenjelajahanPreorder()
{
lock (this)
{
PembantuPreorder(akar);
}
}
// metode
rekursif untuk melakukan penjelajahan preorder
private void PembantuPreorder(SimpulPohon simpul)
{
if (simpul == null)
return;
//
menampilkan data simpul
Console.Write(simpul.Data + " ");
//
menjelajah subpohon kiri
PembantuPreorder(simpul.SimpulKiri);
//
menjelajah subpohon kanan
PembantuPreorder(simpul.SimpulKanan);
}
// memulai
penjelajahan inorder
public void PenjelajahanInorder()
{
lock (this)
{
PembantuInorder(akar);
}
}
// metode
rekursif untuk melakukan penjelajahan inorder
private void PembantuInorder(SimpulPohon simpul)
{
if (simpul == null)
return;
//
menjelajah subpohon kiri
PembantuInorder(simpul.SimpulKiri);
//
menampilkan data simpul
Console.Write(simpul.Data + " ");
//
menjelajah subpohon kanan
PembantuInorder(simpul.SimpulKanan);
}
// memulai penjelajahan
postorder
public void PenjelajahanPostorder()
{
lock (this)
{
PembantuPostorder(akar);
}
}
// metode
rekursif untuk melakukan penjelajahan postorder
private void PembantuPostorder(SimpulPohon simpul)
{
if (simpul == null)
return;
//
menjelajah subpohon kiri
PembantuPostorder(simpul.SimpulKiri);
//
menjelajah subpohon kanan
PembantuPostorder(simpul.SimpulKanan);
//
menampilkan data simpul
Console.Write(simpul.Data + " ");
}
} // akhir kelas
Pohon
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
67
68
69
70
71
|
// Gambar 5.21: UjiPohon.cs
// Program ini menguji kelas Pohon.
using System;
using PustakaPohonBiner2;
namespace UjiPohon
{
// definisi kelas
UjiPohon
public class UjiPohon
{
// menguji kelas Pohon
static void Main( string[]
args )
{
int[] arrayInt = { 8, 2, 4, 3, 1, 7,
5, 6 };
double[] arrayDouble =
{
8.8, 2.2, 4.4, 3.3, 1.1, 7.7, 5.5, 6.6 };
string[] arrayString = { "delapan", "dua", "empat",
"tiga", "satu", "tujuh", "lima", "enam" };
//
menciptakan Pohon int
Pohon
pohonInt = new Pohon();
isiPohon(
arrayInt, pohonInt, "pohonInt"
);
jelajahPohon(pohonInt, "pohonInt");
//
menciptakan Pohon double
Pohon
pohonDouble = new Pohon();
isiPohon(arrayDouble, pohonDouble, "pohonDouble");
jelajahPohon(pohonDouble, "pohonDouble");
//
menciptakan Pohon string
Pohon
pohonString = new Pohon();
isiPohon(arrayString, pohonString, "pohonString");
jelajahPohon(pohonString, "pohonString");
}
// mengisi
Pohon dengan elemen-elemen array
static void isiPohon(
Array
array, Pohon pohon, string nama )
{
Console.WriteLine( "\nMenyisipkan
ke dalam" + nama + ":" );
foreach ( IComparable data in array )
{
Console.Write( data + " " );
pohon.SisipSimpul( data );
}
}
// melakukan
penjelajahan
static void jelajahPohon(Pohon pohon, string tipePohon)
{
//
melakukan penjelajahan preorder atas pohon
Console.WriteLine(
"\n\nPenjelajahan preorder atas " + tipePohon );
pohon.PenjelajahanPreorder();
//
melakukan penjelajaha inorder atas pohon
Console.WriteLine(
"\n\nPenjelajahan inorder atas " + tipePohon );
pohon.PenjelajahanInorder();
//
melakukan penjelajahan postorder atas pohon
Console.WriteLine(
"\n\nPenjelajahan postorder atas " + tipePohon );
pohon.PenjelajahanPostorder();
Console.WriteLine( "\n" );
}
} // akhir kelas
UjiPohon
}
|
Menyisipkan ke dalam pohonInt:
8 2 4 3 1 7 5 6
Penjelajahan preorder atas pohonInt
8 2 1 4 3 7 5 6
Penjelajahan inorder atas pohonInt
1 2 3 4 5 6 7 8
Penjelajahan postorder atas pohonInt
1 3 6 5 7 4 2 8
Menyisipkan ke dalam pohonDouble:
8.8 2.2 4.4 3.3 1.1 7.7 5.5 6.6
Penjelajahan preorder atas pohonDouble
8.8 2.2 1.1 4.4 3.3 7.7 5.5 6.6
Penjelajahan inorder atas pohonDouble
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8
Penjelajahan postorder atas pohonDouble
1.1 3.3 6.6 5.5 7.7 4.4 2.2 8.8
Menyisipkan ke dalam pohonString:
delapan dua empat tiga satu tujuh lima enam
Penjelajahan preorder atas pohonString
delapan dua empat tiga satu lima enam tujuh
Penjelajahan inorder atas pohonString
delapan dua empat enam lima satu tiga tujuh
Penjelajahan postorder atas pohonString
enam lima
satu tujuh tiga empat dua delapan
|
5.6
Kelas-Kelas Koleksi
Dengan kelas-kelas koleksi, daripada
harus menciptakan struktur data sendiri, programer dapat menggunakan struktur
data yang ada tanpa perlu khawatir tentang bagaimana struktur data
diimplementasikan. Metodologi ini merepresentasikan beberapa contoh
pendaur-ulangan kode. Programer dapat mengkode lebih cepat dan dengan kinerja
yang lebih baik dalam hal kecepatan eksekusi dan konsumsi memori.
C# menyediakan beberapa koleksi. Akan
didemonstrasikan empat kelas koleksi, yaitu Array, ArrayList, Stack, dan Hashtable. Namespace System.Collections
juga menyediakan beberapa struktur data yang lain, termasuk BitArray, Queue, dan SortedList.
Kelas
Array
Telah disebutkan bahwa semua array
mewarisi kelas Array (namespace System), yang mende-finisikan properti Length yang menspesifikasi jumlah elemen di dalam array. Di samping
itu, kelas Array juga menyediakan beberapa metode static yang mendefinisikan beberapa algoritma untuk memproses
array. Semua metode kelas Array
tersebut dioverload untuk memberikan opsi untuk merealisasikan algoritma.
Sebagai contoh, metode Reverse dari
kelas Array dapat membalikkan urutan
elemen-elemen di dalam array secara keseluruhan atau dapat membalikkan
elemen-elemen di dalam rentang tertentu pada array. Gambar 5.22
mendemonstrasikan beberapa metode static
dari kelas Array.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
// Gambar 5.22: MenggunakanArray.cs
// Menggunakan kelas Array untuk melakukan beberapa
manipulasi array.
using System;
using System.Windows.Forms;
using System.Collections;
namespace MenggunakanArray
{
// demonstrasi
beberapa algoritma kelas Array
class MenggunakanArray
{
private int[] nilaiInt = { 1, 2, 3, 4, 5, 6 };
private double[] nilaiDouble =
{ 8.4,
9.3, 0.2, 7.9, 3.4 };
private int[] salinNilaiInt;
private string keluaran;
// metode
untuk membangun dan menampilkan keluaran program
public void Start()
{
salinNilaiInt = new int[ nilaiInt.Length ];
keluaran
= "Nilai-nilai awal array:\n";
TampilArray(); // menampilkan isi awal array
//
mengurutkan nilaiDouble
Array.Sort( nilaiDouble );
// menyalin nilaiInt ke salinNilaiInt
Array.Copy( nilaiInt, salinNilaiInt,
nilaiInt.Length );
keluaran
+= "\nIsi array setelah Sort dan Copy:\n";
TampilArray(); // menampilkan isi array
keluaran
+= "\n";
//
mencari 5 di dalam nilaiInt
int hasil = Array.BinarySearch(
nilaiInt, 5 );
keluaran
+=
(
hasil >= 0 ? "5 ditemukan pada elemen " + hasil :
"5 tidak ditemukan" ) + " di
dalam nilaiInt\n";
// search
for 8763 in intValues
hasil =
Array.BinarySearch( nilaiInt, 8763 );
keluaran
+=
(
hasil >= 0 ? "8763 ditemukan pada elemen " +
hasil :
"8763 tidak ditemukan" ) + " di
dalam nilaiInt";
MessageBox.Show( keluaran, "Menggunakan
Kelas Array",
MessageBoxButtons.OK, MessageBoxIcon.Information );
}
//
menampilkan isi array
private void TampilArray()
{
keluaran += "nilaiDouble: ";
foreach ( double elemen in
nilaiDouble )
keluaran += elemen + " ";
keluaran
+= "\nnilaiInt: ";
foreach (int elemen in
nilaiInt)
keluaran += elemen + " ";
keluaran
+= "\nsalinNilaiInt: ";
foreach ( int elemen in
salinNilaiInt )
keluaran += elemen + " ";
keluaran
+= "\n";
}
// entri
utama untuk aplikasi
static void Main( string[] args )
{
MenggunakanArray aplikasi = new
MenggunakanArray();
aplikasi.Start();
}
} // akhir kelas
MenggunakanArray
}
|
Baris 28 menggunakan metode static Array, Sort, untuk mengurutkan sebuah array yang memuat nilai-nilai double. Ketika metode ini selesai
dieksekusi, array yang memuat elemen-elemen terurut secara menaik dijadikan
nilai balik.
Baris 21-32 menggunakan metode static Array, Copy, untuk menyalin setiap elemen array arrayInteger ke dalam array salinArrayInteger.
Argumen pertama adalah array yang akan disalin (nilaiInteger), argumen kedua adalah array tujuan penyalinan (salinNilaiInteger), dan argumen ketiga
adalah sebuah integer yang merepresentasikan jumlah elemen yang akan disalin
(pada kasus ini, properti nilaiInteger.Length
menspesifikasi semua elemen akan disalin).
Gambar 5.23 Keluaran program
pada Gambar 5.22
Baris 37 dan 45 memanggil metode static Array, BinarySearch, untuk melakukan pencarian biner terhadap array nilaiInteger. Metode BinarySearch menerima array terurut
sebagai lokasi pencarian dan kunci untuk dicari. Metode ini menghasilkan indeks
di dalam array, dimana di lokasi tersebut ia menemukan kunci yang dicari, atau
jika kunci tidak ditemukan, maka metode menghasilkan nilai negatif.
Kelas
ArrayList
Koleksi ArrayList pada C# (namespace
System.Collections) menyerupai
fungsionalitas array konvensional dan menyediakan kapabilitas pengubahan-ukuran
dinamis. Sebuah ArrayList memuat
sejumlah elemen, yang kurang dari atau sama dengan kapasitasnya. Jumlah elemen
Program dapat memanipulasi kapasitas dengan properti Capacity pada ArrayList.
Jika kapasitas ArrayList perlu diperbesar, maka secara default ia akan
menggandakan kapasitasnya.
Metode
|
Deskripsi
|
Add
Clear
Contains
IndexOf
Insert
Remove
RemoveAt
RemoveRange
Sort
TrimToSize
|
Menambahkan sebuah object ke dalam ArrayList.
Menghasilkan sebuah int yang
menspesifikasi indeks dimana object
tersebut ditambahkan.
Menghapus semua elemen dari ArrayList.
Menghasilkan true
jika object yang dispesifikasi
berada di dalam ArrayList;
sebaliknya, menghasilkan false.
Menghasilkan indeks dari kemunculan pertama object yang dispesifikasi di dalam ArrayList.
Menyisipkan sebuah object pada indeks yang dispesifikasi.
Menghapus kemunculan pertama dari object yang dispesifikasi.
Menghapus sebuah object pada indeks yang dispesifikasi.
Menghapus sejumlah elemen tertentu berawal dari
indeks yang dispesifikasi di dalam ArrayList.
Mengurutkan ArrayList.
Menetapkan Capacity
dari ArrayList menjadi jumlah
elemen yang sekarang dimuat di dalam ArrayList.
|
Gambar 5.24 Beberapa metode
ArrayList
ArrayList mereferensi object. Semua kelas diderivasi dari kelas object, jadi ArrayList
dapat memuat objek-objek sembarang tipe. Gambar 5.24 mencantumkan beberapa
metode penting dari kelas ArrayList.
Gambar 5.25 mendemonstrasikan kelas ArrayList
dan beberapa metodenya. Pengguna dapat mengentrikan sebuah string ke dalam TextBox
dan kemudian menekan sebuah tombol yang merepresentasikan suatu metode ArrayList untuk melihat fungsionalitas
metode. TextBox menampilkan pesan
yang mengindikasikan hasil tiap operasi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
// Gambar 5.25: UjiArrayList.cs
// Menggunakan kelas ArrayList
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UjiArrayList
{
public partial class
UjiArrayList : System.Windows.Forms.Form
{
private System.Windows.Forms.Button
tombolTambahkan;
private System.Windows.Forms.TextBox
kotakTeksMasukan;
private System.Windows.Forms.Label
labelMasukan;
private System.Windows.Forms.Button
tombolHapus;
private System.Windows.Forms.Button
tombolPertama;
private System.Windows.Forms.Button
tombolAkhir;
private System.Windows.Forms.Button
tombolApaKosong;
private System.Windows.Forms.Button
tombolMemuat;
private System.Windows.Forms.Button
tombolLokasi;
private System.Windows.Forms.Button
tombolPotong;
private System.Windows.Forms.Button
tombolStatistik;
private System.Windows.Forms.Button
tombolTampil;
// variabel
designer yang diperlukan.
private
System.ComponentModel.Container komponen = null;
private System.Windows.Forms.TextBox
kotakTeksKonsol;
// ArrayList
untuk memanipulasi string
private ArrayList arrayList = new ArrayList(1);
public UjiArrayList()
{
InitializeComponent();
}
// kode yang
dibangkitkan oleh Visual Studio.NET
//
entri poin untuk aplikasi
[STAThread]
static
void Main()
{
Application.Run( new ArrayListTest() );
}
// menambah
item di akhir arrayList
private void tombolTambahkan_Click(
object sender, EventArgs e)
{
arrayList.Add(kotakTeksMasukan.Text);
kotakTeksKonsol.Text =
"Ditambahkan ke akhir: " + kotakTeksMasukan.Text;
kotakTeksMasukan.Clear();
}
// menghapus
item yang diinginkan dari arrayList
private void tombolHapus_Click(
object sender, EventArgs e)
{
arrayList.Remove(kotakTeksMasukan.Text);
kotakTeksKonsol.Text = "Dihapus:
" + kotakTeksMasukan.Text;
kotakTeksMasukan.Clear();
}
//
menampilkan elemen pertama
private void tombolPertama_Click(
object sender, EventArgs e)
{
//
mendapatkan elemen pertama
try
{
kotakTeksKonsol.Text =
"Elemen pertama: " + arrayList[0];
}
//
menampilkan eksepsi jika tidak ada elemen di dalam arrrayList
catch (ArgumentOutOfRangeException
diLuarRentang)
{
kotakTeksKonsol.Text = diLuarRentang.ToString();
}
}
//
menampilkan elemen akhir
private void tombolAkhir_Click(
object sender, EventArgs e)
{
//
mendapatkan elemen akhir
try
{
kotakTeksKonsol.Text = "Elemen
akhir: " +
arrayList[ arrayList.Count - 1 ];
}
//
menampilkan eksepsi jika tidak ada elemen di dalam arrrayList
catch ( ArgumentOutOfRangeException
diLuarRentang )
{
kotakTeksKonsol.Text = diLuarRentang.ToString();
}
}
// menentukan
apakah arrayList kosong
private void tombolApaKosong_Click(
object sender, EventArgs e)
{
kotakTeksKonsol.Text = (arrayList.Count == 0 ?
"arrayList kosong" : "arrayList tidak kosong" );
}
// menentukan
apakah arrayList memuat objek yang dispesifikasi
private void tombolMemuat_Click(
object sender, EventArgs e)
{
if
(arrayList.Contains(kotakTeksMasukan.Text))
kotakTeksKonsol.Text = "arrayList
memuat " +
kotakTeksMasukan.Text;
else
kotakTeksKonsol.Text = kotakTeksMasukan.Text +
" tidak ditemukan";
}
// menentukan
lokasi dari objek yang dispesifikasi
private void tombolLokasi_Click(
object sender, EventArgs e)
{
kotakTeksKonsol.Text = "Elemen
berada pada lokasi " +
arrayList.IndexOf(kotakTeksMasukan.Text);
}
// memotong
arrayList menjadi ukuran sekarang
private void tombolPotong_Click(
object sender, EventArgs e)
{
arrayList.TrimToSize();
kotakTeksKonsol.Text = "Vektor
dipotong menjadi ukuran sekarang";
}
//
menampilkan ukuran dan kapasitas sekarang dari arrayList
private void tombolStatistik_Click(
object sender, EventArgs e)
{
kotakTeksKonsol.Text = "Ukuran
= " + arrayList.Count +
"; kapasitas = "
+ arrayList.Capacity;
}
//
menampilkan isi dari arrayList
private void tombolTampil_Click(
object sender, EventArgs e)
{
IEnumerator enumerator = arrayList.GetEnumerator();
StringBuilder buffer = new
StringBuilder();
while ( enumerator.MoveNext() )
buffer.Append( enumerator.Current + " " );
kotakTeksKonsol.Text = buffer.ToString();
}
}
}
|
Gambar 5.26 Keluaran program pada Gambar 5.25
No comments:
Post a Comment