Anda di halaman 1dari 35

STRUKTUR DATA

LINKED LIST

MULIA SULISTIYONO, M.Kom


muliasulistiyono@amikom.ac.id
Konsep Array

Array == Laci?

2
• Data disimpan dalam suatu struktur, sedemikian rupa sehingga
elemen-elemen di dalam struktur tersebut dapat diolah secara
kelompok ataupun secara individu.

• Sifat - sifat Array


– Homogen
Seluruh elemen di dalam struktur array mempunyai tipe data yang
sama.
– Random Access
Setiap elemen di dalam struktur array dapat dicapai secara individual,
langsung ke lokasi elemen yang diinginkan, tidak harus melalui elemen
pertama.
3
Syntax:
struct nama_struct {
tipe_data_1 nama_var_1;
tipe_data_2 nama_var_2;
tipe_data_3 nama_var_3;
……
};

4
• Sebuah array yang setiap data elemennya bertipe struct. Umumnya dipakai
untuk menyimpan object data yang terstruktur, misal: data mahasiswa,
karyawan, buku, barang, dsb.

5
Linked List == kereta????

Page 6 6
Apakah Linked List itu ?

• Elemen (disebut dengan CELL, atau SEL dalam bahasa


Indonesia) yang mungkin terletak terpisah-pisah di
memory, disambungkan dengan pointer.
• Tiap sel berisi dua informasi : nilai dan pointer ke sel
berikutnya nilai Pointer to next CELL

nilai Pointer to next CELL

nilai Pointer to next CELL

CELL
Mengapa memakai Linked List ?
1. Mudah untuk menambahkan dan menghapus elemen(pada array tidak mungkin
menambahkan elemen, karena banyaknya elemen sudah ditentukan dari awal)
2. Panjang list bisa diubah dengan bebas (panjang array fixed)
3. Mudah untuk menyambungkan beberapa list, maupun memutuskannya (array tidak
bisa)
4. Memungkinkan user mendesain struktur data yang kompleks
Struktur linked List
pHead
A B C

 Node (elemen) linked list saling berkait melalui pointer.


Bagian next sebuah node menunjuk alamat node selanjutnya
 pHead: pointer yang menunjuk node pertama
Struktur linked List
pHead
A B C

 Node terakhir menunjuk NULL


 Setiap node terdiri atas
 Isi data
 Next, yaitu pointer ke node selanjutnya pada list
Struktur Sebuah Node
struct node {
//bagian data
tipedata data 1;
tipedata data 2;

tipedata data n;
//pointer ke node selanjutnya
struct node *next;
};
typedef struct node node;
Array vs linked list
 Banyaknya anggota
 Banyaknya elemen array ditentukan di awal & jumlahnya tetap
 Elemen linked list dibuat di memori ketika dibutuhkan (ingat Alokasi
memory dinamis). Jumlahnya dinamis, dapat bertambah dan berkurang
sesuai keperluan

Cara mengakses elemen


 Elemen array diakses lewat indeks
 Untuk mengakses elemen linked list, harus dilakukan penelusuran
elemen list
Array vs Linked List

Array Linked List

Penambahan dan Tidak mungkin Mungkin


penghapusan
elemen
Panjang list Fixed Bisa diubah

Akses ke elemen cepat (harus mengikuti pointer satu


demi satu)
lambat
Array vs Linked List
header
1 a[0]
13
2 a[1]
address 13 address 18 address 24
3 a[2]
1 18 2 24 3
value value next value next
Pointer ke sel berikutnya
(next)
(NULL)
int a[3];
int n; Linked List
Array
Address tidak berurutan
Address tiap sel berurutan Akses ke tiap sel dimulai dari header
Cara menampilkan isi sel tertentu
• Pada array (misalnya nama array: a), isi sel tertentu dapat
ditampilkan dengan cara a[nomer urut sel keberapa].
Misalnya a[5] akan menampilkan isi sel ke-6. Hal ini karena
satu sel dengan sel yang lain terletak pada posisi yang
berurutan di memory.
• Pada linked list, kita tidak tahu secara langsung, sel itu
terletak dimana dalam memory.

Akses harus dilakukan satu persatu, urut mulai dari sel


terdepan
Cara menampilkan isi sel tertentu

Tampilkan isi (value) sel ke-3 !


address

header 37 38 40 52
37 4 38 2 40 13 52 40 NULL
Sel ke-1

pointer
Sel ke-1→ isi: value=4
address sel berikutnya=38
ILUSTRASI
• Pada bangsal sebuah rumah sakit terdapat 12 tempat
tidur. Sembilan di antaranya, telah ditempati pasien.
Kita hendak membuat list nama para pasien tersebut
diurut secara alfabetik. Untuk itu kita buat sebuah
linked list, dengan penuding NEXT.
• Variable START kita gunakan untuk menyatakan
lokasi pasien pertama dalam list. Jadi START berisi 5,
karena pasien pertama tersebut, yakni Adam,
menempati tempat tidur nomor 5.
• Selanjutnya penuding dari Adam bernilai 3, karena
pasien kedua dalam list adalah Deni, menempati
tempat tidur nomor 3, demikian seterusnya.
• Akhirnya, untuk pasien terakhir, Samuel, penudingnya
merupakan penuding nol (dinyatakan dengan
bilangan 0).
NULL POINTER
• Nilai yang dimiliki sebuah pointer adalah address pada
memory dimana data tersimpan
• Pointer yang tidak menunjuk ke address manapun disebut
dengan NULL pointer. Maksudnya, satu kondisi khusus
dimana pointer itu belum diset dengan sebuah address
tertentu
• Pada stdio.h biasanya didefinisikan dengan nilai 0
• Saat fungsi fopen,malloc dieksekusi, jika terdapat error,
maka nilai yang dikembalikan adalah NULL
Pada kuliah ini, NULL disimbolkan
dengan kotak yang diberi garis diagonal
Deklarasi head

Sebelum membuat linked list, perlu dideklarasikan dan


diinisialisasikan head, yaitu pointer yang menunjuk
node pertama dari linked list

node *pHead = NULL;


Potongan kode – linked list statis
1. Isi volts dan amps pada pm1, pm2 dan
pm3 dengan data sembarang
struct motor { 2. Isi pm1.next dengan alamat pm2, pm2.next
float volts; dengan alamat pm3, dan pm3.next dengan
NULL
float amps; 3. Tampilkan isi pm2 hanya dengan
menggunakan pointer pm1
struct motor *next; 4. Tampilkan isi pm3 hanya dengan
}; menggunakan pointer pm2
5. Tampilkan isi pm3 hanya dengan
menggunakan pointer pm1
typedef struct motor motor;

void main()
{
motor *pm1, *pm2, *pm3;
}
Operasi dasar linked list
1. Menambah sebuah node.
2. Menghapus sebuah node.
3. Mencari sebuah node.
4. List tranversal
Menambahkan node ke list kosong
Before: Code:
pNew 39 pNew -> next = pHead; // set link to NULL

pHead pHead = pNew;// point list to first node

pPre

After:
pNew 39

pHead

pPre
Menambahkan node ke awal list
Before: Code (same):
pNew -> next = pHead; // set link to NULL
pNew 39
pHead = pNew;// point list to first node

pHead 75 124

pPre

After:
pNew 39

pHead
75 124

pPre
Menambahkan node di tengah list

Before: Code
pNew -> next = pPre -> next;
pNew 64
pPre -> next = pNew;
55 124

pPre

After:
pNew 64

55 124

pPre
Menambahkan node akhir list

Before: Code
pNew -> next = NULL;
pNew 144
pPre -> next = pNew;
55 124

pPre

After:
pNew 144

55 124

pPre
Menambahkan node pada linked list
Terdapat empat tahap untuk menambah node linked list:
• Membuat node baru.
• Mendapatkan node yang terletak sebelum node baru disisipkan
(pPre)
• Atur next node baru agar menunjuk node sesudah posisi
penyisipan.
• Atur next pPre agar menunjuk node baru.
Kode untuk menambah data ke linked list
• Untuk menambah data pada linked list, harus diketahui head pointer (pHead), pointer yang menunjuk
node sebelum tempat penyisipan (pPre) data yang akan disisipkan (item).

//insert a node into a linked list


struct node *pNew;
pNew = (struct node *) malloc(sizeof(struct node));
pNew -> data = item;
if (pPre == NULL){
//add before first logical node or to an empty list
pNew -> next = pHead;
pHead = pNew;
}
else {
//add in the middle or at the end
pNew -> next = pPre -> next;
pPre -> next = pNew;
}
Menghapus node dari linked list

• Untuk menghapus sebuah node:


– Cari node yang akan dihapus (pCur) dan node pendahulunya
(pPre).
– Ubah pPre->next agar menunjuk pCur->next.
– Hapus pCur menggunakan fungsi free
Menghapus node pertama dari linked list

Before: Code:
pHead = pCur -> next;
pHead
free(pCur);
75 124

pPre pCur

After:

pHead Recycled 124

pPre pCur
Menghapus node dari linked list – kasus umum

Before: Code:
pPre -> next = pCur -> next;
75 96 124
free(pCur);

pPre pCur

After:

Recycled
75 124

pPre pCur
Kode untuk menghapus node dari linked list

• Untuk menghapus node dari linked list, harus diketahui head pointer (pHead), node yang
akan dihapus (pCur), serta pendahulunya,

//delete a node from a linked list


if (pPre == NULL)
//deletion is on the first node of the list
pHead = pCur -> next;
else
//deleting a node other than the first node of the list
pPre -> next = pCur -> next;
free(pCur).
Mencari node yang mengandung data tertentu dari
linked list
• Operasi insert dan delete membutuhkan pencarian pada list untuk menentukan posisi
penyisipan atau pointer yang menunjuk data yang akan dihapus

//search the nodes in a linked list


pPre = NULL;
pCur = pHead;
//search until the target value is found or the end of the list is reached
while (pCur != NULL && pCur -> data != target) {
pPre = pCur;
pCur = pCur -> next;
}
//determine if the target is found or ran off the end of the list
if (pCur != NULL)
found = 1;
else
found = 0;
Traversing a Linked List

• mengunjungi semua node yang ada pada list dari head sampai node terakhir
//traverse a linked list
Struct node *pWalker;
pWalker = pHead;
printf(“List contains:\n”);
while (pWalker != NULL){
printf(“%d ”, pWalker -> data);
pWalker = pWalker -> next;
}
Break…
Terima Kasih

Anda mungkin juga menyukai