Jamal/Struktur Data
n n
I i null
o
e
d
s a
37
A. Jamal/Struktur Data
Implementasi TDA Tas berbasiskan array ini dengan dua Bahasa yang berbeda juga
sangat berebeda algorimanya. Hal ini disebabkan beda karakter dari array di C dengan list,
struktur data yang mirip array di Python. Kita akan Bahasa lebih dahulu implementasi dengan
Bahasa C.
Penggunaan array C harus memperhatikan bahwa array ketika didefinisikan, yaitu dibuat
di dalam memory komputer, besar array atau kapasitasnya ditetapkan jumlahnya. Karena hal ini
38
A. Jamal/Struktur Data
ada resiko ketika operasi penambahan add(item) dilakukan kapasitas array sudah penuh, tidak
bisa ada penambahan barang. Secara alami tas jika penuh tidak bisa dimasukkan barang lagi, jadi
bisa saja dirancang demikian. Tetapi bisa juga dibuat mekanisme penambahan kapasitas dengan
cara mengadakan tas lain yang kapasitasnya lebih besar, lalu memindahkan semua isi dari tas
yang sudah penuh k etas yang lebih besar kapasitasnya. Secara imaginative hal ini bisa dilakukan
terus menerus tanpa ada batas kapasitas tas.
Implementasi penambahan kapasitas dalam hal ini penggandaan kapasitas dijelaskan
dengan model sebagai berikut dimulai dari array tas, dengan nama variable tas->barang, sudah
terisi penuh pada kapasitasnya:
Index 0 1 2 3 4 5 6 7 8 9
data 12 13 10 11 12 13 14 15 16 17
Ketika akan dimasukkan data lagi, array sudah penuh lalu dibuat array dengan ukuran
dua kalinya dengan perintah
item *doubling =(item*) malloc(tas->kapasitas*sizeof(item)*2);
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Data
Setelah terbentuk array baru, satu persatu barang dipindahkan sesuai posisinya, lalu
memory yang dipegang tas->barang dibebaskan dengan perintah free(tas->barang) lalu
variable tas->barang diarahkan ke array yang baru dengan kapasitas digandakan. Mekanisme
penambahan kapasitas seperti ini juga dilakukan secara intrinsic oleh struktur data list di Python,
dan juga penambahan dilakukan diakhir dengan method list.append(item).
Algoritma yang berbeda juga ditemukan pada operasi penghapusan barang dengan fungsi
remove(item). Jika data item ditemukan di TDA tas maka diberikan posisinya sebagai hasil.
Kemudian data sebelah kanannya mengisi data yang dihapus, lalu berikutnya data sebelah
kanannya lagi mengisi data yang sudah bergeser dan seterusnya sampai data terakhir di TDA
Tas. Berikut penghapusan data 11 dengan perintah remove(11).
Index 0 1 2 3 4 5 6 7 8 9
data 12 13 10 11 12 13 14 15 16 17
Index 0 1 2 3 4 5 6 7 8 9
data 12 13 10 12 13 14 15 16 17
39
A. Jamal/Struktur Data
Berikut file header “tas.h” dan dua file C untuk aplikasi uji TDA Tas dan
implementasinya.
#include <stdio.h>
#include <stdlib.h>
#include "tas.h"
int main(int argc, char *argv[]) {
Tas tas1;
int i;
tas1=createTas(12);
int kps=tas1.kapasitas;
addItem(&tas1,13);
for(i=0;i<kps;i++){
addItem(&tas1,i+10);
printf(" jumlah %d kapasitas %d\n",len(tas1),tas1.kapasitas);
}
printf(" contains %d len %d\n ",contains(tas1,17),len(tas1));
traversalPrint(tas1);
printf(" removed %d \n ",removeItem(&tas1,11));
traversalPrint(tas1);
printf(" contains %d len %d\n ",contains(tas1,15),len(tas1));
printf(" contains %d \n ",contains(tas1,11));
return 0;
}
40
A. Jamal/Struktur Data
#include "tas.h"
#include <stdlib.h>
#define kap 10
Tas createTas(item itm){
Tas tas;
tas.barang =(item*)malloc(kap*sizeof(item));
tas.barang[0]=itm;
tas.jumlah=1;
tas.kapasitas=kap;
return tas;
}
void addItem(Tas* tas, item itm){
if (tas->jumlah==tas->kapasitas){
item *doubling =(item*)malloc(tas->kapasitas*sizeof(item)*2);
int i;
for(i=0;i<tas->jumlah;i++){
doubling[i]=tas->barang[i];
}
free(tas->barang);
tas->barang=doubling;
tas->kapasitas=2*tas->kapasitas;
}
tas->barang[tas->jumlah]=itm;
(tas->jumlah)++;
}
item removeItem(Tas*tas,item itm){
int i=0;
int found=0;
item itmfound='\0';
while(i < tas->jumlah && !found){
if(tas->barang[i]==itm){
found=1;
itmfound=itm;
(tas->jumlah)--;
}
i++;
}
for(;i<= tas->jumlah;i++){
tas->barang[i-1]=tas->barang[i];
}
}
41
A. Jamal/Struktur Data
TDA Tas berbasis array yang menggunakan Bahasa Python akan lebih sederhana karena
mengaplikasikan struktur data list dari Python yang lebih banyak operasinya dibandingkan TDA
Tas. Implementasi TDA Tas ini hanya menggunakan sebagian dari operasi list, yaitu
list.append(item), list.index(item) dan list.pop(index) serta fungsi len(list) dan operator in.
Metode list.append(item) untk menambah item diakhir dari list. Metode list.index(item)
mencari item lalu memberikan posisi atau index dari item yang pertama kali ditemukan. Dengan
masukan index yang diperoleh lalu metode list.pop(index) menghapus item pada index yang
diberikan.
Fungsi len(list) kependekan dari length memberikan banyaknya item dalam list,
sedangkan operator in dalam perintah “item in list” memeriksa apakah item ada (contains)
dalam list. Fungsi len( ) dan operator in akan dibuat untuk TDA tetap sebagai fungsi dan
operator dengan menggunakan nama fungsi __len__() dan __contains__() dimana penamaan
fungsi diawali dan diakhiri garis bawah ganda (double underscore) adalah menimpa atau
menggantikan fungsi dan operator built-in dalam hal ini fungsi len( ) dan operator in.
Selain TDA Tas, diperlukan sebuah TDA untuk melakukan iterasi atau traversal pada
setiap barang yang ada di koleksi dalam TDA Tas. TDA bantu ini untuk iterasi TDA Tas kita
sebut TDA _TasIterator yang mana aplikasi penggunaanya pada mekanisme for barang in
tasIterator. Iterator akan diberikan oleh method
42
A. Jamal/Struktur Data
def __iter__( )
serta method yang memberikan data barang dalam koleksi barang di TDA Tas adalah
def __next__( )
Penggunaan struktur data List dari Python, yang akan dijelaskan lebih detil pada bagian
akhir buku ini membuat implementasi TDA Tas menjadi sangat sederhana dibandingkan dengan
implementasi dengan Bahasa C sebelum ini.
Berikut file Python implementasi dari TDA Tas dan TDA _TasIterator serta aplikasi
ujinya.
class Tas:
def __init__(self):
self._barang=list()
def __len__(self):
return len(self._barang)
def __contains__(self,item):
return item in self._barang
def add(self,item):
self._barang.append(item)
def remove(self,item):
assert item in self._barang, "Barang harus ada dalam Tas"
ndx=self._barang.index(item)
self._barang.pop(ndx)
return ndx
def traversalPrint(self):
for item in self._barang:
print(" %d\n"%(item))
class _TasIterator:
def __init__(self,tas):
self._tasbarang=tas._barang
self._curitem=0
def __iter__(self):
return(self)
def __next__(self):
if(self._curitem<len(self._tasbarang)):
item=self._tasbarang[self._curitem]
self._curitem+=1
return item
else:
raise StopIteration
43
A. Jamal/Struktur Data
44