Академический Документы
Профессиональный Документы
Культура Документы
Overview
Dalam pertemuan sebelumnya telah dibahas mengenai mekanisme koleksi yang dapat digunakan
untuk menampung sekumpulan elemen dengan tipe yang sama seperti array. Beberapa kelemahan
dalam menggunakan array antara lain: alokasi memori yang bersifat statis, kemungkinan terjadinya
kondisi sparse sehingga kita perlunya mengetahui lokasi-lokasi yang belum terisi, proses operasi
penghapusan elemen yang perlu melakukan pergeseran elemen lain untuk menjaga keterurtan.
Untuk materi kali ini akan diperkenalkan sebuah struktur data yang dikenal dengan List Linear. List
linier adalah sekumpulan elemen bertipe sama yang mempunyai keterurutan tertentu. Dimana list
linear menawarkan beberapa keuntungan seperti : alokasi memori yang dinamis, komputasi yang
lebih ringkas apabila melakukan perubahan pada elemen (terutama operasi insert dan delete). Tentu
saja kemudahan yang ditawarkan akan sangat bermanfaat apabila kita memahami logika dan
implementasi dari List Linear.
Implementasi List Linear dalam bahasa C dapat dikatakan “gampang-gampang sulit” dimana konsep
dasar yang wajib dipahami adalah penggunaan pointer untuk mengacu pada data-data yang bersifat
dinamis (saya sendiri mengalami banyak kesulitan dalam implementasinya )
List Linear
List Linear adalah sekumpulan elemen-elemen yang memiliki tipe yang sama, dimana setiap elemen
akan terdiri dari 2 bagian yaitu:
type ElmtList : <Info: Infotype, Next: address>
Info : variabel bertipe InfoType dimaan tipe ini telah terdefinisi dan digunakan untuk menyimpan
data
Next : menyimpan Address dari elemen selanjutnya (dalam C implementasinya adalah sebuah
pointer)
Dari gambar ilustrasi sebuah List Linear dapat dilihat ada 2 buah bagian penting yaitu: Elemen dan
List itu sendiri. Implementasi dari List adalah sebuah pointer (@) yang mengacu pada elemen
pertama dari sebuah List, terkadang disebut juga dengan HEAD.
Keterurutan dan relasi antar elemen dilakukan melalui mekanisme akses address. Untuk lebih
meningkatkan pemahaman terhadap konsep Modular maka dalam implementasi dari List, kita akan
lakukan dengan menerapkan ADT.
Setelah mendefinisikan File Header maka tahap selanjutnya adalah menuliskan kode implementasi
dari file header yang ada, namun kali ini kita akan membangun Program Utama terlebih dahulu
dengan asumsi bahwa semua implementasi yang ada sudah benar (hal ini akan sangat membantu
kita dalam merancang sebuah program secara efektif dan efisien).
//PRIMITIF get
char getIndeks(InfoType temp)
{ /*I.S : InfoType temp terdefinisi dan telah berisi data
F.S : Mengembalikan Informasi Indeks dari InfoType temp */
return temp.Indeks;
}
InfoType entriInfoType()
{/*I.S: -
F.S: Tercipta sebuah info Type yang telah berisi data */
InfoType temp;
printf("Masukkan Nim:");
setNim(&temp);
printf("Masukkan nama:");
setNama(&temp);
printf("Masukkan Nilai:");
setNilaiMentah(&temp);
return temp;
}
Dengan membangun PRIMITIF untuk InfoType seperti yang telah didefinisikan diatas maka apabila
kita ingin menggenerate sebuah InfoType maka kita dapat memanggil fungsi InfoType
entriInfoType(), misalkan pada contoh kode program utama dalam pemanggilan mekanisme
Memasukkan Data Di Awal, kita tinggal memanggil
Hal yang sama kita lakukan apabila ingin menampilkan informasi dari sebuah InfoType kita tinggal
panggil prosedure void displayInfo(InfoType temp), yang dipanggil pada program utama sub-rutin
pencarian
ElementPtr createElementV()
{/*I.S: InfoType belum terdefinisi
F.S: Tercipta sebuah elemen dimana dengan meminta user untuk
mengentrikan data dengan memanggil entriInfoType() */
createElement(entriInfoType());
}
Perbedaan pada kedua sub-rutin untuk menghasilkan sebuah elemen ada pada parameter yang
digunakan, pada prosedur ElementPtr createElementV(); informasi data InfoType
diasumsikan belum terdefinisi dan belum ada variabel yang disiapkan sehingga secara otomatis akan
membuat Element dengan memanggil prosedur ElementPtr createElement(InfoType a)
dengan memanfaatkan prosedure entriInfoType();
PRIMITIF
void createList(List *l);
ILUSTRASI
Set Head dari list menjadi
NULL
ALGORITMA
Procedure createList(Input/Output: List L)
{I.S : -
F.S :list siap digunakan/ list kosong
}
FIRST(L) <- Nil
KODE C
void createList(List *l){
l->Head=NULL;
}
PRIMITIF
boolean isEmpty(Input List *l);
ILUSTRASI
ALGORITMA
Function isEmpty(List L) -> Boolean
{I.S : terdefinisi list L
F.S : membalikkan nilai TRUE bila list kosong dan FALSE bila tidak kosong
}
If FIRST(L)=Nil
TRUE
ELSE
FALSE
KODE C
boolean isEmpty(List *l){
if (l->Head==NULL)
return true;
else
return false;
return true;
}
PRIMITIF
ElementPtr First(List *l);
ILUSTRASI
l Return this address
ALGORITMA
Function First(L) -> Address
{I.S: -
F.S: membalikan alamat dari element pertama dari sebuah List
}
L->Head
KODE C
ElementPtr First(List *l){
return l->Head;
}
PRIMITIF
ElementPtr Next(ElementPtr P);
ILUSTRASI
P Return this address
@ @
ALGORITMA
Function Next(P) -> Address
{I.S: -
F.S: membalikan alamat selanjutnya dari element P
}
P->Next
KODE C
ElementPtr Next(ElementPtr P){
return P->Next;
}
PRIMITIF
void insertFirstPtr(List *l,ElementPtr P);
ILUSTRASI
P
Kasus Untuk List Tidak Kosong: Kondisi Akhir
ALGORITMA
Procedure insertFirstPtr(Input/Output List L, Input Address P)
{ I.S: Terdefinisi List L mungkin kosong, terdapat Elemen dengan address P
F.S: P menjadi elemen pertama dalam List L
}
NEXT(P) <- FIRST(L)
FIRST(L) <- P
KODE C
void insertFirstPtr(List *l,ElementPtr P){
if (isEmpty(l)==true)//berarti list masih kosong
{ printf("Insert Ke List Kosong \n");
}
else // berarti list udah ada isinya
{ printf("Insert Ke List Tidak Kosong \n");
P->Next=l->Head;
}
l->Head=P;
printf("%p \n",l->Head); //Untuk menampilkan address head
}
PRIMITIF
void insertFirst(List *l,InfoType a);
ILUSTRASI
Sama dengan insertFirstPtr hanya berbeda pada masalah pengisian InfoType ke
dalam Elemen
Data InfoType dimasukkan ke
dalam Elemen P
Info Empty
P->Data = InfoType
ALGORITMA
procedure insertFirst(Input/Output List L,Input InfoType a)
{ I.S: Terdefinisi List L mungkin kosong, terdapat InfoType a
F.S: InfoType a dimasukkan ke dalam P dan P menjadi elemen pertama List L
}
Kamus Lokal: Adress P
Alokasi(P);
insertFirstPtr(L,P)
KODE C
void insertFirst(List *l,InfoType a){
ElementPtr P;
P=createElement(a);
insertFirstPtr(l,P);
}
PRIMITIF
void insertAfterPtr(ElementPtr Prv, ElementPtr P);
ILUSTRASI
P
Tahap1
Tahap2
ALGORITMA
procedure insertAfter(Input/Output Address Prev, P)
{ I.S: Terdefinisi List L mungkin kosong, terdapat InfoType a
F.S: InfoType a dimasukkan ke dalam P dan P menjadi elemen pertama List L
}
NEXT(P) <- NEXT(Prev)
NEXT(Prev) <-P
KODE C
void insertAfterPtr(ElementPtr Prv, ElementPtr P){
P->Next=Next(Prv);
Prv->Next=P;
}
PRIMITIF
void insertLastPtr(List *l, ElementPtr P)
ILUSTRASI
Kondisi Awal
Last??
@
ALGORITMA
procedure insertLastPtr(input/output List L, Address P)
{ I.S: Terdefinisi List L mungkin kosong, terdapat Elemen dengan address P
F.S: Element P menjadi element terakhir dari List L
}
Kamus Lokal : Address Last
IF (isEmpty(L)==True)
insertFirstPtr(L,P)
ELSE
{Traversal untuk menuju elemen Akhir, dimana berhenti ketika NEXT(LAST)
adalah NULL}
LAST <-FIRST(L)
WHILE (NEXT(LAST)<>Nil) do
LAST <- NEXT(LAST)
insertAfterPtr (LAST,P)
KODE C
void insertLastPtr(List *l, ElementPtr P){
ElementPtr Last;
//cek kondisi list apakah kosong atau tidak
if (isEmpty(l)==true)//list kosong maka lakukan insert First
insertFirstPtr(l,P);
else
//melakukan iterasi untuk menemukan element terakhir
{ Last=First(l);
while (Last->Next!=NULL)
Last=Next(Last);
insertAfterPtr(Last,P);
}
}
PRIMITIF
void insertLast(List *l, InfoType a);
ILUSTRASI
ALGORITMA
Procedure insertLast(Input/Output List L, InfoType a)
{ I.S: Terdefinisi List L mungkin kosong, terdapat InfoType a
F.S: InfoType a masuk ke dalam data Element P dan Element P menjadi
element terakhir dari List L
}
Kamus Lokal: Address P
Alokasi(P)
P->Data=a
insertLastPtr(L,P)
KODE C
void insertLast(List *l, InfoType a){
ElementPtr P;
P= createElement(a);
insertLastPtr(l,P);
}
PRIMITIF
ElementPtr searchingV1(List *l, char *Nim)
ILUSTRASI
@ yy zz xx
Kondisi Akhir
P P P
@ yy zz xx
ALGORITMA
function searchingV1(Input List L, char *Nim)->Address
{ I.S: Terdefinisi List L mungkin kosong, terdapat data nim yang dicari
F.S: Mengembalikan Adress elemen yang dicari bila ada dan Nil bila tidak
ada
}
Kamus Lokal: Address P
Boolean status=FALSE
IF (isEmpty(L)==TRUE)
-> Nil
ELSE
{Lakukan traversal pencarian pada list}
P=FIRST(L)
REPEAT
IF (P->Data.NIM == Nim)
status==TRUE
ELSE
P <- NEXT(P)
UNTIL (status==TRUE) || (P==NULL)
P
KODE C
ElementPtr searchingV1(List *l, char *Nim){
ElementPtr P;
boolean status;
status=false;
puts("Mulai melakukan Pencarian");
if (isEmpty(l)==true){//list kosong jangan lakukan pencarian
puts("List Kosong");
return NULL;
}
else {
P= First(l);
do{ //bandingkan NIM yang dicari dengan data yang ada
printf("%p \n",P);
if (strcmp(Nim,P->Data.Nim)==0){
status=true;
puts("Found");
}
else
P=Next(P);
}
while ((status==false)&&(P!=NULL));
}
return P;
}
PRIMITIF
ILUSTRASI
Kondisi Akhir
P P P
@ yy zz xx
ALGORITMA
Procedure viewList(Input List L)
{ I.S : List L terdefinisi dan mungkin kosong
F.S : Informasi pada Elemen dari L ditampilkan
}
Kamus Lokal: Address P
P <-FIRST(L)
WHILE (P<>Nil)
INFO(P)
P <- NEXT(P)
KODE C
void viewList(List *l){
//iterasi dari awal dan tampilkan
printf("Melihat isi list \n");
ElementPtr P;
P=First(l);
while (P!=NULL){
displayInfo(P->Data);
P=Next(P);
}
}