Anda di halaman 1dari 39

Linked List

Struktur Data

nur.zahrati@polibatam.ac.id
 Definisi linked list
 Konsep linked list
 Jenis struktur linked list
 Operasi pada linked list
Overview  Inisialisasi
 Membuat simpul baru
 Insert
 Delete
 sejumlah objek (sering disebut simpul) yang
dihubungkan satu dengan lainnya sehingga
membentuk rangkaian
 Objek : structure atau record.
 Untuk menghubungkan objek satu dengan
Definisi lainnya digunakan pointer.
 Secara konseptual, linked list merupakan deretan
elemen yang berdampingan
 Pada kenyataannya, karena elemen dialokasikan
secara dinamis, elemen linked list sebenarnya
terpencar-pencar di memory
Linked List di  Pointer dari elemen ke elemen menjamin semua
Memory elemen dapat diakses
Aspek Array Linked List
Alokasi memory Statis Dinamis
Penambahan dan Terbatas Tidak terbatas
Jadi, apa penghapusan
bedanya data
dengan array? Akses Random Sekuensial
Penghapusan Tidak bisa Bisa dihapus
(selama program dihapus
berjalan)
 Ada 4 macam struktur Linked List
1. Linear Singly-Linked List
2. Linear Doubly-Linked List
Struktur 3. Circular Singly-Linked List
4. Circular Doubly-Linked List
 Merupakan Linked List lurus dengan pointer
tunggal.

Linear Singly-
Linked List HEAD TAIL

25 12 17 10

7
 Simpul  elemen penyusun linked list
 berupa struktur berisi data dan pointer

data next
Representasi
Simpul (Node) Nama field: next
Tipe: pointer simpul
Isi: alamat simpul berikutnya
Nama field: data
Tipe: sesuai tipe data yang hendak disimpan
Isi: data
data next

Representasi typedef struct Node{


Simpul int data;
struct Node *next;
};
typedef struct Node Simpul;
 INISIALISASI  persiapan pembuatan linked
list
 MEMBUAT SIMPUL AWAL  membuat suatu
simpul menjadi elemen pertama linked list
 INSERT  menambahkan simpul baru ke
Operasi pada linked list
 Insert Depan
Linked List  Insert Belakang
 Insert Tengah
 DELETE  menghapus simpul dari linked list
 Delete Depan
 Delete Belakang
 Delete Tengah
 Untuk mempermudah penjelasan, digunakan variabel-
variabel global sebagai berikut.

Simpul *P, *HEAD, *TAIL;


Operasi pada P : pointer simpul untuk membantu
Linked List pembuatan simpul baru
 HEAD : pointer simpul yang menunjuk simpul
pertama linked list
 TAIL : pointer simpul yang menunjuk simpul terakhir
linked list
 Membuat kondisi awal yang menyatakan
linked list belum ada
 Mengisi nilai HEAD dengan NULL
Inisialisasi
HEAD = NULL;

HEAD
 Mengalokasikan suatu tempat di memory
untuk simpul baru
 Ada kemungkinan alokasi memory gagal
Membuat karena tidak cukup ruang memory
Simpul Baru
 Kondisi awal: simpul baru belum ada
 Kondisi akhir: (jika berhasil) simpul baru telah
dialokasikan di memory, diisi dengan data
Kondisi Awal Kondisi Akhir

P
Membuat
Simpul Baru 7
Simpul baru belum ada
di memory
void buatSimpul(int X)
{
P = (Simpul *) malloc(sizeof(Simpul));
if (P != NULL)
Membuat {
Simpul Baru P->data = X;
} else
printf("Pembuatan simpul gagal. \n");
}
Menjadikan simpul yang dibuat oleh fungsi pertama menjadi
simpul awal

Kondisi Awal Kondisi Akhir


Membuat
Simpul Awal P HEAD
TAIL
7 P

7
void awal()
{
if (HEAD == NULL)
{
Membuat HEAD = P;
TAIL = P;
Simpul Awal P->next = NULL;
}
else
printf("Linked List sudah ada");
}
HEAD = P;
TAIL = P;
P->next = NULL;

Membuat
Simpul Awal HEAD
TAIL
P

7
 Menambahkan simpul baru di ujung paling
Insert belakang (akhir)
Belakang  Sebelumnya telah dibuat simpul baru yang
hendak ditambahkan
Kondisi Awal Kondisi Akhir

HEAD TAIL
HEAD TAIL
Insert
Belakang
7
7 3
simpul baru
P
3
void insertBelakang()
{
TAIL->next = P;
Insert
TAIL = P;
Belakang
P->next = NULL;
}
TAIL->next = P;
TAIL = P;
P->next = NULL;

Insert
TAIL
Belakang HEAD
P

7 3
simpul baru
 Menambahkan simpul baru ke ujung paling
Insert Depan depan
 Simpul baru telah dibuat
Kondisi Awal Kondisi Akhir

HEAD TAIL
HEAD TAIL
Insert Depan
7
3 7
simpul baru
P
3
void insertDepan()
{
if (HEAD != NULL)
{
P->next = HEAD;
Insert Depan HEAD = P;
}
else
printf("Linked list belum ada");
}
 Menambahkan sebuah simpul baru di antara
dua buah simpul yang telah ada
Insert Tengah  Insert setelah simpul tertentu
 Insert sebelum simpul tertentu
Menambahkan simpul baru setelah simpul yang berisi data
tertentu, misal 3

Kondisi Awal Kondisi Akhir

P simpul baru
Insert Setelah 5
X HEAD HEAD TAIL
TAIL

3 7 3 5 7
void insertSetelah(int x)
{
Simpul *Q;
Q = HEAD;
Insert Setelah do
X Q = Q->next;
while (Q->data != x);
P->next = Q->next;
Q->next = P;
}
Menambahkan simpul baru sebelum simpul yang berisi data
tertentu, misal 5

Kondisi Awal Kondisi Akhir


HEAD
P simpul baru
Insert Sebelum 2
X
3 2 5
HEAD TAIL

TAIL 7
3 5 7
void insertSebelum(int x)
{
Simpul *Q, *sebelumQ;
if (HEAD->data == x)
insertDepan();
else
{
Insert Sebelum Q = HEAD;
do{
X sebelumQ = Q;
Q = Q->next;}
while (Q->data != x);
P->next = Q;
sebelumQ->next = P;
}
}
 Menghapus simpul yang ada di ujung paling
depan
 Dengan instruksi: free(namapointer)  simpul
Delete Depan dan semua isinya akan terhapus
 Menggunakan pointer pembantu untuk
menunjuk simpul yang hendak dihapus
Kondisi Awal Kondisi Akhir

Delete Depan HEAD TAIL HEAD TAIL

3 7 10 7 10
void deleteDepan()
{
Simpul *Q;
Delete Depan Q = HEAD;
HEAD = Q->next;
free(Q);
}
 Menghapus simpul yang ada di ujung paling
belakang
Delete
 Simpul yang berada tepat sebelum paling
Belakang belakang harus sudah ditunjuk oleh sebuah
pointer pembantu
Kondisi Awal Kondisi Akhir

Delete HEAD TAIL HEAD TAIL


Belakang

3 7 10 3 7
void deleteBelakang()
{
Simpul *Q;
Q = HEAD;
Delete while(Q->next != TAIL)
Belakang Q = Q->next;
free(TAIL);
TAIL = Q;
Q->next = NULL;
}
 Menghapus simpul yang berisi data X
 Bisa berada di depan, tengah, atau belakang
Delete Simpul  Perlu dua variabel pointer pembantu:
Q : pointer untuk menunjuk simpul berisi
Tertentu data X yang hendak dihapus
 sebelumQ : pointer yang menunjuk simpul
sebelum simpul Q, berguna untuk
menyambungkan kembali linked list jika Q dihapus
Kondisi Awal Kondisi Akhir

Delete Simpul HEAD TAIL HEAD TAIL


7

3 7 10 3 10
void deleteSimpul(int x)
{
Simpul *Q, *sebelumQ;
if (HEAD == NULL)
printf("Linked list kosong\n");
else if (HEAD->data == x){
deleteDepan();
} else
Delete Simpul {
Q = HEAD;
X do {
sebelumQ = Q;
Q = Q->next;
} while (Q->data != x);
sebelumQ->next = Q->next;
free(Q);
}
}

Anda mungkin juga menyukai