MODUL I
LINKED LIST DAN ARRAY
A. TUJUAN
1. Mahasiswa dapat mengetahui bagaimana mengimplementasikan array
dalam program.
2. Mahasiswa memahami dan mampu membuat single Linked List.
3. Mahasiswa memahami dan mampu membuat double Linked List.
4. Mahasiswa dapat membuat dan menggunakan berbagai operasi operasi
yang terdapat pada Linked List.
B.
DASAR TEORI
1. Array
Array atau larik adalah suatu bentuk struktur data yang menampung
satu data yang sejenis (bertipe data sama) yang diwakili oleh satu nama
variabel.[1]
1.1. Array Satu Dimensi
Array satu dimensi yaitu array yang terdiri atas satu baris dan
banyak kolom.pendeklarasian suatu array harus diikuti oleh suatu
indeks yang menunjukan jumlah maksimum data yang disediakan.[2]
Deklarasi array satu dimensi :
tipe_data nama_var_array [ukuran];
Contoh :
Char huruf [9];
4
indeks
Contoh :
Float nilai [5] = {56, 66, 87, 98, 78}
Contoh :
Int b [2][3]= {{2,4,1},{5,3,7}};
a
head
data
tail
NULL
a
head
data
d
tail
NULL
C.
PERMASALAHAN
1. Buat single linked list dengan memuat minimal 1 buah data array
disertakan operasi :
a. Add front & add back
b. Insert (after/before/between)
c. Delete (front & back)
d. Delete linked list
Penyelesaian :
a. Algoritma
1. Add Front :
a. Buat fungsi add front yang mempunyai paramaeter tipe data
double.
b. Jika size dari Node tersebut adalah 0, buat Node baru yang
bernama tmp.
c. Data merupakan atribut dari tmp yang memiliki nilai dataIn.
d. Next merupakan atribut dari tmp yang memiliki nilai NULL.
Next digunakan sebagai penghubung antara satu Node dengan
Node yang lainnya.
e. Proses Lingking. Karena tmp adalah Node baru, maka head
dan tail memiliki nilai sama dengan tmp.
f. Size-nya akan terus bertambah 1 jika kondisi tersebut
terpenuhi.
g. Sebaliknya, jika size tidak sama dengan 0, maka buat Node
baru yang bernama tmp.
h. Data merupakan atribut dari tmp yang memiliki nilai dataIn.
i. Next merupakan atribut dari tmp yang memiliki nilai NULL.
Next digunakan sebagai penghubung antara satu Node dengan
Node yang lainnya.
j. Proses Lingking. Node akan ditambahkan di depan Node yang
sudah ada.
tail=tmp;
tmp=tmp->next;
tail->next=NULL;
delete tmp;
size--;
}
}
void LL_1D :: hapus_ekor (double dataIn)
{
if(size==1)
{
head=NULL;
delete tail;
tail=NULL;
size--;
}
else
{
Node * tmp= head;
while (tmp->next!=tail)
tmp=tmp->next;
tail=tmp;
tmp=tmp->next;
tail->next=NULL;
delete tmp;
size--;
}
}
void LL_1D :: addFront (double dataIn)
{
if (size==0)
{
//buat node baru
Node * tmp=new (Node);
tmp->data=dataIn;
tmp->next=NULL;
//linking
head=tmp;
tail=tmp;
size++;
}
else
{
}
}
void LL_1D::insertnode ( double key, double dataIn){
//1.cara posisi
bool ketemu = false;
Node *tmp = head;
while (ketemu==false&& tmp!=NULL)
if (tmp->data==key) ketemu=true;
else tmp=tmp->next;
}
//insert jika ketemu
if (ketemu){
//2.1 buat node baru
Node * nN=new (Node);
nN->data=dataIn;
nN->next=NULL;
//2.2 linking
nN->next=tmp->next;
tmp->next=nN;
size++;
void LL_1D::printLL(){
if (size==0)
cout<<"linked list kosong : "<<endl;
else {
cout<<"isi linked list : "<<endl;
Node * tmp=head;
while(tmp!=NULL){
cout<<tmp->data<<" ";
tmp=tmp->next;
}
cout<<endl;
}
}
int main ()
{
LL_1D praktikum;
cout<<"ukuran adalah :"<<praktikum.getSize()<<endl;
cout<<endl;
cout<<endl;
praktikum.addFront(5);
praktikum.addFront(10);
praktikum.addFront(15);
praktikum.addFront(20);
praktikum.printLL();
cout<<"ukuran adalah :"<<praktikum.getSize()<<endl;
cout<<endl;
cout<<endl;
cout<<"ukuran adalah :"<<praktikum.getSize()<<endl;
praktikum.printLL();
praktikum.insertnode(20,50);
cout<<"ukuran adalah :"<<praktikum.getSize()<<endl;
praktikum.printLL();
praktikum.addFront(1);
praktikum.printLL();
cout<<"ukuran adalah :"<<praktikum.getSize()<<endl;
cout<<endl;
cout<<endl;
praktikum.addFront(3);
praktikum.printLL();
cout<<"ukuran adalah :"<<praktikum.getSize()<<endl;
cout<<endl;
cout<<endl;
praktikum.hapus_ekor(5);
praktikum.printLL();
cout<<" ukuran berkurang: "<<praktikum.getSize()<<endl;
cout<<endl;
cout<<endl;
praktikum.hapus_semua(5);
praktikum.printLL();
cout<<"ukuran kosong : "<<praktikum.getSize()<<endl;
getch();
return 0;
}
c. Hasil Compile
D.
ANALISA
class LL_1D
{
class LL_1D akan menampung suatu bentuk tipe data baru dalam
int size;
saja. struct Node dimana node variable yang bertipe data struct.
Dimana variable data sebagai simpanan dalam membuat node bertipe
data double. Node * next dimana next adalah artibut dari node,
LL_1D()merupakan
size memiliki
size--;
}
tidak sama dengan 0. Jika size bernilai 1, maka head sama dengan NULL,
kemudian hapus tail, karena tail sudah dihapus, maka tail bernilai
NULL. Kemudian size-nya akan berkurang 1.
else
{
NULL. Kemudian
hapus tmp.
void LL_1D :: hapus_ekor ()
{
if(size==1)
{
head=NULL;
delete tail;
tail=NULL;
size--;
}
sama dengan 1, maka head akan bernilai NULL. Setelah itu hapus tail,
karena tail sudah terhapus, maka nilai tail adalah. Karena tail-nya
sudah dihapus, maka size-nya akan berkurang 1.
else
{
Node * tmp= head;
while (tmp->next!=tail)
tmp=tmp->next;
tail=tmp;
tmp=tmp->next;
tail->next=NULL;
delete tmp;
size--;
}
Jika tidak, maka tmp sama dengan head. Selama tmp->next tidak
sama dengan tail. Maka tmp-nya bernilai tmp->next. Tail sama
dengan tmp. Tmp sama dengan tmp->next. tail->next bernilai
NULL. Kemudian hapus tmp. kemudian size-nya akan berkurang 1.
void LL_1D :: addFront (double dataIn)
{
if (size==0)
{
//buat node baru
Node * tmp=new (Node);
tmp->data=dataIn;
tmp->next=NULL;
//linking
head=tmp;
tail=tmp;
size++;
tmp=new(Node)
node,dimana
tmp
dimana
tmp
dimana data merupakan artibut dari tmp yang bernilai dataIn.tmp>next=NULL dimana next merupakan artibut dari tmp yang bernilai
NULL. Dimana node tmp tidak terhubung dengan node yang lainnya.
head=tmp dimana tmp adalah haed atau kepala suatu node yang
//linking
tmp->next=head;
head=tmp;
size++;
}
Jika tidak, maka akan membuat Node baru yang bernama tmp. Dimana
tmp->data bernilai dataIn. Karena Node sebelumnya sudah ada maka,
tmp->next bernilai head dari Node yang sebelumnya. Karena Node baru
mencari posisi. Terlebuih dahulu buat variable yang bernama ketemu yang
bernilai false. Dan jadikan tmp sebagai head. Ketika variable ketemu
sama dengan false dan tmp tidak sama dengan NULL.
if (tmp->data==key) ketemu=true;
else tmp=tmp->next;
}
//insert jika ketemu
if (ketemu){
//2.1 buat node baru
Node * nN=new (Node);
nN->data=dataIn;
nN->next=NULL;
//2.2 linking
nN->next=tmp->next;
tmp->next=nN;
size++;
}
bernilai NULL. Selanjutnya proses lingking, nN->next sama dengan tmpnext dan tmp->next=nN. Selanjutnya size akan bertambah 1.
void LL_1D::printLL(){
if (size==0)
cout<<"linked list kosong : "<<endl;
else {
cout<<"isi linked list : "<<endl;
Node * tmp=head;
while(tmp!=NULL){
cout<<tmp->data<<" ";
tmp=tmp->next;
}
cout<<endl;
}
}
tmp
bernilai
head.
while(tmp!=NULL)
dimana
merupakan kondisi akhir maka kondisi tmp tidak sama dengan NULL
tidak akan melakukan pengecekan kembali. tmp=tmp->next dimana
tmp memiliki artibut next yang berfungsi menyambungkan dari node
int main merupkan sebuah fungsi main. Dimana fungsi ini harus ada
LL_1D
praktikum.addFront()
untuk
menginputkan
data
menampilkan
statement
<<praktikum.getSize()<<endl;
ukuran
(size)
adalah).
menggunakan
praktikum.insertnode(50);
ukuran
digunakan
method
Assesor(get)
).
untuk
menginputkan
data
untuk
menghapus
semua
linked
list
yang
ada).
E.
KESIMPULAN
Berdasarkan praktikum yang telah dilaksanakan dapat disimpulkan
bahwa :
1. Array adalah struktur data yang menampung
(bertipe data sama) yang diwakili oleh satu nama variabel. Array dua
dimensi menyimpan data baik dalam bentuk baris maupun dalam bentuk
kolom. Karena akan menyimpan data ke dalam baris dan kolom, maka
dibutuhkan dua buah nilai indeks. Dalam membuat matriks array dua
dimensi kita dapat menggunakan perulangan yaitu for dimana telah
diinputkan nilainya.
2.
Single Linked List hanya memiliki satu penunjuk arah yaitu next,
didalam Single Linked List langkah yang pertama yang wajib dibuat yaitu,
nama class dimana sebagai nama konstruktor yang menampung suatu
bentuk tipe data baru dalam Linked list. Dimana terdiri dari private dan
public. Dimana private berfungsi mengakses source code yang ada di
dalam kelas itu saja, dan private membuat suatu node yang didalam node
memiliki atribut berupa next, dan public berfungsi mengakses seluruh
program yang ditampung dalam struct node. Di dalam linked list terdapat
operasi yaitu penyisipan dan penghapusan.
3.
node yang dibuat akan menjadi head. Node aktif (curr) pun diset sesuai
node yang dibuat. Dan sebagai konsekuensi dari Double Linked List, maka
diatur pointer prev pada head menunjuk ke NULL. Untuk membebaskan
memori teralokasi, dilakukan dengan pemanggilan fungsi free(). Operasi
pada linked list tidak hanya pembuatan dan pencetakan. Suatu saat,
mungkin perlu untuk menghapus node yang terletak di tengah-tengah list.
Atau bahkan mungkin perlu menyelipkan node di tengah-tengah node.
4.
Insert first,
Insert after, Insert last, Insert before. Sedangkan penghapusan kita dapat
melakukan penghapuasan node dari Delete after, Delete last, Delete first,
Dimana penghapusan simpul tertentu ada dua macam, yaitu Delete K
Node, Delete Node.
DAFTAR PUSTAKA
[1]
[2]
[3]
Kristanto,Andri.2013.
Algoritma
Dan
Pemrograman
Dengan
C++.
[5]
[6]
Tugas 1
1. Membuat double linked list.
2. Membuat double linked list menggunakan array.
Penyelesaian :
1. Membuat double linked list.
1.1 source code
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
class DL {
private :
struct node {
string nama;
string nim;
node * next;
node * before;
};
node *head;
node *tail;
int size;
public :
DL () {
head=NULL;
tail=NULL;
size=0;
};
void addf (string nama, string nim);
void insertbefore (string nimx, string nama, string nim);
void tampil ();
void hapus (); //hapus belakang
};
void DL ::hapus () {
node * tmp;
tmp=tail;
if (size==0) {
cout<<"Mana Ada Linked List ";
}
else {
tail=tmp->before;
tmp->before=NULL;
tail->next=NULL;
delete (tmp);
}
}
DL a;
a.addf("Zanul","F1D014099");
a.addf("Biyas","F1D014019");
a.addf("arya","F1D014056");
a.addf("rival","F1D014076");
a.tampil();
cout<<endl;
cout<<endl;
cout<<"Insert Before :\n\n";
a.insertbefore("F1D014056","Ridho","F1D014052");
a.tampil();
cout<<endl;
cout<<endl;
cout<<"Hapus Belakang : \n\n";
a.hapus();
a.tampil();
getch ();
}
};
public:
LL()
{
node*head;
node*tail;
int size;
head = NULL;
tail = NULL;
size = 0;
};
void Addfront(int data[]);
void insertBefore(int data[], int x[]);
void printLL();
};
//:: menandakan kepemilikan fungsi LL
void LL::Addfront(int data[])
{
//pembentukan node baru
node *tmp = new node;
//menunjuk variabel struct di atas
for (int i = 0; i < 3; i++)
{
tmp->data[i] = data[i];
}
tmp->next = NULL;
//jika LL kosong
if (head == NULL && tail == NULL)
{
head = tmp;
tail = tmp;
size++;
}
else
//jika datanya ada, ditambahkan ke depan
{
tmp->next = head;
head = tmp;
size++;
}
}
void LL::insertBefore(int data[], int x[])
{
node * tmp = new node;
for (int i = 1; i < 3; i++)
{
tmp->data[i] = data[i];
}
tmp->next = NULL;
node * tmp1 = head;
while (tmp1->data[0] != x[0])
{
tmp1 = tmp1->next;
}
if (tmp1 == tail)
{
Addfront(data);
}
else
{
tmp->next = tmp1->next;
tmp1->next = tmp;
size++;
}
}
void LL::printLL()
{
node*tmp;
tmp = head;
if (size == 0)
{
cout<<"Linked List kosong";
}
else
{
while (tmp != tail->next)
{
for (int i = 0; i < 3; i++)
{
cout<<"data ["<<i<<"] = "<< tmp>data[i]<<" ";
}
cout<<endl;
tmp=tmp->next;
}
}
cout<<endl<<endl;
}
void main()
{
LL z;
int a[3] = { 1, 3, 5 }, b[3] = { 2, 4, 6 }, c[3] = { 7, 8, 9 };
z.Addfront(a);
z.Addfront(b);
z.insertBefore(c,a);
z.printLL();
system("pause");
}