0% menganggap dokumen ini bermanfaat (0 suara)
52 tayangan38 halaman

ASD Single Linked List

Dokumen ini membahas tentang algoritme struktur data Linked List, termasuk penjelasan tentang Linked List, operasi yang dapat dilakukan pada Linked List seperti penambahan, penghapusan, dan pencarian, serta perbandingan antara Linked List dan Array.

Diunggah oleh

Wahyu Widihansyah
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
52 tayangan38 halaman

ASD Single Linked List

Dokumen ini membahas tentang algoritme struktur data Linked List, termasuk penjelasan tentang Linked List, operasi yang dapat dilakukan pada Linked List seperti penambahan, penghapusan, dan pencarian, serta perbandingan antara Linked List dan Array.

Diunggah oleh

Wahyu Widihansyah
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 38

Algoritme dan Struktur Data

Linked List

1
Outline

• Linked List vs Array


• Linked List dan Iterator
• Variasi Linked List
• Double Linked List
• Circular Linked List

2
Tujuan

• Memahami struktur data Linked List


• Dapat mengimplementasikan Linked List beserta
operasi terhadapnya

• Memahami kompleksitas dari operas-operasi Linked


List

3
Linked List
• Linked List
A0 A1 A2 A3
• Struktur data yang dibangun dari satu atau lebih
Node/ListNode yang menempati alokasi memori secara
dinamis
• Node
• Dalam linked list: tempat penyimpanan data yang terdiri
dari dua bagian/field
• Field pertama adalah Element/Data: digunakan untuk
menyimpan data/nilai
• Field kedua adalah Pointer/Reference: digunakan untuk
menyimpan referensi ke Node berikutnya
4
Linked List
• Jika Linked List hanya berisi satu node
• maka pointer-nya akan menunjuk ke NULL.
• Jika Linked List memiliki lebih dari satu node
• maka pointer menyimpan alamat dari node
berikutnya, sehingga antara node satu dengan
node yang lain akan terhubung.
• Kecuali node paling ujung akan menunjuk ke
NULL.
• Pointer disebut juga sebagai Link.

5
Linked List vs Array
• Linked List
A0 A1 A2 A3
• Menyimpan koleksi elemen secara non-contiguously
Letak elemen satu dengan yang lain di dalam memori bisa berjauhan (acak).
Berbeda dengan elemen dalam array yang terletak berurutan dalam memori.

a b c d e
Representasi Array

c a e d b
Representasi Linked List

6
Linked List vs Array
• Items are stored in contiguous array:
//step through array a, outputting each item
for (int idx=0; index < sizeof(a)/sizeof(a[0]); idx++)
cout << a[index] << endl;

• Items are stored in a linked list non-contiguously:


// step through List theList, outputting each
item for (ListNode *p = head; p != NULL; p = p-
>next)
cout << p->data << endl;
A0 A1 A2 A3

First/Head Last/Tail7
Linked List vs Array
• Mengizinkan operasi tambah dan hapus elemen di tengah
koleksi
• Hanya membutuhkan jumlah perpindahan elemen yang
konstan
• Berbeda dengan array. Apabila ada elemen baru disisipkan di tengah-
tengah, berapa elemen yang harus dipindahkan?

A0 A1 A0 A1

A2 A2
elemen baru elemen baru

8
Singly (Single) Linked List
• Singly (Single) Linked List
• artinya pointer-nya hanya satu buah dan satu arah, yaitu
menunjuk ke node sesudahnya.
• Node terakhir akan menunjuk ke NULL yang akan
digunakan sebagai kondisi berhenti pada saat pembacaan
isi linked list.
• ilustrasi single linked list yang memiliki 4 node :

A B C D NULL

FFF1 FFF2 FFF3 FFF4

9
Singly (Single) Linked List
• Ilustrasi singly linked list pada memori:

C A E D B

Head
• Node A
• Node A tidak ditunjuk oleh node manapun maka node ini
adalah node yang paling depan (node kepala).

10
Singly (Single) Linked List
• Ilustrasi singly linked list pada memori:

C A E D B

• Node E Ekor
• Node E tidak menunjuk ke node manapun sehingga
pointer dari node E adalah NULL.
• Dapat disimpulkan bahwa node ini adalah node yang
paling belakang (node ekor).

11
Implementasi: Linked List
• Sebuah list merupakan rantai dari object bertipe
ListNode yang berisikan data dan referensi
(pointer) kepada ListNode selanjutnya dalam list.
• Harus diketahui di mana letak elemen pertama!
ListNode

A0 A1 A2 A3

First/Head Last/Tail

12
ListNode: Definisi
struct ListNode{
int data;
ListNode *next;

};

atau
Penjelasan:
class ListNode{
Pembuatan class bernama ListNode yang
int data; berisi 2 field/variabel, yaitu data bertipe
ListNode *next; Object dan next yang bertipe class
ListNode.
}; Field element: digunakan untuk
menyimpan data/nilai pada linked list.
Field next: digunakan untuk menyimpan
alamat node berikutnya.

13
Catatan

• Yang disimpan dalam ListNode adalah reference


dari object-nya, BUKAN object-nya itu sendiri atau
salinan (clone) dari object-nya !!!

14
Pembentukan Obyek ListNode

• Deklarasi atau pembentukan obyek ListNode


Bentuknya adalah:
new ListNode;

15
ListNode Head/First

• Untuk mengingat node yg paling depan (node


kepala) digunakan sebuah ListNode yang akan
menyimpan alamat dari node depan.
• ListNode ini biasanya diberi nama head atau first.

Head/First Head/First

16
Contoh Program ListNode Head
int main() { Ilustrasi
ListNode *head = new ListNode;
} pointer

data

• Pengaksesan Field pada ListNode head


• Untuk mengakses field dari node menggunakan pointer
object ListNode kemudian diikuti dengan tanda -> (arrow)
• Contoh:
• Mengakses data dari head perintahnya: head->element;
• Mengakses pointer dari head perintahnya: head->next;
17
ListNode Tail/Last

• Untuk mengingat node yg paling belakang (node


ekor) digunakan sebuah ListNode yang akan
menyimpan alamat dari node paling belakang.
• ListNode ini biasanya diberi nama tail atau last.

Tail/Last Tail/Last

18
Operasi-Operasi pada Linked List
1. Inisialisasi
2. isEmpty()
3. size()
4. add()/append() (Penambahan)
5. insert() (Penyisipan)
6. remove() (Penghapusan)
7. Pengaksesan
8. Pencarian
19
1. Inisialisasi
• Proses ini digunakan untuk mendeklarasi sekaligus
memberikan nilai awal (inisialisasi) pada pointer
head dan tail → biasanya ditaruh di constructor.
• Nilai awal kedua pointer tersebut adalah NULL.
Yang menandakan bahwa linked list dalam kondisi
kosong (belum ada node yang terbentuk).
ListNode *head, *tail;

LinkedList() //bila nama class LinkedList


{
head=tail=NULL;
}
20
2. isEmpty()

• Digunakan untuk mengetahui Linked List dalam


kondisi kosong.
• Kondisi kosong: jika size = 0 atau jika head=tail=null.

bool is_empty()
{
return size==0; //atau return head = NULL;
}

21
3. size()
• Digunakan untuk mengetahui banyak node pada
linked list.
• Size bertambah 1 setiap ada node baru yang
ditambahkan pada linked list.
• Size berkurang 1 setiap ada penghapusan node.

int size()
{
return size;
}

22
4. Penambahan: add_first(x)

• Kondisi awal pada linked list


A B C D

current

• Menyisipkan X pada lokasi sebelum current (contoh:


head).
x A B C D

current
23
4. Penambahan: add_last(x)
• Kondisi awal pada linked list
A B C D

tail
• Menyisipkan X pada lokasi setelah tail

A B C D X

tail tail
24
4. Penambahan: add_last(x)
• Menyisipkan X pada lokasi setelah tail
// tail menyatakan node terakhir dalam linked list
tail.next = new ListNode;
tail = tail->next; // adjust tail
tail->element = x; // place x in the node
tail->next = null; // adjust next

A B C D X

tail tail
• bisa lebih singkat bila menggunakan constructor:
tail = tail->next = new ListNode (x, null);
25
5. Penyisipan: insert()
• Kondisi awal pada linked list
A B C D

current
• Menyisipkan X pada lokasi setelah current

A X B C D
X
current
26
5. Langkah-Langkah Menyisipkan

• Menyisipkan elemen baru setelah posisi current


// Membuat sebuah node
ListNode *tmp = new ListNode;
// meletakkan nilai x pada field element
tmp->element = x;
// node selanjutnya dari x adalah node b
tmp->next = current->next;
// node selanjutnya dari a adalah node x
current->next = tmp;

A B

X
current tmp
27
5. Langkah-langkah
menyisipkan yang lebih efisien
tmp = new ListNode (x, current->next);

A B

X
current
current->next = tmp;

A B

X
current
28
6. Penghapusan: remove()
• Proses menghapus dilakukan dengan mengabaikan elemen
yang hendak dihapus dengan cara melewati pointer
(reference) dari elemen tersebut langsung pada elemen
selanjutnya.
• Elemen x dihapus dengan meng-assign field next pada
elemen a dengan alamat b.
A x B

current
A B

current
29
6. Langkah-langkah menghapus
elemen
• Butuh menyimpan alamat node yang terletak
sebelum node yang akan dihapus. (pada gambar
node current, berisi elemen a)
current->next = current->next->next;

A x B

current

30
6. Langkah-langkah menghapus
elemen
A x B

current
• Tidak ada elemen lain yang menyimpan alamat
node x.
• Node x tidak bisa diakses lagi.
• Karena C++ tidak mengenal garbage collector maka
node x dihapus dengan dealokasi memori
delete x; atau free(x);
tergantung metode alokasi memori node
31
7. Pengaksesan
• Digunakan untuk mencetak data seluruh node
mulai dari yang paling depan sampai ketemu NULL.
void print()
{
ListNode *p = head; //bila menggunakan header, maka p=header->next
while (p != null) {
cout << p->element << " ";
p = p->next;
}
}

void print()
{
for (ListNode *p = head; p != NULL; p = p->next)
cout << p->data << " ";
}

32
Pertanyaan

• Selama ini contoh menyisipkan dan menghapus


elemen dengan asumsi ada node current yang
terletak sebelumnya.
• Bagaimana menambahkan node pada urutan pertama
pada linked list beserta implementasinya?
• Bagaimana menghapus elemen pertama pada linked list?

33
Header Node
• Menghapus dan menambahkan elemen pertama menjadi
kasus khusus.
• Dapat dihindari dengan menggunakan header node;
• Tidak berisikan data, digunakan untuk menjamin bahwa selalu ada
elemen sebelum elemen pertama yang sebenarnya pada linked list.
• Elemen pertama diperoleh dengan: current = header->next;
• Empty list jika: header->next == null;
• Proses pencarian dan pembacaan mengabaikan header
node.
A B C

header
34
Latihan
• Buatlah sebuah method untuk menghitung jumlah
elemen dalam sebuah linked list!
int list_size (LinkedList the_list)
{

38
Latihan
1. Buatlah program dari 4 node berikut dengan
kondisi awal linked list kosong:
100 200 300 400

• Tambahkan node baru dengan data 500 dari belakang.


Tambahkan node baru dengan data 50 dari depan.
Tambahkan node dengan data 250 setelah node 200.
• Hapus node depan. Selanjutnya hapus node belakang.
Selanjutnya hapus node yg memiliki data 300.
• Akses semua data dari seluruh node tersebut dari node yg
paling depan ke belakang.

56
Latihan (Lanjt)

2. Buat method-method untuk mengakses Linked


List melalui indeks.
• int indexOf(int theElement)
• void add(int theElement, int index)
• void remove(int index)
• int get(int index)
3. Buatlah method untuk replace data pada Singly
Linked List. Gunakan pengaksesan indeks pada
node.

57

Anda mungkin juga menyukai