Antrian Melingkar di C: Bagaimana Menerapkannya?

Diterbitkan: 2020-10-23

Data disusun dalam antrian melingkar dalam pola melingkar dimana elemen terakhir terhubung dengan elemen pertama. Berbeda dengan antrian linier di mana tugas dijalankan pada FIFO (First In First Out), urutan antrian melingkar dari eksekusi tugas dapat berubah. Operasi Sisipkan dan Hapus dapat dilakukan di posisi apa pun.

Antrian melingkar lebih efisien daripada antrian linier. Dalam representasi grafis dari antrian melingkar, Anda dapat mengamati bahwa posisi depan dan belakang terhubung, menjadikannya lingkaran di mana operasi selalu dijalankan berdasarkan FIFO. Setiap elemen baru ditambahkan di bagian belakang dan dihapus dari bagian depan. Antrian melingkar memiliki utilisasi yang lebih baik dan memiliki kompleksitas waktu O(1).

Sumber

Daftar isi

Aplikasi Antrian Melingkar

  • Penjadwalan CPU: Antrian melingkar memanfaatkan ruang memori kosong yang ditemukan dalam antrian linier.
  • Sistem Lalu Lintas: Dalam sistem lalu lintas, dengan bantuan antrian melingkar, lampu lalu lintas dioperasikan pada interval waktu yang ditentukan.
  • Manajemen Memori: Sistem operasi sering mengikuti serangkaian proses yang disiapkan untuk dieksekusi atau yang menunggu peristiwa tertentu terjadi.

Pelajari: Program C Untuk Bubble Sorting: Bubble Sort di C

Contoh Kode dengan Penjelasan

Baris 1: // (1) Praprosesor

Baris 2: // Tetapkan Batas Antrian menjadi 5 elemen

Baris 3: #include<stdio.h>

Baris 4: #define LIM 5

Baris 5: // (2) Deklarasi Tipe Data Antrian

Baris 6: // data menyimpan data; delPos, posisi yang akan dihapus; panjang, tidak dari

Baris 7: // elemen saat ini ada dalam antrian

Baris 8: antrian struct typedef {

Baris 9: int data[LIM], delPos, panjang;

Baris 10: } T;

Baris 11: // (3) Deklarasi Global

Baris 12: // Fungsi & variabel global q dari tipe antrian struct

Baris 13: Qq;

Baris 14: void ui_Q_Ops(), insertQel(), deleteQel(), displayQels(), initQ();

Baris 15: // (4) Memanggil Fungsi UI setelah inisialisasi

Baris 16: int utama()

Baris 17: {

Baris 18: initQ();

Baris 19: ui_Q_Ops();

Baris 20: kembalikan 0;

Baris 21: }

Baris 22: // (5) Inisialisasi antrian

Baris 23: batalkan initQ()

Baris 24: {

Baris 25: q.length = 0;

Baris 26: q.delPos = 0;

Baris 27: }

Baris 28: // (6) Menu Driven Loop memanggil fungsi yang benar

Baris 29: batal ui_Q_Ops()

Baris 30: {

Baris 31: int pilihan=0;

Baris 32: masukan karakter[16];

Baris 33: while(pilihan!=4){

Baris 34: printf(" \n ————————-\n “);

Baris 35: printf(” 1. Masukkan ke dalam antrian \n “);

Baris 36: printf(” 2. Hapus dari antrian \n “);

Baris 37: printf(” 3. Menampilkan item antrian \n “);

Baris 38: printf(” 4. Keluar dari program \n “);

Baris 39: printf("Masukkan pilihan : ");

Baris 40: if (fgets(input, 15, stdin) != NULL){

Baris 41: if (sscanf(input, “%d”, &pilihan) == 1){

Baris 42: sakelar (pilihan){

Baris 43: kasus 1: insertQel();

Baris 44: istirahat;

Baris 45: kasus 2: deleteQel();

Baris 46: istirahat;

Baris 47: kasus 3: displayQels();

Baris 48: istirahat;

Baris 49: kasus 4: kembali;

Baris 50: default: printf("Pilihan salah\n ");

Baris 51: lanjutkan;

Baris 52: }

Baris 53: } lain

Baris 54: printf("Pilihan salah \n ");

Baris 55: }

Baris 56: }

Baris 57: }

Baris 58: // (7) Masukkan ke dalam Antrian

Baris 59: // Jika panjangnya sama dengan Batas MAX, antrian penuh, Jika tidak masukkan

Baris 60: // dicapai secara sirkular dengan jumlah panjang dan modulus delPos dengan Batas MAX

Baris 61: // dan pertambahan panjang

Baris 62: batalkan insertQel()

Baris 63: {

Baris 64: int el, inspos;

Baris 65: masukan karakter[16];

Baris 66: if (q.length == LIM){

Baris 67: printf("Antrian penuh \n ");

Baris 68: kembali;

Baris 69: }

Baris 70: inspos = (q.delPos + q.length) % LIM;

Baris 71: printf("Masukkan elemen yang akan disisipkan: ");

Baris 72: if (fgets(input, 15, stdin) != NULL){

Baris 73: if (sscanf(input, “%d”, &el)){

Baris 74: q.data[inspos] = el;

Baris 75: q.length++;

Baris 76: } lain

Baris 77: printf("Input salah \n ");

Baris 78: }

Baris 79: }

Baris 80: // (8) Hapus dari Antrian

Baris 81: // Jika Panjangnya 0, antrian kosong, jika tidak hapus di delPos

Baris 82: // dan kurangi panjangnya

Baris 83: batal deleteQel()

Baris 84: {

Baris 85: if (q.length == 0){

Baris 86: printf("Antrian kosong \n ");

Baris 87: } else {

Baris 88: printf(” Elemen yang dihapus %d \n “, q.data[q.delPos]);

Baris 89: q.delPos = (q.delPos + 1) % LIM;

Baris 90: q.length–;

Baris 91: }

Baris 92: }

Baris 93: // (9) Menampilkan elemen Antrian

Baris 94: // Menampilkan secara melingkar menjalankan loop mulai dari delPos

Baris 95: // dan menambahkan iterator dan modulus dengan Batas Maks

Baris 96: batalkan tampilanQels()

Baris 97: {

Baris 98: int i;

Baris 99: if (q.length == 0){

Baris 100: printf("Antrian kosong \n ");

Baris 101: } else {

Baris 102: printf("Elemen antrian adalah: ");

Baris 103: for(i = 0; i < q.length; i++){

Baris 104: printf(“%d”, q.data[(q.delPos+i)%LIM]);

Baris 105: }

Baris 106: printf("\n");

Baris 107: }

Baris 108: }

Baris 109:

Keluaran:

Operasi pada Antrian Melingkar

1. insertQel() – Memasukkan elemen ke dalam Antrian Edaran

Dalam antrian melingkar, fungsi enQueue() digunakan untuk menyisipkan elemen ke dalam antrian melingkar. Dalam antrian melingkar, fitur baru selalu disisipkan di posisi belakang. Fungsi enQueue() mengambil satu nilai integer sebagai parameter dan memasukkannya ke dalam antrian melingkar. Langkah-langkah berikut diimplementasikan untuk memasukkan elemen ke dalam antrian melingkar:

Langkah 1 – Periksa apakah panjangnya sama dengan Batas MAX. Jika benar, berarti antriannya PENUH. Jika LENGKAP, maka tampilkan “Antrian penuh” dan hentikan fungsi tersebut.

Langkah 2 – Jika TIDAK LENGKAP, masukkan nilai yang diperoleh secara sirkuler dengan jumlah panjang dan modulus delPos dengan Batas MAX dan panjang kenaikan

2. deleteQel() – Menghapus elemen dari Antrian Edaran

Dalam antrian melingkar, deQueue() adalah fungsi yang digunakan untuk menghapus elemen dari antrian melingkar. Dalam antrian melingkar, elemen selalu dihapus dari posisi depan. Fungsi deQueue() tidak mengambil nilai apa pun sebagai parameter. Langkah-langkah berikut diterapkan untuk menghapus elemen dari antrian melingkar…

Langkah 1 – Periksa apakah antrian KOSONG. (depan == -1 && belakang == -1)

Langkah 2 – Jika KOSONG, maka tampilkan “Antrian kosong” dan hentikan fungsinya.

Langkah 3 – Jika TIDAK KOSONG, maka tampilkan elemen yang dihapus sesuai dengan posisinya. Setelah setiap elemen ditambahkan, lanjutkan ke batas antrian mod posisi berikutnya.

3. displayQels() – Menampilkan elemen Queue yang ada di Circular Queue. Langkah-langkah berikut diimplementasikan untuk menampilkan elemen antrian melingkar:

Langkah 1 – Periksa apakah antriannya KOSONG.

Langkah 2 – Jika panjangnya 0, itu KOSONG, maka tampilkan “Antrian kosong” dan hentikan fungsinya.

Langkah 3 – Jika TIDAK KOSONG, maka tentukan variabel integer 'i.'

Langkah 4 – Atur i ke 0.

Langkah 5 – Sekali lagi, tampilkan elemen menurut posisi dan nilai kenaikan satu per satu (i++). Ulangi hal yang sama sampai 'i <q.length' menjadi FALSE.

Circular Queue dapat diimplementasikan dengan menggunakan linked list juga. Berikut ini adalah algoritma:

  • Algoritma untuk Enqueue:

if (FRONT == NULL) // Memasukkan dalam Antrian Kosong

DEPAN = BELAKANG = newNode

berakhir jika

lain

REAR -> next = newNode // Memasukkan setelah elemen terakhir

BELAKANG = newNode

akhiri yang lain

BELAKANG -> berikutnya = DEPAN

Akhiri Antrian

  • Algoritma untuk Dequeue:

if(FRONT == NULL) // Kondisi untuk underflow

Cetak “Antrian Underflow”

akhir Dequeue

berakhir jika

else if(FRONT == REAR) // Antrian hanya berisi satu node

suhu = DEPAN -> data

gratis (temp)

DEPAN = DEPAN -> selanjutnya

BELAKANG -> berikutnya = DEPAN

berakhir jika

else if (FRONT == N – 1) // If FRONT adalah simpul terakhir

front = 0 // Jadikan FRONT sebagai node pertama

berakhir jika

akhir Dequeue

Baca Juga: Python Vs C: Perbandingan Berdampingan Lengkap

Kesimpulan

Struktur Data dan Algoritma sangat penting dan tidak hanya dalam pemrograman C tetapi juga dalam bahasa lain. Nilainya belum pernah terjadi sebelumnya, dan untuk topik yang begitu penting, lebih baik berinvestasi dalam kursus yang dirancang dan dibimbing oleh para ahli, yang akan memberikan nilai tambah yang sangat baik untuk portofolio Anda. upGrad menawarkan berbagai kursus penuh daya yang tidak hanya meningkatkan keterampilan Anda tetapi juga membangun pilar dasar yang kuat.

Ini dirancang oleh IIIT-B yang sangat terkenal, di mana mereka tidak hanya menyediakan konten berkualitas premium tetapi juga menjadikan Anda bagian dari jaringan yang kuat di mana Anda akan terhubung dengan orang-orang yang berkembang di jalur karir yang sama serta pakar industri yang menyelesaikan keraguan Anda dan mendukung Anda setiap saat.

Mengenal mentalitas dan proses berpikir mereka akan membantu Anda. Dan salah satu hal unik yang Anda dapatkan di upGrad adalah Anda dapat memilih opsi EMI dan menghemat kantong Anda.

Kami berharap Anda akan memiliki kesempatan belajar yang sangat baik dalam melaksanakan proyek-proyek C ini. Jika Anda tertarik untuk mempelajari lebih lanjut dan membutuhkan bimbingan dari pakar industri, lihat Diploma PG Tingkat & IIIT Banglore dalam Pengembangan Perangkat Lunak Tumpukan Penuh .

Persiapkan Karir Masa Depan

UPGRAD DAN DIPLOMA PG IIIT-BANGALORE DALAM PENGEMBANGAN PERANGKAT LUNAK FULL STACK
Lamar Sekarang