Modul Linked List C++
Modul Linked List C++
BAB 6
LINKED LIST
infotype sebuah tipe terdefinisi yang menyimpan informasi sebuah elemen list
next address dari elemen berikutnya (suksesor)
Jika L adalah list, dan P adalah address, maka alamat elemen pertama list L dapat diacu
dengan notasi : first (L)
Sebelum digunakan harus dideklarasikan terlebih dahulu :
#define First(L) (L)
Elemen yang diacu oleh P dapat dikonsultasi informasinya dengan notasi :
info(P)deklarasi #define info(P) P->info
next(P)deklarasi #define next(P) P->next
Beberapa Definisi :
1. List l adalah list kosong, jika First(L) = Nil
2. Elemen terakhir dikenali, dengan salah satu cara adalah karena Next(Last) = Nil
Nil adalah pengganti Null, perubahan ini dituliskan dengan #define Nil Null
Asumsikan kita memiliki sejumlah node yang selalu menoleh ke sebelah dalam arah
yang sama. Atau, sebagai alat bantu, kita bisa mengasumsikan beberapa orang yang bermain
kereta api. Yang belakang akan memegang yang depan, dan semuanya menghadap arah yang
sama. Setiap pemain adalah node. Dan tangan pemain yang digunakan untuk memegang bahu
pemain depan adalah variabel next. Sampai di sini, kita baru saja mendeklarasikan tipe data
dasar sebuah node. Selanjutnya, kita akan mendeklarasikan beberapa variabel pointer bertipe
struct tnode. Beberapa variabel tersebut akan kita gunakan sebagai awal dari linked list, node
aktif dalam linked list, dan node sementara yang akan digunakan dalam pembuatan node di
linked list. Berikan nilai awal NULL kepada mereka. Deklarasi node untuk beberapa
keperluan, seperti berikut ini:
struct tnode *head=NULL, *curr=NULL, *node=NULL;
Dengan demikian, sampai saat ini, telah dimiliki tiga node. Satu sebagai kepala (head),
satu sebagai node aktif dalam linked list (curr) dan satu lagi node sementara (node).
Sekarang telah siap untuk membuat single linked list. Untuk itu, akan dimasukkan nilai
tertentu sebagai nilai untuk field data dengan cara melakukan perulangan sehingga campur
tangan user tidak diperlukan.
Seperti yang diungkapkan sebelumnya, bahwa akan dibuat Single Linked List (SLL)
dengan cara first-create-first-access. Dengan cara ini, node yang dibuat pertama akan menjadi
head. Node-node yang dibuat setelahnya akan menjadi node-node pengikut. Untuk
mempermudah pengingatan, ingatlah gambar anak panah yang mengarah ke kanan. Head
akan berada pada pangkal anak panah, dan node-node berikutnya akan berbaris ke arah
bagian anak panah yang tajam.
Setelah itu, perlu dibuat node dan penghubung. Pertama-tama, akan diuji apakah head
bernilai NULL. Kondisi head bernilai NULL hanya terjadi apabila belum dimiliki satu node
pun. Dengan demikian, node tersebut akan dijadikan sebagai head. Node aktif (curr), juga
kita dapat dari node tersebut.
Kalau head tidak bernilai NULL alias telah dimiliki satu atau lebih node, yang pertama
dilakukan adalah menghubungkan pointer next dari node aktif (curr) ke node yang baru saja
dibuat. Dengan demikian, baru saja dibuat penghubung antara rantai lama dengan mata rantai
baru. Atau, dalam permainan kereta api, pemain paling depan dalam barisan lama akan
menempelkan tangannya pada bahu pemain yang baru bergabung. Node aktif (curr)
kemudian dipindahkan ke node yang baru dibuat.
if (head == NULL)
{
head = node;
curr = node;
}
else
{
curr->next=node;
curr = node;
}
Setelah semuanya dibuat, sudah saatnya bagi kita untuk menghubungkan pointer next
untuk mata rantai terakhir ke NULL.
curr -> next = NULL;
Single linked list baru saja diciptakan. Agar kita tahu bahwa linked list yang kita
ciptakan adalah linked list yang benar, salah satu cara untuk mengetahuinya adalah dengan
mencetak field x untuk semua node. Dari head sampai node terakhir.
curr = head;
while (curr != NULL)
{
printf(“%d “, curr -> data);
curr = curr -> next;
}
printf(“\n”);
Pertama-tama, kita meletakkan node aktif (curr) ke posisi head. Setelah itu, kita akan
pindahkan kunjungi satu per satu node dengan memindahkan node aktif (curr) ke posisi
sebelahnya. Semua kunjungan tersebut akan kita lakukan apabila node aktif (curr) tidak
menemui NULL. Anda mungkin ingin menambahkan pemanggilan free() untuk melakukan
dealokasi.
Kode selengkapnya:
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct tnode
{
int data;
struct tnode *next;
};
struct tnode *head=NULL,
*curr=NULL, *node=NULL;
int i;
for (i=0; i<5; i++)
{
node = (struct tnode *)
malloc (sizeof(struct tnode));
node -> data = i;
if (head == NULL)
{
head = node;
curr = node;
}else
{
curr -> next = node;
curr = node;
}
}
curr -> next = NULL;
curr = head;
while (curr != NULL)
{
printf(“%d “, curr -> data);
curr = curr -> next;
}
printf(“\n”);
free();
return 0;
}
Menambah node dan membuat tail dari single linked list circular
Deklarasi penambahan node baru:
Void main()
{
node = new tnode;
tail = new tnode;
node->next = head->next;
head->next = node;
tail = node;
}
Deklarasi menghapus node dari single linked list circular, menggunakan sintaks berikut:
Void main()
{
hapus = new tnode;
if( head != tail)
{
hapus = head;
head = head->next;
tail->next = head;
delete hapus;
}else
{
head = NULL;
tail = NULL;
}
}
Latihan
1. Membuat Single Linked List
#include<iostream.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
list NodBaru(int m)
{
list n;
n=(list) (sizeof(elmtlist));
if(n!=NULL)
{
info(n)=m;
next(n)=Nil;
}
return n;
}
void CetakSenarai(list L)
{
list ps;
for(ps=L;ps!=Nil;ps=ps->next)
{
cout<<" "<<info()<<"-->";
}
cout<<"NULL"<<endl;
}
int main()
{
list pel;
list n;
int i,k,nilai;
CiptaSenarai(&pel);
cout<<"Masukkan banyak data=";
cin>>k;
for(i=1;i<=k;i++)
{
cout<<"Masukkan Data Senarai ke-"<<i<<" = ";
cin>>nilai;
n=NodBaru(nilai);
SisipSenarai(pel,n,NULL);
}
CetakSenarai(pel);
return 0;
}
2. Pencarian Nilai Terkecil dan Nilai Terbesar dalam sebuah Single Linked List
#include<iostream.h>
#include<stdlib.h>
#include<malloc>
#include<conio.h>
list NodBaru(int m)
{
list n;
n=(list) malloc(size(elmtlist));
if(n!=NULL)
{
info(n)=m;
next(n)=Nil;
}
return n;
}
void CetakSenarai(list L)
{
list ps;
for(ps=L;ps!=Nil;ps=ps->next)
{
cout<<" "<<info(ps)<<"-->";
}
cout<<"NULL";
}
InfoType Max(list L)
{
address Pmax,Pt;
Pmax=First(L);
if(next(Pmax)==Nil)
{
return(info(Pmax));
}
else
{
Pt=next(Pmax);
while(Pt!=Nil)
{
if(info(Pmax)<info(Pt))
{
Pmax=Pt;
}
else
{
Pt=next(Pt);
}
return(info(Pmax));
}
}
InfoType Min(list L)
{
address Pmin,Pt;
Pmin=First (L);
if(next(Pmin)==Nil)
{
return(info(Pmin));
}
else
Pt=next(Pmin);
while(Pt!=Nil)
{
if(info(Pmin)>info(Pt))
{
Pmin=Pt;
}
else
{
Pt=next(Pt);
}
}
return(info(Pmin));
}
}
void main()
{
list pel;
list n;
int i,k,nilai,maks,min;
CiptaSenarai(&pel);
cout<<"Masukkan banyak data=";
cin>>k;
for(i=1;i<=k;i++)
{
cout<<"Masukkan Data Senarai ke-"<<k<<" = ";
cin>>nilai;
n=NodBaru(nilai);
SisipSenarai(&pel,n,NULL);
}
cout<<endl;
CetakSenarai(pel);
maks=Max(pel);
min=Min(pel);
cout<<endl;
cout<<"Nilai Terbesar:"<<max;
cout<<endl;
cout<<"Nilai Terkecil:"<<min;
}
TUGAS
Pembuatan Single Linked List dapat menggunakan 2 metode:
LIFO (Last In First Out), aplikasinya : Stack (Tumpukan)
FIFO (First In First Out), aplikasinya : Queue (Antrean)
Buatlah 1 program dengan menggunakan 2 metode tersebut!