IF 6121003
Pertemuan 7
List berkait & Algoritma Rekursif
Rencana
● Pengertian List
● List vs Array
● List sebagai ADT
● Implementasi List di C++
● Varian List
● Algoritma Rekursif
● Rekursif sebagai strategi algoritma
● Contoh algoritma rekursif
● Studi Kasus
Data Structure sebagai Container
● Container merupakan
wadah penampung
● Bayangkan sebagai “Jar”
wadah makanan
● Kita bisa mewadahi
makanan ke dalamnya
● Operasi yang mungkin:
menaruh benda,
mengambil benda,
mencari benda,
mengosongkan wadah
List
StringLinkedList::StringLinkedList() //konstruktor
: head(NULL) { } //head diisi NULL
StringLinkedList::~StringLinkedList() //destruktor
{ while (!empty()) removeFront();} //hapus tiap node
void StringLinkedList::removeFront() {
StringNode* old=head; //head saat ini
head = old->next; //pindah head ke
blkg
delete old; //dealokasi memori
}
Fitur Generic pada C++
● Pada contoh list sebelumnya, kita membuat list yang
memuat info / data berupa string
● Fitur Generic: umum, generalisasi
● Kemampuan menangani tipe data yang beragam
● Bagaimana membuat list yang dapat memuat tipe data
apa saja ?
● Di C++, kita menggunakan template dan type variabel
● Kita membuat kelas Node yang mampu menampung
tipe generic / umum
Membuat class SNode
● Node / simpul baru berikut menggunakan
template dan type variabel <E>
● Type variabel <E> akan menggantikan tipe
standard, jadi kita node tersebut bisa memuat
tipe apapun
template <typename E>
class SNode {
private:
E elem; //tipe elemen generic
SNode<E>* next;
friend class SLinkedList<E>; //beri
akses
};
class SLinkedList
● Perhatikan perbedaan dengan StringLinkedList
template <typename E>
class SLinkedList {
SLinkedList(); //konstruktor: buat list kosong
~SLinkedList(); //destruktor
bool empty() const; //cek apakah list kosong
const E& front() const; //ambil node depan
void addFront(const E& e);//tambah node depan
void removeFront(); //buang node depan
private:
SNode<E>* head;
};
SlinkedList (2)
SlinkedList (3)
● Sisip depan dan hapus depan
Penggunaan kelas Generic
● Contoh: Membuat list of string dan list of integer
dari list generic
List berkait ganda
● List berkait ganda (doubly linked list): memiliki pointer
(link) ganda yaitu kedepan dan kebelakang
● Kelemahan list berkait tunggal : hanya memiliki link ke
depan (next) sehingga tidak bisa kembali ke belakang
● List ganda punya kemampuan menelusuri depang
belakang sekaligus
Elemen Sentinel
● List berkait ganda menggunakan konsep
sentinel yaitu node yang bukan anggota list tapi
seolah-olah ada dalam list
● Tujuannya memberi akses cepat pada elemen
pertama dan elemen terakhir
● Pada gambar berikut elemen sentinel adalah
header dan trailer
Penyisipan node pada List ganda
● Link node yang disisipkan disetup menunjuk ke
node yang sudah ada. Node depan dan
belakang di update
Penghapusan node
● Menghapus node pada list berkait ganda berarti
mengupdate prev ( link sebelum ) dan next
( link ke depan )
Implementasi List berkait ganda
● Adanya pointer tambahan (jadi ada dua link)
typedef string Elem;
class DNode { //link list ganda
Elem elem; //elemen memuat string
DNode* prev; //link menunjuk ke belakang
DNode* next; //link ke depan
friend class DLinkedList; //beri akses class
};
Implementasi
class DLinkedList {
public:
DLinkedList();
~DLinkedList();
bool empty() const;
const Elem& front() const; //elemen info depan
const Elem& back() const; //elemen info blkg
void addFront(const Elem& e);
void addBack(const Elem& e);
void removeFront(); //hapus node depan
void removeBack(); //hapus node blkg
private:
DNode* header; //node sentinel
DNode* trailer;
protected:
void add(DNode* v, const Elem& e );//sisip sebelum
v
void remove(DNode* v); //hapus node v
Implementasi (3)
● Konstruktor destruktor
Implementasi (4)
● Fungsi mengakses isi node dan cek kosong
Implementasi (5)
● Menambah elemen ( node baru )
V
P
U
Implementasi (6)
● Menghapus node v
U V W
List Circular
● Elemen yang diujung (tail) menunjuk ke head
(awal). Sehingga tidak ada konsep head dan tail
V
Implementasi Circular list (4)
● Menghapus node di depan cursor
cursor next
Algoritma Rekursif
Recurrence Relation
● Recurrence : berulang, relation: hubungan
● Rekursif : algoritma yang memanggil dirinya sendiri
● Syarat algoritma rekursif diterima :
– Algoritma harus terminate ( berhenti )
– Menghasilkan progress komputasi, bekerja dg baik
● Contoh algoritma menghitung nilai faktorial :
n! = n*(n-1)*(n-2)*….*3*2*1 kita eksplor 2 relasi
yaitu 1! = 1 dan n! = n*(n-1)! Untuk n > 1
Faktorial (2)
● Faktorial sebagai fungsi matematik :