Single Linear Linked List
Single Linear Linked List
LINKED LIST
Linked List adalah sejumlah obyek yang dikaitkan atau dihubungkan
satu dengan lainnya sehingga membentuk list (senarai). Obyek
tersebut merupakan gabungan beberapa elemen data (variabel) yang
dijadikan satu kelompok atau structure atau record (dibentuk
dengan perintah struct).
Contiguous List
Contiguous List merupakan List yang statis, seperti array satu
dimensi. Array satu dimensi merupakan kumpulam elemen‐elemen
yang alamatnya saling bersambung. Dengan int[5] maka disiapkan
array satu dimensi dengan 5 elemen.
Pengalokasian tempat dalam memory dengan cara array berdimensi
satu tersebut merupakan pengalokasian yang bersifat statis.
Pengalokasian ini dinamakan statis karena selama proses
berlangsung elemen array tidak dapat ditambah ataupun dikurangi.
Array ini adalah contiguous list, alamatnya disebut contiguous
(bersambung/bersisian)
Berikut bukti bahwa array alamatnya contiguous:
#include<stdio.h>
#include<conio.h>
main()
{
int A[5];
int I;
for(I=0;I<=5;I++)
printf("\n%X", &A[I]);
getch();
}
Widodo
1
Strukktur Dataa
Terlih hat bahw wa alamatt array yaang dibuat bersellisih sam a, yaitu 4 4.
LINKEED LIST
Linked d List dap
pat digam mbarkan n sebagai berikut
10
1
72
7
25
31
Pada ilustrasi di atas tterdapat 4 buah obyek ya ang meruupakan ssimpul
(nodee/vertex) yang dikaitkkan sattu deng gan lai nnya. Setiap
S
simpu ul/node tidak dib buat seccara bersamaan seperti array, namun
n
dibuat satu peersatu, se ehingga bbersifat ddinamis.
Akan dipelajarri 4 macaam strukttur linked list:
1. Lin near Singgle‐Linked List
2. Lin near Dou uble‐Linked List
3. Cirrcular Sin ngle‐Linkked List
4. Cirrcular Do ouble‐Linnked List
Widoodo
2
Struktur Data
1. Linear Single‐Linked List
First Link/Next Last
Info
25 10 31 72
‐ 1 ‐ ‐ 2 ‐ ‐ 3 ‐ ‐ 4 ‐
Keterangan:
Pada ilustrasi di atas terdapat 4 simpul yaitu simpul no 1, 2, 3, 4.
Setiap simpul terdapat 2 elemen, yaitu:
INFO yang berisi data yang disimpan (tipe data disesuaikan).
LINK atau NEXT merupakan pointer (tipe data pointer) yang
menunjuk alamat simpul berikutnya.
Simpul pertama ditunjuk oleh pointer First, simpul terakhir ditunjuk
oleh pointer Last.
Tahap pertama untuk pembuatan linked list adalah dengan
mendeklarasikan struktur yang akan digunakan:
typedef struct Node
{ int INFO;
struct Node *LINK;
};
typedef struct Node Simpul;
Simpul *P, *FIRST, *LAST;
atau
struct Simpul
{ int INFO;
struct Simpul *LINK;
};
Simpul *P, *FIRST, *LAST;
Inisialisasi
Inisialisasi merupakan kondisi awal yang menyatakan Linked List
belum ada, yaitu dengan mengisi pointer FIRST dengan NULL. Pointer
Widodo
3
Struktur Data
FIRST digunakan untuk menunjuk simpul awal, sehingga jika simpul
awal belum ada FIRST akan menunjuk NULL (belum menunjuk simpul
manapun).
Jadi instruksi inisialisasi adalah:
FIRST=NULL
Jika ditulis dalam fungsi:
void AWAL()
{ FIRST=NULL;
}
Pembuatan Sebuah Simpul
Instruksi untuk membuat sebuah simpul:
P=(Simpul *) malloc(sizeof(Simpul));
Artinya akan dialokasikan sebuah area yang ukurannya sebesar
jumlah byte yang digunakan struktur Simpul. Jika instruksi tersebut
berhasil, maka akan terbentuk sebuah simpul yang alamatnya
tersimpan dalam pointer P.
P
P
INFO LINK INFO LINK
Atau untuk menyingkat
Fungsi untuk membuat sebuah simpul:
void BUAT_SIMPUL(int X)
{ P = (Simpul *) malloc(sizaof(Simpul));
if(P!=NULL)
{
P->INFO=X;
}
else
printf(“Pembuatan simpul gagal”);
}
Widodo
4
Struktur Data
Perhatikan cara pemberian nama elemen:
P
INFO LINK
P‐>LINK
P‐>INFO
Pointer P memang dipersiapkan untuk menunjuk simpul yang akan
dibuat. P‐>INFO maupun P‐>LINK di atas, dinamakan demikian
karena memang simpul tersebut ditunjuk oleh pointer P.
Pembuatan Simpul Awal
Sebelum membuat sebuah simpul menjadi simpul awal, periksa dulu
isi pointer FIRST, jika isinya bukan NULL berarti pointer FIRST sudah
menunjuk sebuah simpul di Linked List.
void AWAL()
{ if(FIRST==NULL)
{
FIRST=P;
LAST=P;
P->LINK=NULL;
}
else
printf(“Linked List sudah ada”);
}
Ilustrasi prosesnya adalah sebagai berikut:
Misalkan sudah terbentuk sebuah simpul dan nilai INFO diisi 15.
15
#1100
#1100 15
P FIRST LAST X
Widodo
5
Struktur Data
atau
P
INFO LINK
15
Kemudian dengan perintah FIRST=P;
15
#1100
#1100 #1100 15
P FIRST LAST X
Atau
FIRST P
INFO LINK
15
Karena simpul ditunjuk oleh 2 buah pointer, maka nama elemennya
menjadi 2 pula:
P‐>INFO atau FIRST‐>INFO isinya 15, dan P‐>LINK atau FIRST‐>LINK
isinya belum diketahui.
Widodo
6
Struktur Data
Selanjutnya dengan perintah LAST=P;
15
#1100
#1100 #1100 #1100 15
P FIRST LAST X
Atau
LAST FIRST P
INFO LINK
15
Nama untuk tiap‐tiap elemennya pun bertambah 1 yaitu:
LAST‐>INFO dan LAST‐>LINK.
Terakhir dengan perintah P-LINK=NULL;
LAST FIRST P
INFO LINK
15
Karena baru punya satu simpul maka simpul ini dianggap juga
sebagai simpul terakhir dan Link‐nya harus NULL yang berarti belum
menunjuk pada simpul manapun.
Widodo
7
Struktur Data
Insert Kanan (Akhir)
Insert kanan adalah menambahkan simpul baru di sebelah kanan
atau setelah simpul terakhir yang sudah ada. Syaratnya sudah harus
ada Linked List dan simpul baru juga telah dibuat.
LAST FIRST P
INFO LINK INFO LINK
15 22
Kemudian disambung menjadi:
FIRST LAST P
INFO LINK INFO LINK
15 22
Fungsi untuk proses insert kanan dapat dibuat dengan:
void INSERT_KANAN()
{ if(LAST!=NULL)
{ LAST->LINK=P;
LAST=P;
P->LINK=NULL;
}
else
printf(“Linked List belum ada”);
}
Widodo
8
Struktur Data
Ilustrasi proses untuk insert kanan:
LAST->LINK=P;
Perintah ini menyebabkan terhubungnya simpul bau ke dalam Linked
List, karena LAST->LINK di arahkan untuk menunjuk alamat yang
ditunjuk oleh pointer P.
LAST FIRST P
INFO LINK INFO LINK
15 22
Untuk menghubungkan simpul lama dengan simpul baru digunakan
LAST->LINK=P; bukan FIRST->LINK=P; karena jika sudah lebih dari
1 simpul, misalnya ada 3 simpul maka sebenarnya posisi yang
terakhir akan terlihat LAST bukan FIRST.
LAST=P;
Perintah ini akan memindahkan pointer LAST agar menunjuk alamat
seperti yang ditunjuk oleh pointer P.
FIRST LAST P
INFO LINK INFO LINK
15 22
P->LINK=NULL;
Perintah ini akan mengisi Link simpul terakhir dengan NULL. Ini
menjadi perlu karena simpul terakhir harus tidak/belum menunjuk
alamat simpul manapun.
Widodo
9
Struktur Data
FIRST LAST P
INFO LINK INFO LINK
15 22
Insert Kiri (Awal)
Insert kanan adalah menambahkan simpul baru di sebelah kiri atau
sebelum simpul pertama yang sudah dibuat. Syaratnya sudah harus
ada Linked List dan simpul baru juga telah dibuat.
P FIRST LAST
INFO LINK INFO LINK INFO LINK
51 15 22
Fungsi untuk proses insert kiri dapat dibuat dengan:
void INSERT_KIRI()
{ if(FIRST!=NULL)
{ P->LINK=FIRST;
FIRST=P;
}
else
printf(“Linked List belum ada”);
}
Ilustrasi proses untuk insert kiri:
P->LINK=FIRST;
Perintah ini akan menghubungkan simpul baru ke simpul awal pada
Linked List.
Widodo
10
Struktur Data
P FIRST LAST
INFO LINK INFO LINK INFO LINK
51 15 22
FIRST=P;
Perintah ini akan menggeser pointer FIRST ke alamat yang ditunjuk
oleh pointer P dan menunjuk pada simpul awal yang baru.
FIRST P LAST
INFO LINK INFO LINK INFO LINK
51 15 22
Insert Tengah
Insert tengah adalah menambahkan simpul baru di antara dua buah
simpul pertama yang sudah ada.
P
INFO LINK
18
Q
INFO LINK INFO LINK
51 15
(7) (8)
Widodo
11
Struktur Data
Pada ilustrasi di atas, akan disisipkan sebuah simpul di antara simpul
ke‐7 dan simpul ke‐8. Syaratnya simpul no.7 (simpul sebelum posisi
simpul baru disisipkan) harus sudah ditunjuk oleh sebuah pointer,
misalnya pointer Q. Agar pointer Q dapat menunjuk simpul nomor 7,
maka dilakukan:
Q=FIRST;
for(I=1;I<=6;I++)
Q=Q->LINK;
Sedangkan untuk melakukan insert tengah:
void INSERT_TENGAH()
{ P->LINK=Q->LINK;
Q->LINK=P;
}
Ilustrasi proses untuk insert tengah:
P->LINK=Q->LINK;
Perintah ini akan menghubungkan simpul baru ke setelah simpul
baru tersebut.
P
INFO LINK
18
Q
INFO LINK INFO LINK
51 15
(7) (8)
Widodo
12
Struktur Data
Q->LINK=P;
Perintah ini akan menghubungkan simpul sebelumnya ke simpul baru
pada Linked List.
P
INFO LINK
18
Q (8)
INFO LINK INFO LINK
51 15
(7) (9)
Akibatnya simpul baru menjadi simpul nomor 8 dan simpul nomor 8
menjadi simpul nomor 9.
Delete Kiri (Awal)
Delete kiri adalah menghapus simpul paling kiri atau simpul awal.
Perintah untuk menghapus simpul di bahasa C adalah free().
FIRST LAST
INFO LINK INFO LINK INFO LINK INFO LINK
51 18 15 22
Dari ilustrasi di atas akan dihapus simpul palig kiri yang berisi:
FIRST‐>INFO=51.
Widodo
13
Struktur Data
Cara melakukan delete kiri adalah:
void DeleteKiri()
{ Q=FIRST;
FIRST=Q->LINK;
free(Q);
}
atau
void DeleteKiri()
{ Q=FIRST->LINK;
free(FIRST);
FIRST=Q;
}
Ilustrasi proses untuk delete kiri:
Q=FIRST;
Q FIRST LAST
INFO LINK INFO LINK INFO LINK INFO LINK
51 18 15 22
FIRST=Q->LINK;
Q FIRST LAST
INFO LINK INFO LINK INFO LINK INFO LINK
51 18 15 22
Widodo
14
Struktur Data
free(Q);
FIRST LAST
INFO LINK INFO LINK INFO LINK
18 15 22
Atau cara kedua:
Q=FIRST->LINK;
FIRST Q LAST
INFO LINK INFO LINK INFO LINK INFO LINK
51 18 15 22
free(FIRST);
FIRST Q LAST
INFO LINK INFO LINK INFO LINK
18 15 22
FIRST=Q;
FIRST Q LAST
INFO LINK INFO LINK INFO LINK
18 15 22
Widodo
15
Struktur Data
Delete Kanan (Akhir)
Delete kanan berarti akan menghapus simpul paling kanan (akhir).
FIRST Q LAST
INFO LINK INFO LINK INFO LINK INFO LINK
51 18 15 22
( 1 ) ( 2 ) ( 3 ) ( 4 )
Syarat bisa dilakukan delete kanan adalah simpul sebelum simpul
terakhir ditunjuk oleh pointer (misal pointer Q pada ilustrasi di atas).
Cara menempatkan pointer Q agar menunjuk simpul sebelum simpul
terakhir adalah:
Q=FIRST;
while(Q->LINK!=LAST)
{Q=Q->LINK;}
Sedangkan untuk melakukan delete kanan:
void DeleteKanan()
{ free(LAST);
LAST=Q;
LAST->LINK=NULL;
}
Ilustrasi proses untuk delete kanan:
free(LAST);
FIRST Q LAST
INFO LINK INFO LINK INFO LINK
51 18 15
Widodo
16
Struktur Data
LAST=Q;
FIRST LAST Q
INFO LINK INFO LINK INFO LINK
51 18 15
LAST->LINK=NULL;
FIRST LAST Q
INFO LINK INFO LINK INFO LINK
51 18 15
Delete Tengah
Delete tengah berarti menghapus sebuah simpul yang berada
diantara dua simpul lain.
Q
INFO LINK INFO LINK INFO LINK
51 18 15
( 7 ) ( 8 ) ( 9 )
Pada ilustrasi di atas akan dihapus simpul nomor 8. Syarat agar
simpul nomor 8 bisa dihapus, simpul sebelumnya harus sudah
ditunjuk oleh sebuah pointer (pada ilustrasi di atas ditunjuk oleh
pointer Q). Selain itu diperlukan satu lagi pointer pembantu (misal R).
Widodo
17
Struktur Data
Pointer Q akan menunjuk simpul nomor 7 dengan cara:
Q=FIRST;
for(I=1;I<=6;I++)
Q=Q->LINK;
Untuk menghapusnya dengan cara:
void DeleteTengah()
{ R=Q->LINK;
Q->LINK=R->LINK;
free(R);
}
Atau
Void DeleteTengah()
{ R=Q->LINK->LINK;
free(Q->LINK);
Q->LINK=R
}
Ilustrasi proses untuk delete kanan:
R=Q->LINK;
Q R
INFO LINK INFO LINK INFO LINK
51 18 15
( 7 ) ( 8 ) ( 9 )
Q->LINK=R->LINK;
Q R INFO LINK
INFO LINK 18 INFO LINK
51 15
( 7 ) ( 8 ) ( 9 )
Widodo
18
Struktur Data
free(R);
Q R
INFO LINK INFO LINK
51 15
( 7 ) ( 8 )
Atau dengan cara kedua:
R=Q->LINK->LINK;
Q R
INFO LINK INFO LINK INFO LINK
51 18 15
( 7 ) ( 8 ) ( 9 )
free(Q->LINK);
Q R
INFO LINK INFO LINK
51 15
( 7 ) ( 8 )
Widodo
19
Struktur Data
Q->LINK=R;
Q R
INFO LINK INFO LINK
51 15
( 7 ) ( 8 )
Contoh program insert kanan
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
main()
{
int I;
Widodo
20
Struktur Data
Inisialisasi();
scanf("%i",&X);
BUAT_SIMPUL(X);
AWAL();
for(I=1;I<=3;I++)
{ scanf("%i", &X);
BUAT_SIMPUL(X);
InsertKanan();
}
getch();
}
void Inisialisasi()
{ FIRST=NULL;
LAST=NULL;
}
void BUAT_SIMPUL(int X)
{ P=(Simpul *) malloc(sizeof(Simpul));
if(P!=NULL) {
P->INFO=X;
}
else
printf("Pembuatan Simpul Gagal");
}
void AWAL()
{
if(FIRST==NULL)
{ FIRST=P;
LAST=P;
P->LINK=NULL;
}
else
printf("Linked List Sudah Ada");
}
void InsertKanan()
{
if(LAST!=NULL)
{ LAST->LINK=P;
LAST=P;
P->LINK=NULL;
}
else
printf("Linked List belum ada");
}
Widodo
21
Struktur Data
2.
3.
Widodo
22