• Tidak ada hasil yang ditemukan

Lecture Notes On Algorithms and Data Structures. Oleh Thompson Susabda Ngoen

N/A
N/A
Protected

Academic year: 2021

Membagikan "Lecture Notes On Algorithms and Data Structures. Oleh Thompson Susabda Ngoen"

Copied!
10
0
0

Teks penuh

(1)

L

L

I

I

N

N

K

K

E

E

D

D

L

L

I

I

S

S

T

T

S

S

i

i

n

n

g

g

l

l

y

y

d

d

a

a

n

n

D

D

o

o

u

u

b

b

l

l

y

y

Oleh

Thompson Susabda Ngoen

Universitas Bina Nusantara

Fakultas Ilmu Komputer

(2)

Linked List adalah suatu struktur data linier. Berbeda dengan array yang juga merupakan struktur data linier dan tipe data komposit, linked list dibentuk secara dinamik. Pada saat awal program dijalankan elemen linked list belum data. Elemen linked list (disebut node) dibentuk sambil jalan sesuai instruksi. Apabila setiap elemen array dapat diakses secara langsung dengan

menggunakan indeks, sebuah node linked list diakses dengan menggunakan pointer yang mengacu (menunjuk) ke node tersebut.

Awal atau kepala linked list harus diacu sebuah pointer yang biasa diberi nama head. Pointer

current (disingkat curr) digunakan untuk memindahkan pengacuan kepada node tertentu.

Node Pembentuk Linked List

Elemen pembentuk linked list disebut node. Node terdiri dari dua bagian, bagian data dan bagian kait (link). Bagian data berupa satu atau beberapa field. Bagian link terdiri dari pointer. Linked list yang node-nya mempunyai satu buah pointer disebut singly-linked list. Linked list yang node-nya mempunyai dua pointer, satu untuk mengait ke node berikutnya dan yang lain untuk mengait ke

node sebelumnya, disebut doubly-linked list. Node dibentuk dengan structure. Untuk

menyederhanakan pembahasan, dalam tulisan ini bagian data berupa satu buah field.

struct tnode { int data;

struct tnode *next; };

Operasi Pada Linked List

Operasi yang berkaitan dengan struktur data linked list adalah: create, empty, insertathead,

insertaftercurr, insertattail, retrieve, update, findfirst, findnext, findprev, deletenode, dan clear.

ceate( )

membentuk linked list kosong empty( )

memeriksa status kosong suatu linked list insert_head( )

menambah node baru pada posisi awal linked list sehingga node ini menjadi node yang pertama,

pointer current menunjuk ke node yang baru ditambahkan ini

insert_curr( )

menambah node baru pada posisi setelah pointer current, pointer current menunjuk ke node yang baru ditambahkan ini

insert_tail( )

menambah node pada akhir linked list, sehingga node ini menjadi node terakhir linked list; pointer

(3)

mengembalikan nilai data node yang ditunjuk pointer current update( )

mengubah nilai data node yang ditunjuk pointer current findfirst( )

memindahkan pointer current ke posisi node pertama findnext( )

memindahkan pointer current ke posisi node berikutnya apabila tidak sedang berada pada posisi

node terakhir

findprev( )

memindahkan pointer current ke posisi node sebelumnya apabila tidak sedang berada pada posisi

node pertama

deletenode( )

menghapus node pada posisi current dan memindahkan pointer current ke posisi node pertama clear( )

menghapus linked list dengan membebaskan seluruh node satu persatu.

Implementasi Linked List

Fungsi create( ) memberi nilai awal NULL kepada pointer head dan curr (current).

void create(struct tnode **head, struct tnode **curr) { *head= *curr= NULL;

}

Fungsi empty( ) mengembalikan nilai satu apabila linked list masih kosong yang ditandai dengan

pointer head yang bernilai NULL., selain itu dikembalikan nilai nol.

int empty(struct tnode *head) { if (head== NULL) return 1; return 0;

}

Fungsi insert_head( ) menambah node baru pada posis awal linked list. Node baru ini menjadi

node pertama. Pointer head dan curr diubah sehingga mengacu ke node ini.

Sebelum insert_head Setelah insert_head 10

(4)

Ö

Mula-mula bentuk node baru (n). Pointer next pada node baru ini dikaitkan (menunjuk) ke node yang ditunjuk pointer head (o). Ubah pointer head dan curr sehingga menunjuk node baru tersebut (p).

n

o

p

void insert_head(struct tnode **head, struct tnode **curr, int e) {

struct tnode * node;

node= (struct tnode *) malloc(sizeof(int)); node->data= e;

node->next= *head; *head= *curr= node; }

Fungsi insert_curr( ) menambah node baru pada posisi setelah pointer curr. Apabila linked list masih kosong maka node ini menjadi node pertama. Pointer curr menunjuk ke node baru tersebut.

Sebelum insert_curr Setelah insert_curr 10

Ö

Ö

Mula-mula bentuk node baru (n). Pointer next pada node baru ini dikaitkan (menunjuk) ke node yang ditunjuk field next dari pointer curr (o). Kaitkan field next pada node yang ditunjuk pointer

(5)

tersebut (q).

n

o

p

q

void insert_curr(struct tnode **head, struct tnode **curr, int e) {

struct tnode * node;

node= (struct tnode *) malloc(sizeof(int)); node->data= e;

if (*head==NULL) { *head= node; node->next= NULL; } else { node->next= (*curr)->next; (*curr)->next= node; } *curr= node; }

Fungsi insert_tail( ) menambah node baru pada posis akhir linked list. Pointer curr digerakkan sampai menunjuk node terakhir, lalu node baru dikaitkan. Node baru ini menjadi node terakhir.

Pointer curr diubah sehingga mengacu ke node ini.

Sebelum insert_tail Setelah insert_tail 10

(6)

Mula-mula bentuk node baru (n). Pointer curr dipindahkan ke posisi node terakhir (o). Ubah link pada node terakhir ini sehingga menujuk kepada node baru(p). Terakhir pindahkan pointer curr sehingga mengacu node baru tersebut (q).

n

o

p

q

void insert_tail(struct tnode **head, struct tnode **curr, int e) {

struct tnode *node;

node= (struct tnode *) malloc(sizeof(int)); node->data= e;

node->next= NULL;

if (*head== NULL) *head= node; else {

while ((*curr)->next != NULL) *curr= (*curr)->next; (*curr)->next= node;

}

*curr= node; }

Fungsi retrieve( ) mengembalikan data pada node yang sedang ditunjuk pointer curr atau mengembalikan suatu nilai tertentu apabila linked list dalam keadaan kosong.

int retrieve(struct tnode *head, struct tnode *curr) { if (empty(head)) return -32768;

return curr->data; }

Fungsi update( ) mengubah nilai data pada node yang ditunjuk pointer curr jika linked list tidak kosong. Nilai satu akan dikembalikan apabila perubahan data berhasil dilakukan.

(7)

int update(struct tnode *head, struct tnode* curr, int e) { if (empty(head)) return 0;

curr->data= e; return 1; }

Fungsi findfirst( ) akan memindahkan pointer curr ke posisi node pertama, yaitu node yang ditunjuk pointer head, jika linked list tidak kosong. Nilai satu akan dikembalikan apabila pemindahan pointer curr berhasil dilakukan.

int findfirst(struct tnode *head, struct tnode **curr) { if (empty(head)) return 0;

*curr= head; return 1; }

Fungsi findnext( ) akan memindahkan pointer curr ke posisi node berikutnya apabila linked list tidak kosong dan pointer curr tidak sedang berada pada posisi node terakhir. Nilai satu akan dikembalikan apabila pemindahan pointer curr berhasil dilakukan.

int findnext(struct tnode *head, struct tnode **curr) { if (empty(head)) return 0;

if ((*curr)->next == NULL) return 0; *curr= (*curr)->next;

return 1; }

Fungsi findprev( ) akan memindahkan pointer curr ke posisi node sebelumnya apabila linked list tidak kosong dan pointer curr tidak sedang berada pada posisi node pertama. Nilai satu akan dikembalikan apabila pemindahan pointer curr berhasil dilakukan. Pemindahan dilakukan dengan bantuan sebuah pointer lain. Pada mulanya pointer ini mengacu kepada node pertama. Pointer ini berpindah ke node selanjutnya sampai pada posisi satu node sebelum node yang diacu pointer curr.

int findprev(struct tnode *head, struct tnode **curr) { if (*curr== head) return 0;

struct tnode *temp= head;

while (temp->next!= *curr) temp= temp->next; *curr= temp;

return 1; }

Fungsi deletenode( ) akan menghapus node pada posisi curr jika linked list tidak kosong dan memindahkan pointer curr ke posisi node pertama, atau curr bernilai NULL apabila linked list menjadi kosong setelah dihapus.

(8)

Ö

Ö

Ö

Penghapusan dilakukan dengan bantuan sebuah pointer lain. Pada mulanya pointer ini mengacu kepada node pertama (n). Pointer ini berpindah ke node selanjutnya sampai pada posisi satu

node sebelum node yang diacu pointer curr (o). Mengubah link pada node yang diacu pointer

temp sehingga menunjuk kepada node setelah node hyang ditunjuk pointer curr (p), dan membebaskan node yang sedang diacu pointer curr (q).

n

o

p

q

int deletenode(struct tnode **head, struct tnode **curr) { struct tnode *temp;

if (empty(*head)) return 0;

if (*curr== *head) *head= (*head)->next; else {

temp= *head;

(9)

temp->next= (*curr)->next; } free(*curr); *curr= *head; return 1; }

Fungsi clear( ) menghapus linked list dengan membebaskan seluruh node satu persatu. Pointer head dan curr diberi nilai NULL.

void clear(struct tnode **head, struct tnode **curr) { *curr= *head;

while (*curr!= NULL) { *head= *curr;

*curr= (*curr)->next; free(*head);

}

*head= *curr= NULL; }

Node Pembentuk Doubly-Linked List

Doubly-linked list mempunyai dua field pointer, satu untuk mengait ke node berikutnya (biasanya

diberi nama next) dan yang lainnya untuk mengait ke node sebelumnya (biasanya diberi nama prev).

struct tnode { int data;

struct tnode *prev, *next; };

Operasi Pada Doubly-Linked List

Operasi yang berkaitan dengan struktur data doubly linked list adalah: create, empty, insertafter,

insertbeforer, retrieve, update, findfirst, findnext, findprev, deletenode, dan clear. Operasi yang

berbeda dengan singly linked list dijelas di bawah ini. insert_after( )

menambah node baru pada posisi setelah pointer current, pointer current menunjuk ke node yang baru ditambahkan ini

insert_before( )

menambah node pada posisi sebelum pointer current, pointer current menunjuk kepada node yang baru ditambahkan ini

Implementasi Doubly-Linked List

Fungsi insert_after( ) menambah node baru pada posisi setelah pointer curr. Apabila linked list masih kosong maka node ini menjadi node pertama. Pointer curr menunjuk ke node baru tersebut.

(10)

Sebelum insert_after 40 Setelah insert_after 40

Ö

Ö

Mula-mula bentuk node baru (n). Pointer next pada node baru ini dikaitkan (menunjuk) ke node yang ditunjuk field next dari pointer curr (o). Kaitkan field next pada node yang ditunjuk pointer curr ke node baru tersebut (p). Terakhir pindahkan pointer curr sehingga mengacu node baru tersebut (q).

n

o

p

Referensi

Dokumen terkait

Otitis media akut dapat dise#a#kan invasi virus Campak ke dalam telin$a ten$a!% Gendan$ telin$a #iasana !peremia pada fase prodormal dan stadium erupsi% 4ika terjadi invasi

positi untuk (at bermuatan negati !anoda#. 3lektrolit dalam jam lemon bertenaga adalah asam sitrat. erakan elektron dimulai ketika lapisan seng pada salah satu paku

Buatlah method untuk menambahkan Node di Double Linked List, setelah Node tertentu (pembacaan List menggunakan pembacaan mundur). public

Kalau head tidak bernilai NULL alias telah dimiliki satu atau lebih node, yang pertama dilakukan adalah menghubungkan pointer next dari node aktif (curr) ke node yang baru saja

 DLLNC adalah sebuah Linked List yang terdiri dari dua arah pointer, dengan node yang saling terhubung, namun kedua pointernya menunjuk ke NULL.  Setiap node pada

Dengan adanya sistem ini diharapkan bisa memberikan manfaat untukPoliteknik Terpikat Sambas Propinsi Kalimantan Barat khususnya Koordinator PKL dalam mengambil keputusan

Namun secara umum apabila efektivitas kinerja tersebut dikaitkan dengan kegiatan pelayanan jasa, suatu kinerja layanan akan dikatakan efektif jika pelanggan merasa puas

Kita seyogyanya tak perlu merasa rendah diri dengan kemampuan matahari, bulan, angin, laut, maupun setan yang dalam beberapa bidang melangkahi kesanggupan manusia,