Queue dengan Linked List

Oke temen temen semua, jika sebelumnya kita sudah membahas Queue dengan Array, kali ini kita akan menggunakan Linked List untuk membuat antrian. Bagi yang belum tau apa itu Queue? Queue atau antrian merupakan struktur data yang berisi kumpulan data dimana Queue ini bersifat FIFO (First In First Out) yaitu data yang pertama masuk akan menjadi yang pertama keluar. Untuk lebih detailnya sudah kita bahas sebelumnya disini. Sekarang kita fokus ke implementasinya.

Queue dengan Linked List
Ilustrasi Enqueue dan Dequeue

Penggunaan Linked List pada Queue ini sama saja dengan menggunakan Linked List pada umumnya. Hanya saja kita lebih fokus ke sifat dari Queue tersebut, yaitu FIFO (First In First Out). Jadi sangat disarankan bagi kamu yang belum memahami mengenai Linked List untuk dapat memahaminya terlebih dahulu.

Operasi Dequeue

Ilustrasi Dequeue

Operasi dequeue pada Queue yang menerapkan linked list akan menghapus node yang berada di bagian awal linked list yaitu node front/head. Kemudian node front pun akan digantikan dengan node setelahnya dan node akan digeser.

Seperti pada ilustrasi di samping, terdapat proses dequeue yaitu dengan mengeluarkan node bernilai 9. Pengeluarkan ini akan memutuskan pointer pada node 9 yang menunjuk ke node selanjutnya. Kemudian, node setelah node front akan menjadi node front yang baru.

Operasi Enqueue

Ilustrasi Enqueue

Operasi enqueue pada Queue yang menerapkan linked list akan menambahkan node baru dibagian akhir linked list, jadi node baru tersebut akan menjadi tail/rear pada linked list. Seperti pada ilustrasi di atas, dimana terdapat queue dengan linked list dan sedang terjadi enqueue yaitu penambahan node dengan nilai 15. Karena penambahan di akhir maka node yang ditambahkan harus menunjuk ke null, kemudian node rear dengan nilai 7 akan ditunjuk ke node yang baru yaitu node 15.

Penerapan dalam C++

Source Code

#include <iostream>
using namespace std;

// node using struct
struct antrian{
    string nama;
    int umur;

    antrian *next;
}; 
antrian *head, *tail, *newNode, *cur, *del;

// prototipe fungsi
int countAntrian();
bool isEmpty();
void enqueue(string nama, int umur);
void dequeue();
void display();
void clear();

/*
 * Main Function
 */
int main(){

    enqueue("Kang Mikirin Kode", 23);
    display();

    enqueue("Ezio", 29);
    enqueue("Hayabusa", 35);
    enqueue("Sarah Kerrigan", 26);
    enqueue("Yuki", 20);
    enqueue("Arthas Menethil", 40);
    display();

    dequeue();
    dequeue();
    display();
 
    clear();
    display();

    cout << "Jumlah antrian: " << countAntrian() << endl;
    return 0;
}

/*
 * Operasi Linked List
 */

// penambahan data antrian
void enqueue(string nama, int umur){
    if(isEmpty()){
        head = new antrian();
        head->nama = nama;
        head->umur = umur;
        head->next = NULL;
        tail = head;
        cout << "berhasil menambahkan elemen baru" << endl;
    } else{
        newNode = new antrian();
        newNode->nama = nama;
        newNode->umur = umur;
        newNode->next = NULL;
        tail->next = newNode;
        tail = newNode;
        cout << "berhasil menambahkan elemen baru" << endl;
    }
}


// pengeluaran data antrian
void dequeue(){
    if(isEmpty()){
        cout << "Antrian kosong" << endl;
    } else{
        del = head;
        head = head->next;
        del->next = NULL;
        delete del; 
        cout << "berhasil mengeluarkan elemen pertama" << endl;
    }
}

// fungsi untuk menghitung jumlah node (elemen) pada queue
int countAntrian(){
    if(head == NULL){
        return 0;
    } else{
        int counter = 0;
        cur = head;
        while(cur != NULL){
            counter++;
            cur = cur->next;
        }
        return counter;
    }
}

// fungsi untuk mengecek bahwa antrian kosong atau tidak
bool isEmpty(){
    if(countAntrian() == 0){
        return true;
    } else{
        return false;
    }
}


// fungsi untuk mencetak nilai pada antrian
void display(){
    cout << "Data Antrian:" << endl;
    if(isEmpty()){
        cout << "Antrian kosong" << endl;
    } else{
        cout << "Jumlah data: " << countAntrian() << endl;
        cur = head;
        int nomor = 0;
        while(cur != NULL){
            cout << nomor+1 << ". " << cur->nama << " - " << cur->umur << " tahun." << endl;
            cur = cur->next;
            nomor++;
        }
    }
    cout << endl;
}

// fungsi untuk menghapus seluruh data pada antrian
void clear(){
    if(isEmpty()){
        cout << "Antrian Kosong" << endl;
    } else {
        head->next = NULL;
        head = NULL;
        cout << "menghapus seluruh data pada Queue" << endl;
        
        cur = head;
        while(cur != NULL){
            del = cur;
            cur = cur->next;
            
            // menghapus node
            del->next = NULL;
            delete del;
        }
        head = NULL;
    }
}

Output

berhasil menambahkan elemen baru
Data Antrian:
Jumlah data: 1
1. Kang Mikirin Kode - 23 tahun.

berhasil menambahkan elemen baru
berhasil menambahkan elemen baru
berhasil menambahkan elemen baru
berhasil menambahkan elemen baru
berhasil menambahkan elemen baru
Data Antrian:
Jumlah data: 6
1. Kang Mikirin Kode - 23 tahun.
2. Ezio - 29 tahun.
3. Hayabusa - 35 tahun.
4. Sarah Kerrigan - 26 tahun.
5. Yuki - 17 tahun.
6. Arthas Menethil - 40 tahun.

berhasil mengeluarkan elemen pertama
berhasil mengeluarkan elemen pertama
Data Antrian:
Jumlah data: 4
1. Hayabusa - 35 tahun.
2. Sarah Kerrigan - 26 tahun.
3. Yuki - 17 tahun.
4. Arthas Menethil - 40 tahun.

menghapus seluruh data pada Queue
Data Antrian:
Antrian kosong

Jumlah antrian: 0

Kesimpulan

Queue dengan menggunakan Linked List pada dasarnya sama dengan menggunakan Linked List pada umumnya. Hanya saja lebih menekankan pada sifat FIFO dari Queue tersebut. Oke teman teman kita sudah mengimplementasikan Linked List pada Queue. Terima kasih Sudah membaca.

Keep ngoding and have a nice day

Share ke temen temen lainnya

Leave a Reply

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *