Minggu, 20 Desember 2015

Single Link List

Single Linked List dikembangkan pada tahun 1955-1956 oleh Allen Newell, Cliff Shaw dan Herbert Simon di RAND Corporation sebagai struktur data utama untuk bahasa Information Processing Language (IPL).
 Pengertian:
1. Single : artinya field pointer-nya hanya satu buah saja dan satu arah serta pada akhir node pointernya menunjuk NULL. 
2. Linked List : artinya node-node tersebut saling terhubung satu sama lain. 
3. Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data. 
4. Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list. 

Single linked list adalah linked list dengan simpul berisi satu link / Pointer yang mengacu kesimpul berikutnya.
single link list terbagi menjadi 2 macam, yaitu :
- single link list circular
- single link list non circular


- Contoh Program dalam C++ (delete head)

//SINGLE LINKED LIST NON CIRCULAR
//IDE VS12 Express
//by [RS]
#include <iostream>
#include <conio.h>
#include <iomanip> //setw()
using namespace std;

struct node
{
      int data;
      node* next; // untuk menghubungkan dengan node lain, tipe data dibuat sama seperi aturan penggunaan pointer.
};

node* head;
node* tail;
node* curr;
node* entry;
node* del;

void inisialisasi()
{
      head = NULL;
      tail = NULL;
}

void input(int dt)
{
      entry = (node* )malloc(sizeof(node)); //alokasi memori
      entry->data = dt;
      entry->next = NULL;
      if(head==NULL)
      {
            head = entry;
            tail = head;
      }
      else
      {
            tail->next = entry;
            tail = entry;
      }
}

void hapus()
{
      int simpan;
      if(head==NULL)
      {
            cout<<"\nlinked list kosong, penghapusan tidak bisa dilakukan"<<endl;
      }
      else
      {
            simpan  = head ->data;
            cout<<"\ndata yang dihapus adalah "<<simpan<<endl;
            //hapus depan
            del = head;
            head = head->next;
            delete del;
      }
}

void cetak()
{
      curr = head;
      if(head == NULL)
            cout<<"\ntidak ada data dalam linked list"<<endl;
      else
      {
            cout<<"\nData yang ada dalam linked list adalah"<<endl;
            cout<<setw(6);
            while(curr!=NULL)
            {
                  cout<<curr->data<<"->";
                  curr = curr->next;
            }
            cout<<endl;
      }

}

void menu()
{
      char pilih, ulang;
      int data;

      do
      {
      system("cls");
      cout<<"\t        SIGIT HARYO P & RINI PUJI LESTARI"<<endl;
      cout<<"\t            SINGLE LINK LIST"<<endl;
      cout<<"Menu : "<<endl;
      cout<<"1. Input data"<<endl;
      cout<<"2. Hapus data"<<endl;
      cout<<"3. Cetak Data"<<endl;
      cout<<"4. Exit"<<endl;
      cout<<"Masukkan pilihan Anda : ";
      cin>>pilih;

      switch(pilih)
      {
      case '1' :
            cout<<"\nMasukkan data : ";
            cin>>data;
            input(data);
            break;
      case '2' :
            hapus();
            break;
      case '3' :
            cetak();
            break;
      case '4' :
            exit(0);
            break;
      default :
            cout<<"\nPilih ulang"<<endl;
      }
      cout<<"\nKembali ke menu?(y/n)";
      cin>>ulang;
      }while(ulang=='y' || ulang=='Y');
}


int main()
{

      inisialisasi();
      menu();

      return EXIT_SUCCESS;
}

(Tampilan awal program dalam c++)
(Tampilan list terisi 3 data dengan data head nya 10)

(Tampilan setelah dimasukkan perintah 2 / delete head)

- Contoh Program Single Link List Lainnya

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
//#include <alloc.h>

using namespace std;

int pil;
void pilih();
void buat_baru();
void tambah_belakang();
void tambah_depan();
void hapus_belakang();
void hapus_depan();
void tampil();

struct simpul
{
    char nim[8], nama [20];
    int umur;
    struct simpul *next;
} mhs, *baru, *awal=NULL, *akhir=NULL,*hapus,*bantu;

void clrscr()
{
    system("cls");
}


int main()
{
    do
    {
        clrscr();
        cout<<"            UNIVERSITAS BANTEN JAYA"<<endl;
        cout<<"          STRUKTUR DATA SINGLE LINKED LIST"<<endl;
        cout<<"        RINI PUJI LESTARI & SIGIT HARYO PAMUNGKAS"<<endl;
        cout<<"1. Tambah Depan"<<endl;
        cout<<"2. Tambah Belakang"<<endl;
        cout<<"3. Hapus Depan"<<endl;
        cout<<"4. Hapus Belakang"<<endl;
        cout<<"5. Tampilkan"<<endl;
        cout<<"6. Selesai"<<endl;
        cout<<"Pilihan Anda : ";
        cin>>pil;
        pilih();
    } while(pil!=6);
    return 0;
}

void pilih()
{
    if(pil==1)
        tambah_depan();
    else if(pil==2)
        tambah_belakang();
    else if(pil==3)
        hapus_depan();
     else if(pil==4)
        hapus_belakang();
      else if(pil==5)
        tampil();
    else
        cout<<"selesai";
}

void buat_baru()
{
    baru=(simpul*)malloc(sizeof(struct simpul));
    cout<<"input nim   : ";cin>>baru->nim;
    cout<<"input nama  : ";cin>>baru->nama;
    cout<<"input umur  : ";cin>>baru->umur;
    baru->next=NULL;
}

void tambah_belakang()
{
    buat_baru();
    if(awal==NULL)
    {
        awal=baru;
    }
    else
    {
        akhir->next=baru;
    }
    akhir=baru;
    akhir->next=NULL;
    cout<<endl<<endl;
    tampil();
}

void tambah_depan()
{
    buat_baru();
    if(awal==NULL)
    {
        awal=baru;
        akhir=baru;
        akhir->next=NULL;
    }
    else
    {
        baru->next=awal;
        awal=baru;
    }
    cout<<endl<<endl;
    tampil();
}

void hapus_depan()
{
    if (awal==NULL)
        cout<<"Kosong";
    else
    {
        hapus=awal;
        awal=awal->next;
        free(hapus);
    }
   cout<<endl<<endl;
    tampil();
}

void hapus_belakang()
{
    if (awal==NULL)
        cout<<"Kosong";
    else if(awal==akhir)
    {
         hapus=awal;
         awal=awal->next;
         free(hapus);
    }
    else
    {
        hapus=awal;
        while(hapus->next!=akhir)
             hapus=hapus->next;
        akhir=hapus;
        hapus=akhir->next;
        akhir->next=NULL;
        free(hapus);
    }
    cout<<endl<<endl;
    tampil();
}

void tampil()
{
     if (awal==NULL)
          cout<<"Kosong";
     else
     {
         bantu=awal;
         while(bantu!=NULL)
         {
            cout<<"nim : "<<bantu->nim;
            cout<<"  nama : "<<bantu->nama;
            cout<<"  umur : "<<bantu->umur<<endl;
            bantu=bantu->next;
         }
     }
     getch();
}




- Soal Single Link List dan Pengerjaannya

 jawab :
 1. MAHASISWA

          INFO        LINK
1          -           
2          W -->    11(data A setelah W)  step 8
3          M -->     4 (data A setelah M)  step1
4          A  -->     9(data H setelah A)   step 2
5          S   -->    7(data I setelah S)      step 5
6          -
7          I    -->    8(data S setelah I)     step 6
8          S   -->    2(data W setelah S)   step 7
9          H  -->    10(data A setelah H)  step 3
10        A  -->     5(data S setelah A)    step 4
11        A  -->     3/0(data M / no data) step 9

keterangan :
--> sebagai pointer yang menunjuk ke data setelahnya.
Untuk penerapan single link list circular setelah data A yang terakhir maka pointernya kembali lagi pada data Head nya yaitu M di data ke 3 , sedangkan untuk single link list non circular pointernya menunjuk ke null yang berarti 0 / tidak ada data lagi.

2. DOUBLE LINK LIST

            INFO       LINK
1          D  -->    15(data O setelah D)      step1
2          K  -->      7(data space setelah K) step11
3          -   -->     14(data L setalah space) step7
4          U  -->      5(data B setelah U)       step3
5          B  -->      6(data L setelah B)        step4
6          L  -->       9(data E setelah L)       step5
7          -   -->     17(data L setelah space) step12
8          N  -->      2(data K setelah N)       step10
9          E  -->      3(data space setelah E)  step6
10        I  -->       8(data N setelah I)         step9
11        S  -->    18(data T setelah S)         step 15
12        -  -->
13       I  -->      11(data S setelah I)          step14
14       L  -->     10(data I setelah L)          step8
15       O  -->      4(data U setelah O)         step2
16       -   -->
17       L  -->     13(data I setelah L)          step13
18       T  -->      1/ 0 (data D / 0)               step16

keterangan :
--> sebagai pointer yang menunjuk ke data setelahnya.
Untuk penerapan single link list circular setelah data T yang terakhir maka pointernya kembali lagi pada data Head nya yaitu D di data ke 1 , sedangkan untuk single link list non circular pointernya menunjuk ke null yang berarti 0 / tidak ada data lagi.

Untuk soal no 3 dan 4 silahkan dicoba dirumah guys,
semangat belajar guys! thanks a lot


4 komentar: