/*deklarasi struct untuk node*/ struct DNode{
int data; //variabel data node
DNode *next; //pointer penunjuk node selanjutnya
DNode *prev; //pointer penunjuk node sebelumnya }; DNode *head; //pointer penunjuk node terdepan
void header(); void inisialisasi(); int isEmpty(); int countNode(); void clear(); void tambahdepan(int newData); void tambahbelakang(int newData); void tambahtengah(int newData, int pos); void hapusdepan(); void hapusbelakang(); void hapustengah(int pos); void cetakdepan(); void cetakbelakang(); void caridepan(int cari); void caribelakang(int cari);
int main() {
int newData, cari, pos, loop = 1;
char menu;
do{
system("cls"); //membersihkan layar console
header(); //memanggil fungsi header()
cout<<"Menu :\n";
cout<<"======\n";
cout<<"\n";
cout<<"A. Penambahan data dari depan\n";
cout<<"B. Penambahan data dari belakang\n";
cout<<"C. Penambahan data dari tengah\n";
cout<<"D. Penghapusan data dari depan\n";
cout<<"E. Penghapusan data dari belakang\n";
cout<<"F. Penghapusan data dari tengah\n";
cout<<"G. Tampilkan data dari depan\n";
cout<<"H. Tampilkan data dari belakang\n";
cout<<"I. Cari data dari depan\n";
cout<<"J. Cari data dari belakang\n";
cout<<"K. Bersihkan linked list\n";
cout<<"L. Keluar\n";
cout<<endl;
printf("Menu pilihan : ");
cin>>menu;
switch(menu){
case 'A' :
case 'a' :
{
system("cls");
header();
/*memasukkan data (newData)*/
cout<<"Masukkan data : "; cin>>newData;
/*memanggil fungsi tambahdepan() dan mengirimkan nilai newData ke fungsi
tersebut*/
tambahdepan(newData);
}
break;
case 'B' :
case 'b' :
{
system("cls");
header();
/*memasukkan data (newData)*/
cout<<"Masukkan data : "; cin>>newData;
/*memanggil fungsi tambahbelakang() dan mengirimkan nilai newData ke fungsi
tersebut*/
tambahbelakang(newData);
}
break;
case 'C' :
case 'c' :
{
system("cls");
header();
/*memasukkan data (newData) dan posisi (pos) penyisipan node*/
cout<<"Masukkan posisi : "; cin>>pos;
cout<<"Masukkan data : "; cin>>newData;
/*memanggil fungsi tambahtengah() dan mengirimkan nilai newData serta pos ke
fungsi tersebut*/
tambahtengah(newData, pos);
}
break;
case 'D' :
case 'd' :
{
system("cls");
header();
hapusdepan(); //memanggil fungsi hapusdepan()
}
break;
case 'E' :
case 'e' :
{
system("cls");
header();
hapusbelakang(); //memanggil fungsi hapusbelakang()
}
break;
case 'F' :
case 'f' :
{
system("cls");
header();
/*memasukkan posisi (pos) node yang akan dihapus*/
cout<<"Masukkan posisi : "; cin>>pos;
/*memanggil fungsi hapustengah() dan mengirimkan nilai pos ke fungsi
tersebut*/
hapustengah(pos);
}
break;
case 'G' :
case 'g' :
{
system("cls");
header();
cetakdepan(); //memanggil fungsi cetakdepan()
}
break;
case 'H' :
case 'h' :
{
system("cls");
header();
cetakbelakang(); //memanggil fungsi cetakbelakang()
}
break;
case 'I' :
case 'i' :
{
system("cls");
header();
/*memasukkan data yang akan dicari (cari)*/
cout<<"Masukkan data yang dicari : "; cin>>cari;
/*memanggil fungsi caridepan() dan mengirimkan nilai cari*/
caridepan(cari);
}
break;
case 'J' :
case 'j' :
{
system("cls");
header();
/*memasukkan data yang akan dicari (cari)*/
cout<<"Masukkan data yang dicari : "; cin>>cari;
/*memanggil fungsi caribelakang() dan mengirimkan nilai cari*/
caribelakang(cari);
}
break;
case 'K' :
case 'k' :
{
system("cls");
header();
clear(); //memanggil fungsi clear()
}
break;
case 'L' :
case 'l' :
{
system("cls");
header();
/*memberikan nilai 0 pada variabel loop sehingga program dapat keluar dari
statement do while*/
loop = 0;
}
break;
default :
{
system("cls");
header();
puts("Menu pilihan Anda salah!\n");
getch();
}
}
}
while(loop == 1); //program akan terus berulang selama loop sama dengan 1 } void inisialisasi() {
head = NULL; //pointer head tidak menunjuk ke alamat manapun (NULL) } /*fungsi untuk mengetahui apakah linked list masih dalam keadaan kosong atau tidak*/ int isEmpty() {
if(head == NULL) //linked list kosong jika head tidak menunjuk ke alamat manapun
return 1;
else
return 0; } /*fungsi untuk mengetahui jumlah node dalam linked list*/ int countNode() {
int i;
if(isEmpty() == 1) //jika linked list kosong...
return 0; //...nilai yang dikembalikan adalah 0
else{
DNode *count; //deklarasi pointer count
count = head; //posisi pointer count sama dengan pointer head
i = 1; //posisi head adalah posisi 1
while(count->next != head){ //selama count->next tidak menunjuk head...
count = count->next; //...pointer count bergeser ke node selanjutnya
i++; //increment i terjadi tiap pointer count berpindah posisi
}
//jika linked list tidak kosong...
return i; //...nilai yang dikembalikan adalah jumlah increment variabel i
} } void clear() {
DNode *bantu, *hapus; //deklarasi pointer bantu dan hapus
if(isEmpty() == 0){ //jika linked list tidak kosong...
bantu = head; //...posisi bantu sama dengan posisi head
while(bantu->next != head){ //selama bantu->next tidak menunjuk head...
hapus = bantu; //...posisi hapus sama dengan posisi bantu...
bantu = bantu->next; //...bantu bergeser ke node selanjutnya...
delete hapus; //...node yang ditunjuk oleh pointer hapus di-delete
}
inisialisasi(); //memanggil fungsi inisialisasi() / mengembalikan nilai head = NULL
puts("Linked list telah dikosongkan!");
}
else
puts("Linked list masih kosong!");
getch(); } void header() {
puts("+------------------------------------------+");
puts("| DOUBLE LINKED LIST (DLL) |");
puts("| by: r12q1 |");
puts("+------------------------------------------+\n"); } void tambahdepan(int newData){
DNode *baru, *belakang; //deklarasi pointer baru dan belakang
/*deklarasi node baru*/
baru = new DNode;
baru->data = newData; //baru->data diisi oleh nilai newdata
baru->next = baru; //baru->next menunjuk pada node baru itu sendiri
baru->prev = baru; //baru->prev menunjuk pada node baru itu sendiri
if(isEmpty() == 1)
{
head = baru; //...maka posisi head sama dengan posisi baru
head->next = head; //...head->next menunjuk pada node head itu sendiri
head->prev = head; //...head->prev menunjuk pada node head itu sendiri
}
else
{
belakang = head->prev; //belakang sama dengan node yang ditunjuk oleh head->prev
baru->next = head; //baru->next menunjuk pada node head
head->prev = baru; //head->prev menunjuk pada node baru
head = baru; //posisi head bergeser ke posisi baru
head->prev = belakang; //head->prev yang baru menunjuk ke node belakang
belakang->next = head; //belakang->prev menunjuk ke node head yang baru
}
printf("Data %i masuk!\n", newData);
getch(); }
void tambahbelakang(int newData) {
DNode *baru, *belakang; //deklarasi pointer baru dan belakang
/*deklarasi node baru*/
baru = new DNode;
baru->data = newData;
baru->next = baru;
baru->prev = baru;
if(isEmpty() == 1){ //jika linked list kosong...
head = baru; //...maka posisi head sama dengan posisi baru
head->next = head; //...head->next menunjuk pada node head itu sendiri
head->prev = head; //...head->prev menunjuk pada node head itu sendiri
}
else{ //jika linked list tidak kosong...
belakang = head->prev; //belakang sama dengan node yang ditunjuk oleh head->prev
belakang->next = baru; //belakang->next menunjuk pada node baru
baru->prev = belakang; //baru->prev menunjuk pada node belakang
baru->next = head; //baru->next menunjuk pada node head
head->prev = baru; //head->prev menunjuk pada node baru
}
printf("Data %i masuk!\n", newData);
getch(); }
void tambahtengah(int newData, int pos) {
int jumNode;
int i = 1; //deklarasi variabel i sebagai "index" node (index mula-mula atau head = 1)
DNode *baru, *sisip, *before; //deklarasi pointer baru, sisip, dan before
/*deklarasi node baru*/
baru = new DNode;
baru->data = newData;
baru->next = baru;
baru->prev = baru;
/*memberi nilai pada jumNode dengan jumlah node pada linked list*/
jumNode = countNode();
if(pos == 1) //jika pos sama dengan 1...
tambahdepan(newData); //...maka sama dengan memasukkan data pada node terdepan
else if(pos == jumNode + 1) //jika pos sama dengan jumlah node + 1...
tambahbelakang(newData); //...maka sama dengan memasukkan data pada node terbelakang
else if(pos > jumNode + 1) //jika pos lebih besar dari jumlah node + 1...
printf("Error : Masih ada posisi kosong sebelum posisi %i\n", pos); //...maka error
else{ //jika tidak...
sisip = head; //posisi sisip sama dengan head
while(i != pos){ //selama nilai i tidak sama dengan pos...
i++; //...i mengalami increment...
sisip = sisip->next;//...dan sisip bergeser ke node selanjutnya
}
before = sisip->prev; //before berada pada node yang ditunjuk oleh sisip->prev
before->next = baru; //before->next menunjuk pada node baru
baru->prev = before; //baru->prev menunjuk pada node before
baru->next = sisip; //baru->next menunjuk pada node sisip
sisip->prev = baru; //sisip->prev menunjuk pada node baru
printf("Data %i masuk!\n", newData);
}
getch(); } /*fungsi untuk menghapus node terdepan*/ void hapusdepan() {
int d;
DNode *hapus, *belakang; //deklarasi pointer hapus dan belakang
if(isEmpty() == 0){ //jika linked list tidak kosong...
if(head->next != head){ //...jika head->next tidak menunjuk pada head sendiri...
hapus = head; //...maka posisi hapus sama dengan head
d = hapus->data; //nilai variabel d sama dengan nilai hapus->data
//node belakang sama dengan node yang ditunjuk oleh head->prev
belakang = head->prev;
head = head->next; //head bergeser ke node selanjutnya
head->prev = belakang; //head->prev yang baru menunjuk pada node belakang
belakang->next = head; //belakang->next menunjuk pada node head yang baru
delete hapus; //node hapus di-delete
}
else
{ //...jika head->next menunjuk pada head sendiri...
d = head->data; //nilai variabel d sama dengan nilai head->data
inisialisasi(); //mengembalikan nilai head = NULL dengan fungsi inisialisasi()
}
printf("Data %i terhapus!\n", d);
}
else
printf("Linked list masih kosong!");
getch(); } void hapusbelakang() {
int d;
DNode *hapus, *belakang; //deklarasi pointer hapus dan belakang
if(isEmpty() == 0){ //jika linked list tidak kosong...
if(head->next != head){ //...jika head->next tidak menunjuk pada head sendiri...
//node belakang sama dengan node yang ditunjuk oleh head->prev->prev
belakang = head->prev->prev;
//posisi hapus sama dengan node yang ditunjuk oleh belakang->next
hapus = belakang->next;
d = hapus->data; //nilai variabel d sama dengan nilai hapus->data
belakang->next = head; //belakang->next menunjuk pada node head
head->prev = belakang; //head->prev menunjuk pada node belakang
delete hapus; //node hapus di-delete
}
else{ //...jika head->next menunjuk pada head sendiri...
d = head->data; //nilai variabel d sama dengan nilai head->data
inisialisasi(); //mengembalikan nilai head = NULL dengan fungsi inisialisasi()
}
printf("Data %i terhapus!\n", d);
}
else
printf("Linked list masih kosong!");
getch(); } void hapustengah(int pos) {
int d, jumNode;
int i = 1; //deklarasi variabel i sebagai "index" node (index mula-mula atau head = 1)
DNode *hapus; //deklarasi pointer hapus
/*memberi nilai pada jumNode dengan jumlah node pada linked list*/
jumNode = countNode();
if(isEmpty() == 0)
{
if(pos == 1)
hapusdepan(); //...maka sama dengan menghapus node terdepan
else if(pos == jumNode)
hapusbelakang(); //...maka sama dengan menghapus node terbelakang
else if(pos > jumNode)
printf("Error : Tidak ada node pada posisi %i!\n", pos); //...maka error
else
{
hapus = head; //...posisi hapus sama dengan head
while(i != pos){ //selama nilai i tidak sama dengan nilai pos...
i++; //...i diincrement
hapus = hapus->next; //...dan hapus bergeser ke node selanjutnya
}
d = hapus->data; //nilai variabel d sama dengan nilai hapus->data
//hapus->prev->next menunjuk ke node yang ditunjuk oleh hapus->next
hapus->prev->next = hapus->next;
//hapus->next->prev menunjuk ke node yang ditunjuk oleh hapus->prev
hapus->next->prev = hapus->prev;
printf("Data %i terhapus!\n", d);
delete hapus; //node hapus di-delete
}
}
else //jika linked list kosong
printf("Linked list masih kosong!\n");
getch(); } void cetakdepan() {
DNode *tampil; //deklarasi pointer tampil
if(isEmpty() == 0){ //jika linked list tidak kosong...
tampil = head; //...maka posisi tampil sama dengan head
puts("Data-data di dalam linked list dari depan ke belakang : \n");
do{
printf("%i ", tampil->data); //menampilkan nilai tampil->data
tampil = tampil->next; //tampil bergeser ke node selanjutnya
}
while(tampil != head); //looping terjadi selama tampil tidak sama dengan head
}
else //jika linked list kosong...
puts("Linked list masih kosong!\n"); //...maka ditampilkan pesan
getch(); } void cetakbelakang() {
DNode *tampil, *bantu; //deklarasi pointer tampil dan bantu
if(isEmpty() == 0){ //jika linked list tidak kosong...
tampil = head->prev; //...posisi tampil berada pada node yg ditunjuk oleh head->prev
bantu = tampil; //posisi bantu sama dengan posisi tampil
puts("Data-data di dalam linked list dari belakang ke depan: \n");
do{
printf("%i ", tampil->data); //menampilkan nilai tampil->data
tampil = tampil->prev; //tampil bergeser ke node sebelumnya
}
while(tampil != bantu); //looping terjadi selama tampil tidak sama dengan bantu
}
else //jika linked list kosong...
puts("Linked list masih kosong!\n"); //...maka ditampilkan pesan
getch(); } void caridepan(int cari) {
int i; //deklarasi variabel i sebagai "index" node
int flag = 0; //deklarasi variabel flag sebagai penanda ada tidaknya data yang ditemukan
DNode *find; //deklarasi pointer find
i = 1; //index mula-mula atau index untuk node head
find = head; //posisi find sama dengan head
do{
if(find->data == cari){ //jika nilai find->data sama dengan nilai cari...
flag = 1; //...maka nilai variabel flag diubah menjadi 1
printf("Data %i berada pada posisi ke-%i\n", cari, i);
}
i++; //variabel i di-increment pada setiap looping
find = find->next; //find bergeser ke node selanjutnya
}
while(find != head); //looping terjadi selama posisi find tidak sama dengan head
if(flag == 0) //jika nilai flag sama dengan 0, berarti tidak ada data yang ditemukan
printf("Data %i yang dicari tidak ada di dalam linked list!\n", cari);
getch(); } void caribelakang(int cari) {
int i; //deklarasi variabel i sebagai "index" node
int flag = 0; //deklarasi variabel flag sebagai penanda ada tidaknya data yang ditemukan
DNode *find, *bantu; //deklarasi pointer find dan bantu
i = countNode(); //index mula-mula atau index untuk node paling belakang
find = head->prev; //posisi find berada pada node yang ditunjuk oleh head->prev
bantu = find; //posisi bantu sama dengan find
do{
if(find->data == cari){ //jika nilai find->data sama dengan nilai cari...
flag = 1; //...maka nilai variabel flag diubah menjadi 1
printf("Data %i berada pada posisi ke-%i\n", cari, i);
}
i--; //variabel i di-decrement pada setiap looping
find = find->prev; //find bergeser ke node sebelumnya
}
while(find != bantu); //looping terjadi selama posisi find tidak sama dengan bantu
if(flag == 0) //jika nilai flag sama dengan 0, berarti tidak ada data yang ditemukan
printf("Data %i yang dicari tidak ada di dalam linked list!\n", cari);
getch(); }
Screenshot Program :










1 comments:
itu pake program apa gan...
Posting Komentar