Anda di halaman 1dari 28

Laporan Modul Praktikum Algoritma dan Struktur Data

“DOUBLE LINKED LIST”

Oleh :
Nama : Amir Mahmud
NIM : 18102042
Kelas : S1IF-06-B
Hari/ Tanggal : Selasa, 14 Mei 2019

PROGRAM STUDI S1 SISTEM INFORMASI


FAKULTAS TEKNOLOGI INDUSTRI DAN INFORMATIKA
INSTITUT TEKNOLOGI TELKOM PURWOKERTO
2019
BAB I
SOAL

1. Setelah deklarasi node dilakukan, dan semua fungsi sudah tersedia. Sekarang
gabungkan setiap fungsi yang ada pada sebuah program penuh dengan spesifikasi :
 Pada program utama (main) beri sebuah menu yang berisi fitur-fitur yang terdapat
dari setiap fungsi yang sudah ada sebelumnya, yaitu : tambah data, hapus data, cek
data kosong, dan cetak semua data.
 Pada struct hanya terdapat 1 tipe data saja yaitu integer.
 Sesuaikan fungsi-fungsi yang ada dengan program yang anda buat (jangan
langsung copy-paste dan gunakan).
2. Buat program untuk enkripsi dan dekripsi password yang memanfaatkan Linked List,
dengan spesifikasi :
 Panjang password maksimal 6 digit.
 Isi password terserah dari user dan password diinputkan terlebih dahulu
sebelumnya (penambahan data di belakang).
 Enkripsi dilakukan dengan memindahkan 3 node terakhir, menjadi node terdepan.
Kemudian sisipkan 1 karakter baru (kunci) setelah node ketiga dari yang
dipindahkan tersebut.
 Ilustrasi :

 Lakukan juga proses dekripsi-nya.


 Berikan juga fitur untuk menampilkan password.
BAB II
PEMBAHASAN

1. Source Code :
#include <iostream> //librari untuk input output

using namespace std; //menghindari penggunaan std::

//deklarasi struktur data node / linked list


typedef struct TNode {
int data; //untuk data inputan
TNode *next; //untuk menunjukan arah selanjutnya
TNode *prev; //untuk menunjukan arah sebelumnya
};

TNode *head; //deklarasi node head

//prosedur untuk inisialisasi nilai head


void init() {
head = NULL;
}

//fungsi untuk menentukan kondisi linked list kosong atau berisi


int isEmpty() {
if (head == NULL) //kondisi saat head adalah null
{
return 1; //nilai saat linked list kosong
}
else
{
return 0; //nilai saat linked list berisi
}
}

//prosedur untuk menambahkan data di paling depan


void insertDepan(int value)
{
TNode *baru; //deklarasi pointer tipe data bentukan untuk node
baru = new TNode; //membuat node baru

baru->data = value; //mengisi data inputan ke node baru


baru->next = NULL; //menghubungkan node baru next ke null
baru->prev = NULL; //menghubungkan node baru prev ke null

if (isEmpty() == 1) //kondisi saat kondisi head menunjuk ke null


{
head = baru; //head diarahkan ke node baru
head->next = NULL; //menghubungkan head next ke null
head->prev = NULL; //menghubungkan head prev ke null
}
else //kondisi saat head menunjuk ke node/berisi
{
baru->next = head; //menghubungkan node baru next ke head
head->prev = baru; //menghubungkan node head prev ke node baru
head = baru; //menjadikan node baru sebagai head
}

cout << "Data Masuk\n" << endl; //output setelah berhasil menambah
data
}

//prosedur untuk menambahkan data ke paling belakang


void insertBelakang(int value)
{
TNode *baru, *bantu; //deklarasi pointer tipe data bentukan untuk
node
baru = new TNode; //membuat node baru

baru->data = value; //mengisi data inputan ke node baru


baru->next = NULL; //menghubungkan node baru next ke null
baru->prev = NULL; //menghubungkan node baru prev ke null

if (isEmpty() == 1) //kondisi saat kondisi head menunjuk ke null


{
head = baru; //membuat node baru sebagai head
head->next = NULL; //menghubungkan node head next ke null
head->prev = NULL; //menghubungkan node head prev ke null
}
else //kondisi saat kondisi head menunjuk ke node/berisi
{
bantu = head; //membuat bantu menjadi head
while (bantu->next != NULL) //berpindah ke belakang sampai node
terakhir
{
bantu = bantu->next; //node bantu diisi nilai node next
}
baru->next = NULL; //menghubungkan node baru next ke null
bantu->next = baru; //menghubungkan node bantu next ke node baru
head->prev = bantu; //menghubungkan head prev ke node bantu
}

cout << "Data Masuk\n" << endl; //output setelah berhasil


}

//prosedur untuk menambah data di tengah node


void insertTengah(int value, int cari)
{
TNode *baru, *bantu, *bantu2; //deklarasi pointer tipe data bentukan
untuk node
baru = new TNode; //membuat node baru

baru->data = value; //mengisi node baru dengan nilai input


baru->next = NULL; //menghubungkan node baru next ke null
baru->prev = NULL; //menghubungkan node baru prev ke null
bantu = head; //menjadikan node bantu sebagai head

while (bantu->data != cari) //menggeser ke node sampai nilai yang


dicari
{
bantu = bantu->next; //mengisi nilai node bantu dengan nilai node
bantu next
}
bantu2 = bantu->next; //menghubungkan ke node setelah node yang
dicari
baru->next = bantu2; //menghubungkan node baru
bantu2->prev = baru; //menghubungkan nilai bantu2 prev ke node baru
bantu->next = baru; //menghubungkan ke node sebelum yang dicari
baru->prev = bantu; //menghubungkan node baru next ke node bantu
}

//prosedur untuk menghapus node di paling depan / head


void deleteDepan()
{
TNode *hapus; //deklarasi pointer untuk node
if (isEmpty() == 0) //kondisi saat linked list ada isinya
{
if (head->next != NULL) //jika data lebih dari satu
{
hapus = head; //membuat hapus menjadi head
head = head->next; //menggeser head ke head next
head->prev = NULL; //menghubungkan head prev ke null

delete hapus; //menghapus node hapus


}
else //jika data hanya head saja
{
head = NULL; //memberi nilai head menjadi null
}
cout << "Data Terhapus\n" << endl; //output saat data terhapus
}
else //kondisi saat linked list kosong
{
cout << "Data kosong\n" << endl; //output saat linked list kosong
}
}

//prosedur untuk menghapus node paling belakang


void deleteBelakang()
{
TNode *hapus; //deklarasi pointer untuk node
if (isEmpty() == 0) //kondisi saat linked list ada isinya
{
if (head->next != NULL) //jika data masih lebih dari 1
{
hapus = head; //membuat hapus menjadi head
while (hapus->next != NULL) //menggeser node hapus next ke
sebelum null
{
hapus = hapus->next; //mengisi nilai node hapus dengan nilai
hapus next
}
hapus->prev->next = NULL; //menghubungkan node sebelumnya ke
null
delete hapus; //menghapus node hapus
}
else //kondisi data hanya head
{
head = NULL; //head adalah null
}
cout << "Data Terhapus\n" << endl;
}
else //kondisi saat inked list tidak ada datanya
{
cout << "Data Kosong\n" << endl;
}
}

//prosedur untuk menghapus node pada bagian tengah


void deleteTengah(int cari)
{
TNode *hapus, *bantu, *bantu2; //deklarasi pointer untuk node

hapus = head; //membuat hapus menjadi head


while (hapus->data != cari) //menggeser ke node sampai ke node
bernilai sama
{
hapus = hapus->next; //menyalin node hapus next ke hapus hingga
node yang dicari
}
bantu2 = hapus->next; //mengisi nilai bantu2 dengan nilai yang
ditunjuk node hapus next
bantu = hapus->prev; //mengisi nilai bantu dengan nilai yang
ditunjuk node hapus next
bantu->next = bantu2; //menghubungkan node bantu next ke node bantu2
bantu->prev = bantu; //menghubungkan node bantu prev ke node bantu

delete hapus; //menghapus node hapus

cout << "Data Terhapus\n" << endl; //output setelah data terhapus
}

//prosedur untuk menghapus seluruh node


void clear()
{
TNode *bantu, *hapus; //deklarasi pointer untuk node
bantu = head; //membuat bantu menjadi head
while (bantu != NULL) //menggeser bantu hingga node akhir
{
hapus = bantu; //menyalin nilai bantu ke hapus
bantu = bantu->next; //menyalin nilai bantu next ke bantu
delete hapus; //menghapus node hapus
}

head = NULL; //membuat head menjadi null setelah node habis


}

//prosedur untuk mencetak seluruh node ke layar


void cetak()
{
TNode *bantu; //deklarasi pointer untuk node
bantu = head; //membantu bantu menjadi head

if (isEmpty() == 0) //kondisi saat linked list berisi


{
while (bantu != NULL) //diulang selama nilai bantu tidak null
{
cout << " " << bantu->data; //menampilkan nilai node bantu
bantu = bantu->next; //menyalin nilai bantu next ke node bantu
}
cout << endl;
}
else //jika data kosong
{
cout << "Data Kosong\n" << endl;
}
}

int main() {

//deklarasi
int pil; //untuk pilihan menu
int data; //untuk inputan data ke node / linked list
int cari; //valu untuk mencari data dalam linked list

init(); //memanggil prosedur init / inisialisasi head

//perulangan do while untuk menu


do {
cout << "Menu\n";
cout << "1. Insert Depan\n";
cout << "2. Insert Belakang\n";
cout << "3. Insert Tengah\n";
cout << "4. Delete Depan\n";
cout << "5. Delete Belakang\n";
cout << "6. Delete Tengah\n";
cout << "7. Clear\n";
cout << "8. Cetak\n";
cout << "9. Exit\n";

cout << "Pilihan : ";


cin >> pil;

switch (pil) {
case 1:
cout << "Data : ";
cin >> data;
insertDepan(data); //memanggil prosedur insert depan dan
mengirim nilai data
break;
case 2:
cout << "Data : ";
cin >> data;
insertBelakang(data); //memanggil prosedur insert belakang
dan mengirim nilai data
break;
case 3:
cout << "Cari : ";
cin >> cari;
cout << "Data : ";
cin >> data;
insertTengah(data, cari); //memanggil prosedur insert tengah
dan mengirim nilai data dan cari
break;
case 4:
deleteDepan(); //memanggil prosedur delete depan
break;
case 5:
deleteBelakang(); //memanggil prosedur delete belakang
break;
case 6:
cout << "cari : ";
cin >> cari;
deleteTengah(cari); //memanggil prosedur delete tengah dengan
nilai yang sama dengan
// variabel cari
break;
case 7:
clear(); //memanggil prosedur clear
break;
case 8:
cetak(); //memanggil prosedur cetak
break;
}
} while (pil != 9); //akan terus diulang selama pilihan/inputan
bukan 9
}

Screenshoot Kode Program dan Penjelasan Per Baris


Hasil :
Penjelasan :

Program ini menggunakan library standar iostream, kemudian


dideklarasikan tipe data terstruktur untuk node. Prosedur yang digunakan
adalah init(), insertDepan(), insertBelakang(), insertTengah(),
deleteDepan(), deleteBelakang(), deleteTengah(). Kemudian ada fungsi
isEmpty(). Prosedur insertTengah() dan deleteTengah() memiliki variabel
tambahan yaitu cari yang fungsinya untuk mencari data node yang berada di
tengah dengan mencarinya mulai dari head. Untuk program utama hanya akan
memanggil prosedurnya saja yang sebelumnya akan ditampilkan menu untuk
memilih prosedur yang akan dipanggil. Penjelasan per baris bisa dilihat di
source code atau screenshoot.

2. Source Code
#include <iostream> //library input output
#include <conio.h> //library untuk fungsi getch

using namespace std; //menghilangkan penggunaan std::

//deklarasi struktur data node / linked list


struct TNode {
char pass; //untuk input password
TNode *next; //menunjuk ke arah selanjutnya
TNode *prev; //menunjuk ke arah seblumnya
};

TNode *head, *bantu, *tail; //deklarasi node head, bantu dan tail

//prosedur untuk inisialisasi nilai head


void init()
{
head=NULL; //memberi nilai head menjadi null
}

//fungsi untuk menentukan kondisi linked list kosong atau berisi


int isEmpty()
{
if(head == NULL) //kondisi saat head adalah null
{
return 1; //nilai saat linked list kosong
}
else
{
return 0; //nilai saat linked list berisi
}
}

//prosedur untuk menyimpan inputan password ke node


void input(char pass)
{
TNode *baru; //deklarasi pointer untuk node
baru=new TNode; //membuat node baru
baru->pass=pass; //memberi nilai node baru dengan data inputan
baru->next=NULL; //menghubungkan node baru next ke null
baru->prev=NULL; //menghubungkan node baru prev ke null
if(isEmpty()==1) //kondisi linked list masih kosong
{
head=baru; //membuat node baru menjadi head
head->next=NULL; //menghubungkan node head next ke null
head->prev=NULL; //menghubungkan node head prev ke null
tail=head; //membuat node tail menjadi head
}
else //kondisi saat linked list ada isinya
{
bantu=head; //membuat bantu menjadi head
while(bantu->next!=NULL) //berpindah ke belakang sampai node
terakhir
{
bantu=bantu->next; //node bantu diisi nilai node next
}
baru->prev=bantu; //menghubunkan node baru prev ke bantu
bantu->next=baru; //menghubungkan node bantu next ke baru
tail=baru; //membuat tail bernilai sama dengan baru
}
}

//prosedur untuk mengenkripsi password


void Encryption(char pass)
{
TNode *baru, *bantu2; //deklarasi pointer untuk node
baru=new TNode; //membuat node baru
baru->pass='@'; //mengisi data node pass dengan karakter '@'
baru->next=NULL; //menghubungkan node baru next ke null
baru->prev=NULL; //menghubuungkan noe baru prev ke null
bantu=tail; //membuat node baru bernulai sama dengan tail
for(int i=0;i<2;i++)
{
bantu=bantu->prev; //menggeser 3 node terakhir kedepan
}
bantu2=bantu->prev; //bantu2 dihubungkan ke bantu prev
bantu->prev=NULL; //bantu prev dihubungkan ke null
bantu2->next=NULL; //bantu2 next dihubungkan ke null
tail->next=baru; //tail next dihubungkan ke node baru
baru->prev=tail; //baru prev dihubungkan ke tail
baru->next=head; //baru next dijadikan head
head->prev=baru; //head prev dihubungkan ke node baru
head=bantu; //bantu dijadikan head
tail=bantu2; //menyalin node bantu2 ke tail
}

//prosedur untuk mendekripsi password


void Decryption()
{
TNode *hapus,*bantu2; //deklarasi pointer untuk node
hapus=head; //membuat node hapus menjadi head
while(hapus->pass!='@')
{
hapus=hapus->next; //node hapus diisi nilai hapus next hingga
sebelum data '@'
}
bantu=hapus->next; //bantu dihubungkan ke node setelah data '@'
bantu2=hapus->prev; //bantu2 dihubungkan ke hapus prev
bantu->prev=NULL; //bantu prev dihubungkan ke null
bantu2->next=NULL; //bantu2 next dihubungkan ke null
delete hapus; //menghapus node hapus
tail->next=head; //tail next menjadi head
head->prev=tail; //head prev dihubungkan ke tail
head=bantu; //menyalin node bantu ke head / bantu menjadi head
tail=bantu2; //tail dihubungkan ke bantu2
}

//prosedur untuk menampilkan semua node ke layar


void Print()
{
bantu=head; //membuat bantu menjadi head
if(isEmpty()==0) //kondisi saat linked list ada isinya
{
while(bantu!=NULL)
{
cout<<bantu->pass; //menampilkan semua node bantu
bantu=bantu->next;
}
}
}
int main()
{
init(); //memanggil prosedur init

ulang:

int panjang; //variabel untuk panjang karakter


char password; //variabel untuk menampung password
cout<<"PROGRAM ENKRIPSI & DEKRIPSI PASSWORD\n";

cout<<"Input jumlah karakter (maksimal 6 karakter) : ";


cin>>panjang;

if(panjang<=6) //kondisi saat inputan kurang dari sama dengan 6


{
cout<<"Input password : ";

for(int i=0;i<panjang;i++) {
cin>>password; //memberi nilai variabel password
input(password); //memanggil prosedur input
}

Encryption(password); //memanggil prosedur encryption


cout<<"Hasil Setelah Enkripsi: ";

Print(); //memanggil prosedur print

Decryption(); //memanggil prosedur decryption


cout<<"\nHasil Setelah Deskripsi: ";

Print(); //memanggil prosedur print


}

else //inputan lebih dari 6


{
cout <<"Password Terlalu Panjang\n";

goto ulang; //kembali ke ulang :


}

getch();
}
Screenshoot Kode Program dan Penjelasan per Baris :
Hasil :
Penjelasan :

Program ini menggunakan library iostream untuk input output dan


conio.h untuk fungsi getch/pause. Untuk awalnya dideklarasikan struktur data
bentukan untuk node. Kemudian dideklarasikan pointer head, bantu dan tail.
Selanjutnya ada beberapa prosedur, seperti input(), Encryption(),
Decryption(), dan cetak(). Untuk bagian Prosedur input data dimasukan pada
bagian belakang node, kemudian proses enkripsi dilakukan dengan menambah
karakter @ di depan dan memindahkan 3 node belakang ke depan/head. Pada
proses dekripsi node akan dikembalikan ke awal setelah memindahkan 3 node
terdepan ke belakang dan menghapus headnya. Untuk lebih jelas dapat melihat
penjelasan di source code/ kode program.