Linked List Implementation/Coding Issues in C

Download Report

Transcript Linked List Implementation/Coding Issues in C

Algoritma dan Struktur Data
Pertemuan 7
Linked List
Definitions
 Linked List
 Struktur data yang terdiri atas sekumpulan
data bertipe sama
 Memperhatikan urutan
 Array
 Struktur data yang terdiri atas sekumpulan
data bertipe sama
 Memperhatikan urutan
 Apa perbedaannya?
Array vs linked list
 Banyaknya anggota
 Banyaknya elemen array ditentukan di awal &
jumlahnya tetap
 Elemen linked list dibuat di memori ketika
dibutuhkan (ingat pertemuan 6). 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
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;
Deklarasi head
Sebelum membuat linked list, perlu dideklarasikan
dan diinisialisasikan head, yaitu pointer yang
menunjuk node pertama dari linked list
node *pHead = NULL;
Operasi dasar linked list
1.
2.
3.
4.
Menambah sebuah node.
Menghapus sebuah node.
Mencari sebuah node.
List tranversal
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.
Nilai (pPre) dapat berisi :
• it can contain the address of a node (i.e. you are adding
somewhere after the first node – in the middle or at the end)
• it can be NULL (i.e. you are adding either to an empty list or at
the beginning of the list)
Menambahkan node ke list kosong
Before:
pNew
Code:
pNew -> next = pHead; // set link to NULL
39
pHead = pNew;// point list to first node
pHead
pPre
After:
pNew
pHead
pPre
39
Menambahkan node ke awal list
Before:
Code (same):
pNew -> next = pHead; // set link to NULL
pNew
pHead = pNew;// point list to first node
39
pHead
75
124
pPre
After:
pNew
39
pHead
75
pPre
124
Menambahkan node di tengah list
Before:
Code
pNew -> next = pPre -> next;
pNew
pPre -> next = pNew;
64
55
124
pPre
After:
pNew
64
55
pPre
124
Menambahkan node akhir list
Before:
Code
pNew -> next = NULL;
pNew
pPre -> next = pNew;
144
55
124
pPre
After:
pNew
144
55
pPre
124
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
pendahulunya (pPre).
dihapus
(pCur)
– Ubah pPre->next agar menunjuk pCur->next.
– Hapus pCur menggunakan fungsi free
dan
node
Menghapus node pertama dari linked list
Before:
Code:
pHead = pCur -> next;
free(pCur);
pHead
75
124
pCur
pPre
After:
pHead
pPre
Recycled
pCur
124
Menghapus node dari linked list – kasus umum
Before:
Code:
75
96
pPre -> next = pCur -> next;
free(pCur);
124
pCur
pPre
After:
Recycled
75
pPre
pCur
124
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;
}
Tugas
Coba & Pelajari source code pertemuan7.cpp