Semua Linked List baik Singly maupun Doubly selalu berisi pointer NULL yaitu pointer Next simpul terakhir dari Singly Linked List dan pointer kiri simpul pertama dan pointer kanan simpul terakhir Doubly Linked List. Dengan demikian untuk membaca isi Linked List selalu dilakukan dari simpul pertama ke kanan. Ada kalanya kita membaca isi Linked List mulai dari posisi tertentu tanpa harus mundur dan kembali ke posisi semula. Maka untuk itu kita buat dengan Linked List Melingkar (Circular Linked List).
Circular Linked List dapat dilakukan terhadap Singly Linked List maupun Doubly Linked List. Dalam Circular Linked List tidak terdapat suatu simpul yang bernilai NULL. Hal ini terjadi karena simpul terakhir dihubungkan terhadap simpul pertama untuk Singly Linked List dan simpul pertama dengan simpul terakhir saling terhubung untuk Doubly Linked List. Semua simpul berhak diperlakukan sebagai simpul depan.
1. Circular Singly Linked List
Hampir sama dengan Singly Linked List, hanya saja simpul terakhir akan dihubungkan ke simpul pertama sehingga berbentuk melingkar. Pendeklarasian dan operasi yang ada di Singly Linked List juga berlaku di Circular Singly Linked List, yang perlu dijaga adalah bahwa simpul terakhir harus selalu terhubung ke simpul pertama yang ditunjuk oleh CL seperti pada Gambar 1.
1.
1.1. Penyisipan simpul
Penyisipan simpul adalah operasi menyisipkan suatu simpul baru ke dalam suatu Linked List. Operasi penyisipan dapat dilakukan di posisi depan, posisi belakang, atau di posisi tengah.
- a. Penyisipan simpul depan
Simpul yang disisipkan selalu berada di posisi depan dari Linked List (CL). Misalkan kita memiliki suatu Linked List CL dengan empat simpul di mana masing-masing berisi informasi A, B, C, dan D, dan kita juga memiliki suatu simpul baru yang berisi informasi E yang akan disisipkan di posisi depan dari Linked List CL. Langkah-langkah penyisipan simpul baru dapat dilakukan sebagai berikut :
- Jika Linked List CL belum ada maka simpul baru menjadi awal Linked List CL (CL = Baru).
- Jika Linked List CL sudah ada maka penyisipan dilakukan:
- Pointer bantu menunjuk CL (Bantu = CL).
- Gerakkan bantu hingga ke simpul belakang (while(Bantu->Kanan != CL) Bantu = Bantu->Kanan).
- Kanan baru menunjuk CL (Baru->Kanan = CL).
- Kanan bantu menunjuk baru (Bantu->Kanan = Baru).
- Pindahkan CL ke simpul yang ditunjuk oleh baru (CL = Baru).
- void Sisip_Depan(simpul &CL, char elemen)
- {
- simpul bantu, baru;
- baru = (simpul) malloc(sizeof(simpul));
- baru->Isi = elemen;
- baru->kanan = baru;
- if(CL == NULL)
- CL=baru;
- else
- {
- bantu = CL;
- while(bantu->kanan != CL) bantu=bantu->kanan;
- baru->kanan = CL;
- bantu->kanan = baru;
- CL = baru;
- }
- }
b. Penyisipan simpul belakang
Penyisipan belakang sebenarnya hampir sama dengan penyisipan depan. Yang membedakan hanyalah pemindahan CL ke simpul yang ditunjuk oleh baru untuk penyisipan belakang tidak ada. Walaupun dalam penyisipan depan juga tidak harus dilakukan pemindahan CL, karena dalam Circular semua simpul berhak menjadi depan.
Misalkan kita memiliki suatu Linked List CL dengan empat simpul dimana masing-masing berisi informasi A, B, C, dan D, dan kita juga memiliki suatu simpul baru yang berisi informasi E yang akan disisipkan di posisi belakang dari Linked List CL. Langkah-langkah penyisipan simpul baru dapat dilakukan sebagai berikut:
- Jika Linked List CL belum ada maka simpul baru menjadi awal Linked List CL (CL = Baru).
- Jika Linked List CL sudah ada maka penyisipan dilakukan.
- Pointer bantu menunjuk CL (Bantu = CL).
- Gerakkan bantu hingga ke simpul belakang (while(Bantu->Kanan != CL) Bantu = Bantu->Kanan).
- Pointer kanan bantu menunjuk baru (Bantu->Kanan = Baru).
- Pointer kanan baru menunjuk CL (Baru->Kanan = CL).
- void Sisip_Belakang(simpul &CL, char elemen)
- {
- simpul bantu, baru;
- baru = (simpul) malloc(sizeof(simpul));
- baru->Isi = elemen;
- baru->kanan = baru;
- if(CL == NULL)
- CL=baru;
- else
- {
- bantu = CL;
- while(bantu->kanan != CL) bantu=bantu->kanan;
- baru->kanan = CL;
- bantu->kanan = baru;
- }
- }
c. Penyisipan simpul tengah
Dalam melakukan penyisipan simpul tengah, maka Linked List harus dijamin tidak boleh kosong. Penyisipan tengah dapat dilakukan pada sebelum atau setelah simpul tertentu. Yang akan dilakukan di sini adalah hanya penyisipan simpul setelah simpul tertentu. Penyisipan tengah dapat dilakukan dengan menggunakan pointer bantu atau tanpa menggunakan pointer bantu. Jika tidak menggunakan pointer bantu maka, yang harus digerakkan adalah CL dan CL dapat dikembalikan ke simpul semula ataupun tidak dikembalikan (karena prinsip semua simpul berhak menjadi simpul depan). Yang dilakukan di sini adalah juga dengan menggunakan pointer bantu.
Misalkan kita memiliki suatu Circular Linked List yang terdiri dari 4 simpul dan masing-masing simpul berisi informasi A, B, C, dan D. Kita juga memiliki simpul baru yang berisi informasi ‘X’. Simpul baru akan disisipkan setelah simpul yang berisi informasi ‘C’. Adapun langkah-langkah penyisipan tengah tersebut adalah sebagai berikut:
- Pointer bantu menunjuk simpul depan (Bantu = CL).
- Gerakkan pointer bantu hingga simpul yang berisi informasi ‘C’ (while(Bantu->Isi !=’C’) Bantu = Bantu->Kanan).
- Pointer kanan baru menunjuk kanan bantu (Baru->Kanan = Bantu->Kanan).
- Pointer kanan bantu menunjuk baru (Bantu->Kanan = Baru).
Gambar 4. Penyisipan Simpul Tengah pada Circular Singly Linked List
Fungsi penyisipan simpul tengah dengan mengikuti langkah-langkah dan gambar 4 di atas dapat dilihat berikut ini.
Source Code Penyisipan Simpul Tengah
- void Sisip_Tengah(simpul &CL, char elemen1, char elemen2)
- {
- simpul bantu, baru;
- baru = (simpul) malloc(sizeof(simpul));
- baru->Isi = elemen1;
- baru->kanan = baru;
- if(CL == NULL)
- cout<<"List Kosong ............."<<endl;
- else
- {
- bantu = CL;
- while(bantu->Isi != elemen2) bantu=bantu->kanan;
- baru->kanan = bantu->kanan;
- bantu->kanan = baru;
- }
- }
1.2. Penghapusan Simpul
Yang dimaksud dengan penghapusan simpul adalah operasi penghapusan simpul dari Linked List. Jika kita akan melakukan penghapusan simpul maka pastikan bahwa Linked List tidak boleh kosong. Penghapusan pada Circular Singly Linked List juga dapat dilakukan pada simpul yang berada di posisi depan, posisi tengah, maupun yang berada pada posisi belakang.
a. Penghapusan simpul depan
Menghapus simpul yang ada pada posisi depan. Langkah-langkah penghapusan simpul pada posisi depan adalah sebagai berikut:
- Simpul depan yang ditunjuk oleh CL ditunjuk juga oleh pointer bantu (Bantu = CL).
- Gerakkan pointer bantu hingga simpul belakang (while(Bantu->Kanan != CL) Bantu = Bantu->Kanan).
- Simpul depan yang ditunjuk oleh CL juga ditunjuk oleh hapus (Hapus = CL).
- Pindahkan pointer CL ke simpul berikutnya (CL = CL->Kanan).
- Pointer kanan dari bantu menunjuk CL (Bantu->Kanan = CL).
- Pointer kanan hapus menunjuk hapus (Hapus->Kanan = Hapus).
Gambar 5. Penghapusan Simpul Depan Pada Circular Singly Linked List
Fungsi penghapusan simpul depan dengan mengikuti langkah-langkah dan gambar 5 di atas dapat dilihat berikut ini.
Source Code Penghapusan Simpul Depan
- void Hapus_Depan(simpul &CL)
- {
- simpul bantu, Hapus;
- if(CL == NULL)
- cout<<"Linked List Kosong ............";
- else
- {
- bantu = CL;
- while(bantu->kanan != CL) bantu=bantu->kanan;
- Hapus = CL;
- CL = CL->kanan;
- bantu->kanan = CL;
- Hapus->kanan = Hapus;
- free(Hapus);
- }
- }
b. Penghapusan simpul belakang
Menghapus simpul yang ada pada posisi belakang. Langkah-langkah penghapusan simpul pada posisi belakang adalah sebagai berikut:
- Simpul depan yang ditunjuk oleh CL ditunjuk juga oleh pointer bantu (Bantu = CL).
- Gerakkan pointer bantu hingga satu simpul sebelum simpul belakang (while(Bantu->Kanan->Kanan != CL) Bantu = Bantu->Kanan).
- Simpul belakang ditunjuk oleh pointer hapus (Hapus = Bantu->Kanan).
- Pointer kanan dari bantu menunjuk CL (Bantu->Kanan = CL).
- Pointer kanan hapus menunjuk hapus (Hapus->Kanan = Hapus).
Skema penghapusan simpul belakang dapat dilihat pada Gambar 6.
Gambar 6. Penghapusan Simpul Belakang pada Circular Singly Linked List
Fungsi penghapusan simpul belakang dengan mengikuti langkah-langkah dan gambar 6 di atas dapat dilihat berikut ini.
Source Code Penghapusan Simpul Belakang
- void Hapus_Belakang(simpul &CL)
- {
- simpul hapus, bantu;
- if(CL==NULL)
- cout<<"Linked List Kosong ..............";
- else
- {
- bantu = CL;
- while(bantu->kanan->kanan != CL) bantu= bantu->kanan;
- hapus = bantu->kanan;
- bantu->kanan = CL;
- hapus->kanan = hapus;
- free(hapus);
- }
- }
c. Penghapusan simpul tengah
Yang dimaksud dengan penghapusan simpul tengah adalah menghapus simpul tertentu yang ada pada posisi tengah. Misalkan kita memiliki suatu Circular Singly Linked List yang terdiri dari 5 simpul dan masing-masing simpul berisi informasi A, B, C, D, dan E. Kita akan menghapus simpul yang berada di posisi tengah, yaitu simpul yang berisi informasi D. Adapun langkah-langkah penghapusan tengah tersebut adalah sebagai berikut:
- Simpul depan yang ditunjuk oleh CL ditunjuk juga oleh pointer bantu (Bantu = CL).
- Gerakan pointer bantu hingga satu simpul sebelum simpul yang akan dihapus (while(Bantu->Kanan->Isi != ‘D’) Bantu = Bantu->Kanan).
- Simpul berikutnya ditunjuk pointer hapus (Hapus = Bantu->Kanan).
- Pointer kanan dari bantu menunjuk kanan hapus (Bantu->Kanan = Hapus->Kanan).
- Pointer kanan hapus menunjuk hapus (Hapus->Kanan = Hapus).
Gambar 7. Penghapusan Simpul Tengah pada Circular Singly Linked List
Fungsi penghapusan simpul tengah dengan mengikuti langkah-langkah dan gambar 7 di atas dapat dilihat berikut ini.
Source Code Penghapusan Simpul Tengah
- void Hapus_Tengah(simpul &CL, char elemen)
- {
- simpul hapus, bantu;
- if(CL == NULL)
- cout<<"Linked List Kosong ...............";
- else
- {
- bantu = CL;
- while(bantu->kanan->Isi != elemen)bantu=bantu->kanan;
- hapus = bantu->kanan;
- bantu->kanan = hapus->kanan;
- hapus->kanan = hapus;
- free(hapus);
- }
- }
2. Circular Doubly Linked List
Circular Doubly Linked List adalah sederetan elemen yang saling berhubungan satu dengan yang lain, dimana pointer kiri simpul pertama menunjuk simpul terakhir dan pointer kanan simpul terakhi menunjuk simpul pertama. Semua simpul berhak menjadi simpul pertama. Jika suatu simpul dibuat menjadi simpul depan maka simpul yang ada di sebelah kiri merupakan simpul belakang.
Pendeklarasian simpul untuk Circular Doubly Linked List sama dengan pendeklarasian pada Doubly Linked List. Operasi yang ada pada Doubly Linked List juga berlaku pada Circular Doubly Linked List, hanya saja pada Circular tidak mengandung NULL, perhatikan gambar 8.
Gambar 8. Circular Doubly Linked List dengan 3 Simpul
2.1. Operasi pada Circular Doubly Linked List
Operasi pada Circular Doubly Linked List juga dapat dilakukan penyisipan dan penghapusan simpul.
a. Operasi Penyisipan Simpul
Operasi penyisipan simpul ke suatu Linked List juga ada tiga, yaitu penyisipan simpul di depan, penyisipan simpul di belakang, dan penyisipan simpul di tengah. Karena semua simpul berhak menjadi simpul depan maka pointer penunjuk Linked List (CDL) dapat digerakkan ke seluruh simpul pada Linked List. Tetapi supaya kita tetap mempertahankan simpul yang ditunjuk CDL merupakan simpul depan maka kita dapat menggunakan suatu pointer bantu. Pointer bantu dapat digerakkan ke semua simpul pada Linked List. Di sini, simpul yang ditunjuk oleh CDL pertama sekali akan tetap dipertahankan sebagai simpul pertama atau simpul depan.
1. Penyisipan simpul depan
Langkah-langkah penyisipan simpul depan dapat dilakukan seperti berikut ini:
- Jika Linked List belum ada (NULL) maka simpul baru menjadi awal Linked List (CDL = Baru).
- Jika Linked List sudah ada maka penyisipan dilakukan dengan:
- Pointer kanan simpul baru menunjuk CDL (Baru->Kanan = CDL).
- Pointer kiri simpul baru menunjuk yang ditunjuk pointer kiri CDL (Baru->Kiri = CDL->Kiri).
- Pointer kanan dari simpul yang ditunjuk pointer kiri CDL menunjuk simpul baru (CDL->Kiri->Kanan = Baru).
- Pointer kiri CDL menunjuk simpul baru (CDL->Kiri = Baru).
- Pointer CDL menunjuk simpul baru (CDL = Baru).
Misalkan kita memiliki Linked List yang terdiri dari tiga simpul dengan berisi masing-masing informasi A, B, dan C. Juga memiliki suatu simpul baru yang berisi informasi D. Simpul baru yang akan disisipkan di bagian depan Linked List. Skema penyisipan simpul depan dapat dilihat pada Gambar 9.
Gambar 9. Penyisipan Simpul Depan pada Circular Doubly Linked List
Fungsi penyisipan simpul depan dengan mengikuti langkah-langkah dan gambar 9 di atas dapat dilihat berikut ini.
Source Code Penyisipan Simpul Depan
- void Sisip_Depan(simpul &CDL, char elemen)
- {
- simpul baru;
- baru = (simpul) malloc(sizeof(simpul));
- baru->Isi = elemen;
- baru->kanan = baru;
- baru->kiri = baru;
- if(CDL == NULL) CDL=baru;
- else
- {
- baru->kanan = CDL;
- baru->kiri = CDL->kiri;
- CDL->kiri->kanan = baru;
- CDL->kiri = baru;
- }
- }
2. Penyisipan simpul belakang
Langkah-langkah penyisipan simpul baru pada Linked List di posisi belakang dapat dilakukan seperti berikut ini :
- Jika Linked List belum ada (NULL) maka simpul baru menjadi awal Linked List (CDL = Baru).
- Jika Linked List sudah ada maka penyisipan dilakukan dengan:
- Pointer kanan simpul baru menunjuk CDL (Baru->Kanan =CDL).
- Pointer kiri simpul baru menunjuk yang ditunjuk pointer kiri CDL (Baru->Kiri = CDL->Kiri).
- Pointer kanan dari simpul yang ditunjuk pointer Kiri CDL menunjuk simpul baru (CDL->Kiri->Kanan = Baru).
- Pointer kiri CDL menunjuk simpul baru (CDL->Kiri = Baru).
Single Linked List ( Non Circular)
KONSEP POINTER DAN LINKED LIST
Untuk mengolah data yang banyaknya tidak bisa ditentukan sebelumnya, maka disediakan satu fasilitas yang memungkinan untuk menggunakan suatu perubah yang disebut dengan perubah dinamis (Dinamic variable)Perubah Dinamis (Dinamic variable)
Suatu perubah yang akan dialokasikan hanya pada saat diperlukan, yaitu setelah program dieksekusi.
Perbedaan Perubah Statis & Dinamis
Pada perubah statis, isi Memory pada lokasi tertentu (nilai perubah) adalah data sesungguhnya yang akan diolah. Pada perubah dinamis, nilai perubah adalah alamat lokasi lain yang menyimpan data sesungguhnya. Dengan demikian data yang sesungguhnya dapat dimasukkan secara langsung.
Dalam hal cara pemasukkan data dapat diilustrasikan seperti dibawah ini.
Pointer digunakan sebagai penunjuk ke suatu alamat memori
Dalam pemrograman C++, Type Data Pointer
dideklarasikan dengan bentuk umum :
Type Data * Nama Variabel;
Type Data dapat berupa sembarang type data, misalnya char, int atau float. Sedangkan Nama veriabel merupakan nama variabel pointer.
Contoh penggunaan pointer dalam program C++:
Void main()
{
int x,y,*z;
x = 75; //nilai x = 75
y = x; //nilai y diambil dari nilai x
z = &x; //nilai z menunjuk kealamat pointer dari nilai x
getch();
}
LINKED LIST (LINKED LIST)
Salah satu Struktur Data Dinamis yang paling sederhana adalah Linked List atau Struktur Berkait atau Senarai Berantai, yaitu suatu kumpulan komponen yang disusun secara berurutan dengan bantuan Pointer.
Linked List (Senarai Berantai) disebut juga dengan Senarai Satu Arah (One-Way List). Masing-masing komponen dinamakan dengan Simpul (Node)
Linked List juga mengandung sebuah variable petunjuk list, yang biasanya diberi nama
Start (Awal), yang berisi alamat dari simpul pertama dalam list.
Bentuk Node Single Linked List non Circular
Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data.
Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list.
Pembuatan Single Linked List non Circular
Keterangan : Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data bertipe integer dan field next yang bertipe pointer dari TNode.
Fungsi Inisialisasi Single Linked List
Function untuk mengetahui kondisi Single Linked List
Menambah Node di Depan
- Penambahan node baru akan dikaitan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan dengan cara: node head ditunjukkan ke node baru tersebut.
- Prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.
void insertDepan(int databaru)
{
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1)
{
head=baru;
head->next = NULL;
}
else
{
baru->next = head;
head = baru;
}
printf(”Data masuk\n”);
}
Menambah Node di Belakang
- Penambahan data dilakukan di belakang, namun pada saat pertama kali, node langsung ditunjuk oleh head.
- Penambahan di belakang membutuhkan pointer bantu untuk mengetahui node terbelakang. Kemudian, dikaitkan dengan node baru.
- Untuk mengetahui data terbelakang perlu digunakan perulangan.
Menambahan node dibelakang dengan C++
void insertBelakang (int databaru)
{
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1) {
head=baru;
head->next = NULL;
}
else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next = baru;
}
printf("Data masuk\n“);
}
Menghapus Node di Depan
- Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penggunakan suatu pointer lain (hapus) yang digunakan untuk menunjuk node yang akan dihapus, barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.
- Sebelum data terdepan dihapus, terlebih dahulu head harus menunjuk ke node berikutnya agar list tidak putus, sehingga node setelah head lama akan menjadi head baru
- Jika head masih NULL maka berarti data masih kosong!
void hapusDepan ()
{
TNode *hapus;
int d;
if (isEmpty()==0){
if(head->next != NULL){
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(“%d terhapus\n“,d);
} else cout<<"Masih kosong\n";
}
Menghapus Node di Belakang
- Membutuhkan pointer bantu dan hapus. Pointer hapus digunakan untuk menunjuk node yang akan dihapus, pointer bantu untuk menunjuk node sebelum node yang dihapus yang akan menjadi node terakhir.
- Pointer bantu digunakan untuk menunjuk ke nilai NULL. Pointer bantu selalu bergerak sampai sebelum node yang akan dihapus, kemudian pointer hapus diletakkan setelah pointer bantu. Selanjutnya pointer hapus akan dihapus, pointer bantu akan menunjuk ke NULL.
void hapusBelakang(){
TNode *hapus,*bantu;
int d;
if (isEmpty()==0){
if(head->next != NULL){
bantu = head;
while(bantu->next->next!=NULL){
bantu = bantu->next;
}
hapus = bantu->next;
d = hapus->data;
bantu->next = NULL;
delete hapus;
} else {
d = head->data;
head = NULL;
}
printf(“%d terhapus\n“,d);
} else printf(“Masih kosong\n“);
}
Single Linked List non Circular Menggunakan Head dan Tail
- Dibutuhkan dua variabel pointer : head dan tail
- Head selalu menunjuk pada node pertama, sedangkan tail selalu menunjuk pada node terakhir.
- Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus menggunakan perulangan pointer bantu.
Inisialisasi Linked List
TNode *head, *tail;
Fungsi Inisialisasi Linked List
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kondisi LinkedList kosong / tidak
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
Menambah Node di Depan Dengan Head dan Tail
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=tail=baru;
tail->next=NULL;
}
else {
baru->next = head;
head = baru;
}
printf(”Data masuk\n”);
}
Menambah Node di Belakang Dengan Head dan Tail
void tambahBelakang(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = NULL;
if(isEmpty()==1){
head=baru;
tail=baru;
tail->next = NULL;
}
else {
tail->next = baru;
tail=baru;
}
printf("Data masuk\n“);
}
void hapusDepan(){
TNode *hapus;
int d;
if (isEmpty()==0){
if(head!=tail){
hapus = head;
d = hapus->data;
head = head->next;
delete hapus;
} else {
d = tail->data;
head=tail=NULL;
}
printf(“%d terhapus\n“,d);
} else printf("Masih kosong\n“);
}
Menghapus Node di Belakang (Dengan Head dan Tail)
void hapusBelakang(){
TNode *bantu,*hapus;
int d;
if (isEmpty()==0){
bantu = head;
if(head!=tail){
while(bantu->next!=tail){
bantu = bantu->next;
}
hapus = tail;
tail=bantu;
d = hapus->data;
delete hapus;
tail->next = NULL;
}else {
d = tail->data;
head=tail=NULL;
}
cout<<d<<" terhapus\n";
} else cout<<"Masih kosong\n";
}
Penggambaran untuk menambah dan menghapus node di posisi tengah pada :
- Single Linked List dengan Head
- Single Linked List dengan Head & Trail
# include <iostream.h>