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
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
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
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
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
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
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
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);
}
}