Our Blog

Double Link List Circular

Double Link List Circular


struct simpul{
       int data;
       simpul *next, *prev;
       } *awal=NULL,*akhir=NULL,*baru, *bantu, *hapus;
      
void tambah_awal(int x){ //doubly linked list circular
     baru = new simpul; //membuat node baru
     baru->data=x; //masukkan data ke node baru
     baru->next=NULL;
     baru->prev=NULL;
     if(awal==NULL){ //apabila belum pernah membuat node, maka awal dan akhir adalah baru
        awal = akhir = baru;
          baru->next = baru ; //menunjuk ke
          baru->prev = baru ; //         dirinya sendiri
        }
     else {
          baru->next=awal; //baru->next menunjuk ke awal
          awal->prev=baru; //awal->prev menunjuk ke baru
          baru->prev=akhir; //baru->prev menunjuk ke akhir
          akhir->next=baru; //akhir->next menunjuk ke baru
          awal=baru;
          }
}

void tambah_akhir(int x){ //doubly linked list circular
     baru = new simpul; //membuat node baru
     baru->data=x; //masukkan data ke node baru
     baru->next=NULL;
     baru->prev=NULL;
     if(awal==NULL){ //apabila belum pernah membuat node, maka awal dan akhir adalah baru
        awal = akhir = baru;
          baru->next = baru ; //baru menunjuk ke
          baru->prev = baru ; //           dirinya sendiri
        }
     else {
          baru->next=awal; //baru->next menunjuk ke awal
          awal->prev=baru; //awal->prev menunjuk ke baru
          akhir->next=baru; //akhir->next menunjuk baru
          baru->prev=akhir; //baru->prev menunjuk ke akhir
          akhir=baru; //baru menjadi akhir
          }
     }
    
    
void insert_tengah(int x)
{
     int count = 2, pos;
     baru=new simpul;         //membuat node baru
     baru->data=x;                              //masukkan data ke node
     baru->next=NULL;
     baru->prev=NULL;         
     cout<<"Masukan data pada posisi ke = "; cin>>pos; //masukkan node ke posisi
   
     bantu=awal;
     while(bantu){
                  if(count == pos) //berheenti di posisi sebelum node yang akan ditambahkan
                  {
                              baru->next=bantu->next; //baru->next mengarah seperti arah bantu->next
                              bantu->next->prev=baru; //node setelah bantu prevnya mengarah ke node baru
                              baru->prev=bantu; //baru->prev mengarah ke bantu
                              bantu->next=baru; //bantu->next mengarah ke baru
                              break; //menghentikan while-do
                  }
                  bantu=bantu->next; //pindah ke node selanjutnya
                  count++;
                  }
  
}

void hapus_posisi(int number){
     int count=1;
     bantu=awal;
     while(bantu!=NULL){
             if(count==number-1){ //berhenti di posisi sebelum node yang akan dihapus
                                 hapus=bantu->next; //hapus menjadi node setelah bantu
                                 hapus->next->prev=bantu; //node setelah hapus prevnya mengarah ke bantu
                                 bantu->next=hapus->next; //bantu->next mengarah sama seperti hapus->next
                                 delete hapus; //delete hapus
                                 break;
             }
             count++;
             bantu=bantu->next;                      
     }
}

void hapus_awal(){
    if(awal!=akhir){
    hapus = awal;
       awal = awal->next;
    akhir->next = awal;
    awal->prev = akhir;
    delete hapus;}
    else{
        awal=akhir=NULL;
    }
}

void hapus_akhir(){
    if(akhir!=awal){
    hapus = akhir;
       akhir = akhir->prev;
    akhir->next = awal;
    awal->prev = akhir;
    delete hapus;
    }
    else{
        awal=akhir=NULL;
    }
}

void print(){
    bantu=awal;
    if(awal!=NULL){
       do{ //eksekusi terlebih dahulu setelah itu di cek


             cout<<"["<<bantu->data<<"] "; //print dimulai dari depan


             bantu=bantu->next;       //pindah ke belakang dan seterusnya


       }while(bantu!=awal); //berhenti ketika bantu sama dengan head
    }

}


int main()

    {

        int choice, num;//declaration variable

        while (1)//looping while condition

        {
            system("cls");//to clear screen
           
            cout<<"1.Insert Depan "<<endl;

            cout<<"2.Insert Belakang "<<endl;

            cout<<"3.Insert Tengah"<<endl;

            cout<<"4.Delete Depan"<<endl;

            cout<<"5.Delete Belakang "<<endl;

            cout<<"6.Delete Posisi"<<endl;

            cout<<"7.Print"<<endl;
           
            cout<<"8.Exit"<<endl;
           
            cout<<"Enter your choice : ";

            cin>>choice;//to input the value of choise based on menu

            switch(choice)//switch condition

            {

            case 1://to insert data in forward
                cout<<"Masukkan data : "; cin>>num;
                tambah_awal(num);
                break;

            case 2://to insert data in backward
                cout<<"Masukkan data : "; cin>>num;
                tambah_akhir(num);
                break;

            case 3://to insert data in middle or in position what user wants
                cout<<"Masukkan data : "; cin>>num;
                insert_tengah(num);//called function
                break;
           
            case 4://to delete data in forward
                hapus_awal();//called function
                break;

            case 5://to delete data or list in backward
                hapus_akhir();
                break;

            case 6://to delete list
                cout<<"Hapus data ke "; cin>>num;
                hapus_posisi(num);
                break;
           
            case 7://to display list
                print();
                getch();
                break;

            case 8://to exit program

                exit(1);

            default://if user not choose of the choices

                cout<<"Wrong choice"<<endl;//display the sentence

            }

        }

    }
 

No comments:

Post a Comment

All about Math Designed by Templateism | MyBloggerLab Copyright © 2014

Theme images by richcano. Powered by Blogger.