Klik iklan untuk menghilangkan

Selasa, 30 April 2013

Program Linked List Sederhana

Berikut adalah Program Double Linked List sederhana yang memiliki fungsi penambahan, penghapusan, tampil, pencarian, dan bersihkan data.
 

/*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:

Anonim mengatakan...

itu pake program apa gan...

Posting Komentar