Dynamic Linked List - Informatika Unsyiah

advertisement
Universitas Syiah Kuala
MMA-041 Struktur Data
Dynamic Linked List
Dr. Taufik Fuadi Abidin, M.Tech
[email protected]
Single Linked List
Linked list dapat dianalogikan sebagai rantai besi yang terdiri dari
beberapa besi bulatan yang saling terhubung. Dengan mengingat atau
memegang bulatan besi yang terdepan, maka bulatan-bulatan besi yang
saling terkait lainnya dapat ditelusuri. Berikut adalah ilustrasi dari sebuah
single linked list.
head
5
15
6
NULL
LL =
Dengan hanya mencatat atau memegang alamat dari alokasi data bertipe
struct root pada sebuah variabel LL maka keberadaan simpul-simpul
dalam linked list tersebut dapat dijaga. Bila data-data dalam node berupa
bilangan bulat maka deklarasi struct yang diperlukan untuk membentuk
linked list di atas adalah:
typedef struct node * NodePtr;
typedef struct node {
int data;
NodePtr next;
}Node;
typedef struct root {
NodePtr head;
unsigned size;
}Root;
Root LL;
Penambahan Simpul (Node)
Bila disepakati bahwa setiap penambahan simpul pada linked list
dilakukan pada bagian depan (paling dekat dengan head) maka jumlah
biaya (complexitas) untuk penambahan simpul adalah konstan atau O(1).
Sebagai contoh, penambahan sebuah simpul dengan nilai 3 pada linked
list di atas dapat divisualisasikan sebagai berikut:
Struktur Data
Author: Taufik Fuadi Abidin
2
head
5
15
6
NULL
LL =
Buat simpul baru dan masukkan datanya
3
Kemudian, atur kembali susunan linked list menjadi:
head
5
15
6
3
5
15
NULL
LL =
3
Atau:
head
6
LL =
NULL
Pencarian Simpul
Pencarian simpul dalam sebuah single linked list harus dilakukan secara
linier. Kompleksitas pencarian sebuah simpul dalam linked list adalah
O(n). Hal ini disebabkan karena simpul-simpul dalam linked list biasanya
dikait secara tidak berurut.
Seandainya pun linked list disusun secara terurut, metode pencarian biner
(binary search) tetap tidak dapat diaplikasikan karena:
1. Linked list tidak memiliki indeks sehingga akses langsung ke simpul
tertentu tidak dapat dilakukan. Untuk menuju ke simpul tertentu,
proses pemeriksaan tetap dimulai dari simpul head (sisi depan linked
list).
2. Tidak dapat membagi linked list menjadi 2 bagian yang sama besar
seperti membagi array menjadi 2 bagian yang sama pada saat metode
pencarian biner diaplikasikan pada array yang terurut.
Struktur Data
Author: Taufik Fuadi Abidin
3
Penghapusan Simpul
Sebelum sebuah simpul dihapus, pencarian terhadap simpul tersebut
harus dilakukan terlebih dahulu. Bila simpul tersebut ditemukan dalam
linked list, simpul tersebut harus dikeluarkan dan keterkaitan antar simpul
dalam linked list harus diatur kembali. Kompleksitas untuk menghapus
sebuah simpul dalam single linked list adalah O(n).
Perhatikan contoh berikut ini:
head
3
5
15
6
LL =
NULL
Bila simpul 15 dihapus maka susunan linked list menjadi:
head
3
5
15
6
LL =
NULL
Implementasi Single Linked List
(Sekaligus Bahan Praktikum)
/* Program berikut disimpan dalam
file linkedlist.h */
typedef struct node * NodePtr;
typedef struct node {
int data;
NodePtr next;
}Node;
Struktur Data
Author: Taufik Fuadi Abidin
4
typedef struct list {
NodePtr head;
unsigned size;
}List;
void initList(List *);
int addList(List *, int);
void displayList(List *);
void freeList(List *);
Prototype function
ditulis disini
/* Program berikut disimpan dalam
file linkedlist.c */
#include "linkedlist.h"
#include <stdlib.h>
#include <stdio.h>
void initList(List * lptr) {
lptr->head = NULL;
lptr->size = 0;
}
int addList(List * lptr, int data) {
NodePtr new;
new = malloc(sizeof(Node));
if(new == NULL) {
printf("Error mengalokasi memori...\n");
return 0;
}
new->data = data;
new->next = lptr->head;
lptr->head = new;
lptr->size++;
return 1;
}
void displayList(List * lptr) {
NodePtr current = lptr->head;
printf("\n");
while(current != NULL) {
printf("%d -> ", current->data);
current = current->next;
Struktur Data
Author: Taufik Fuadi Abidin
5
}
printf("null\n");
}
void freeList(List * lptr) {
NodePtr next=lptr->head;
NodePtr current=next;
while(current != NULL) {
next = current->next;
free(current);
current = next;
}
}
/* Program berikut disimpan dalam file main.c */
#include <stdlib.h>
#include <stdio.h>
#include "linkedlist.h"
int main(void) {
int i, n, data;
List LL;
initList(&LL);
/* Buat initial linked list */
printf("Jumlah simpul = ");
scanf("%d", &n);
/* Input data simpul */
for(i=0; i<n; i++) {
printf("Data = ");
scanf("%d", &data);
addList(&LL, data);
}
displayList(&LL);
freeList(&LL);
return EXIT_SUCCESS;
}
Struktur Data
Author: Taufik Fuadi Abidin
6
Compile program tersebut dengan cara berikut ini (diasumsikan anda
menggunakan OS Linux):
gcc –Wall –pedantic –g –o mylist main.c linkedlist.c
Hasil kompilasi di atas akan membuat sebuah file mylist (dibangkitkan
dari dua buah file yaitu: main.c dan linkedlist.c). Selanjutnya, file
mylist tersebut dapat dijalankan melalui prompt dengan perintah:
mylist
Perhatikan dan pahami keluaran dari implementasi linked list tersebut dan
diskusikan dengan teman.
Struktur Data
Author: Taufik Fuadi Abidin
7
Download