• Tidak ada hasil yang ditemukan

Contoh Queue dalam Struktur data

N/A
N/A
Protected

Academic year: 2018

Membagikan "Contoh Queue dalam Struktur data"

Copied!
6
0
0

Teks penuh

(1)

!"#$"%&'"()&*+)+)&,&-.//011&2$3+4$+3&56$6&(6768&96%6:6&!&

;78<&/

/6

queue.h

/* deklarasi Queue yang diimplementasi dengan tabel kontigu */ /* HEAD dan TAIL adalah alamat elemen pertama dan terakhir */ /* Queue mampu menampung MaxEl buah elemen */

#ifndef queue_H #define queue_H #include "boolean.h" #include <stdlib.h> #define Nil 0

/* Definisi elemen dan address */ typedef int infotype;

typedef int address; /* indeks tabel */

/* Contoh deklarasi variabel bertype Queue : */

/*Versi I: tabel dinamik,Head dan Tail eksplisit, ukuran disimpan */ typedef struct { infotype * T; /* tabel penyimpan elemen */

address HEAD; /* alamat penghapusan */ address TAIL; /* alamat penambahan */ int MaxEl; /* MAx elemen queue */ } Queue;

/*Definisi Queue kosong: Head=Nil; TAIL=Nil.*/

/* Catatan implementasi: T[0] tidak pernah dipakai */ /**** AKSES (Selektor) *****/

/* Jika Q adalah Queue, maka akses elemen : */ #define Head(Q) (Q).HEAD

#define Tail(Q) (Q).TAIL

#define InfoHead(Q) (Q).T[(Q).HEAD] #define InfoTail(Q) (Q).T[(Q).TAIL] #define MaxEl(Q) (Q).MaxEl

/* Prototype */

boolean IsEmpty (Queue Q);

/* Mengirim true jika Q kosong: lihat definisi di atas */ boolean IsFull(Queue Q);

/*Mengirim true jika tabel penampung elemen Q sudah penuh */ /* yaitu mengandung MaxEl elemen */

int NBElmt(Queue Q);

/* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong */ /**** Kreator ***/

void CreateEmpty(Queue *Q, int Max); /* I.S. sembarang */

/* F.S. Sebuah Q kosong terbentuk dan salah satu kondisi sbb: */ /* Jika alokasi berhasil, Tabel memori dialokasi berukuran Max */ /* atau : jika alokasi gagal, Q kosong dg Maksimum elemen=0 */ /* Proses : Melakukan alokasi,Membuat sebuah Q kosong */ /**** Destruktor ***/

void DeAlokasi(Queue *Q);

/* Proses: Mengembalikan memori Q */ /* I.S. Q pernah dialokasi */

/* F.S. Q menjadi tidak terdefinisi lagi, MaxEl(Q) diset 0 */ /**** Primitif Add/Delete ****/

void Add (Queue * Q, infotype X);

/* Proses: Menambahkan X pada Q dengan aturan FIFO */

/* I.S. Q mungkin kosong, tabel penampung elemen Q TIDAK penuh */ /* F.S. X menjadi TAIL yang baru, TAIL "maju" */

/* Jika Tail(Q)=MaxEl+1 maka geser isi tabel, shg Head(Q)=1 */ void Del(Queue * Q, infotype* X);

/* Proses: Menghapus X pada Q dengan aturan FIFO */ /* I.S. Q tidak mungkin kosong */

(2)

!"#$"%&'"()&*+)+)&,&-.//011&2$3+4$+3&56$6&(6768&96%6:6&!&

;78<&1

/6

queue.c

#include "queue.h"

boolean IsEmpty (Queue Q) {

return ((Head(Q)==Nil) && (Tail(Q)==Nil)); }

boolean IsFull(Queue Q) {

return (NBElmt(Q)==MaxEl(Q)); }

int NBElmt(Queue Q) { if (IsEmpty(Q)) {

return 0; } else {

return (Tail(Q)-Head(Q)+1); }

}

void CreateEmpty(Queue *Q, int Max) {

(*Q).T = malloc ((Max+1) * sizeof *(*Q).T); if ((*Q).T != NULL) {

Head(*Q) = Nil; Tail(*Q) = Nil; MaxEl(*Q) = Max; } else {

Head(*Q) = Nil; Tail(*Q) = Nil; MaxEl(*Q) = 0; }

}

void DeAlokasi(Queue *Q) { free((*Q).T); (*Q).T = NULL; Head(*Q) = Nil; Tail(*Q) = Nil; MaxEl(*Q) = 0; }

void Add (Queue * Q, infotype X) { int i, n;

if (Tail(*Q)==MaxEl(*Q)) { n = NBElmt(*Q);

for (i=1; i<=n; i++) {

(*Q).T[i] = (*Q).T[Head(*Q)+i-1]; }

Head(*Q) = 1; Tail(*Q) = n; }

if (IsEmpty(*Q)) { Head(*Q) = 1; }

Tail(*Q) = Tail(*Q) + 1; InfoTail(*Q) = X;

}

void Del(Queue * Q, infotype* X) { *X = InfoHead(*Q);

(3)

!"#$"%&'"()&*+)+)&,&-.//011&2$3+4$+3&56$6&(6768&96%6:6&!&

;78<&0

/6

Head(*Q) = Head(*Q) + 1;

} }

mqueue.c

#include "queue.h"

int main() { Queue Q; int i;

CreateEmpty(&Q, 5);

printf("Empty: %d, Full: %d, NBElmt: %d\n", IsEmpty(Q), IsFull(Q), NBElmt(Q));

for (i=0; i<5; i++) { Add(&Q, i+1);

printf("Empty: %d, Full: %d, NBElmt: %d\n", IsEmpty(Q), IsFull(Q), NBElmt(Q));

}

Del(&Q, &i);

printf("Del: %d\n", i); Del(&Q, &i);

printf("Del: %d\n", i);

for (i=0; i<2; i++) { Add(&Q, i+1);

printf("Empty: %d, Full: %d, NBElmt: %d\n", IsEmpty(Q), IsFull(Q), NBElmt(Q));

}

for (i=1; i<=MaxEl(Q); i++) {

printf("T[%d]: %d", i, Q.T[i]);

if (i==Head(Q)) { printf(" <= HEAD"); } if (i==Tail(Q)) { printf(" <= TAIL"); } printf("\n");

}

(4)

!"#$"%&'"()&*+)+)&,&-.//011&2$3+4$+3&56$6&(6768&96%6:6&!&

;78<&=

/6

queues.h

/* deklarasi Queue yang diimplementasi dengan tabel kontigu */ /* HEAD dan TAIL adalah alamat elemen pertama dan terakhir */

/* Kapasitas Queue=MaxEl buah elemen, dan indeks dibuat “sirkuler” */ #ifndef queues_H

#define queues_H #include "boolean.h" #include <stdlib.h> #define Nil 0

/* Definisi elemen dan address */ typedef int infotype;

typedef int address; /* indeks tabel */

/* Contoh deklarasi variabel bertype Queue : */

/*Versi I: tabel dinamik,Head dan Tail eksplisit, ukuran disimpan */ typedef struct { infotype * T; /* tabel penyimpan elemen */

address HEAD; /* alamat penghapusan */ address TAIL; /* alamat penambahan */ int MaxEl; /* MAx elemen queue */ } Queue;

/*Definisi Queue kosong: Head=Nil; TAIL=Nil.*/

/* Catatan implementasi: T[0] tidak pernah dipakai */ /**** AKSES (Selektor) *****/

/* Jika Q adalah Queue, maka akses elemen : */ #define Head(Q) (Q).HEAD

#define Tail(Q) (Q).TAIL

#define InfoHead(Q) (Q).T[(Q).HEAD] #define InfoTail(Q) (Q).T[(Q).TAIL] #define MaxEl(Q) (Q).MaxEl

/* Prototype */

boolean IsEmpty (Queue Q);

/* Mengirim true jika Q kosong: lihat definisi di atas */ boolean IsFull(Queue Q);

/*Mengirim true jika tabel penampung elemen Q sudah penuh */ /* yaitu mengandung MaxEl elemen */

int NBElmt(Queue Q);

/* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong */ /**** Kreator ***/

void CreateEmpty(Queue *Q, int Max); /* I.S. sembarang */

/* F.S. Sebuah Q kosong terbentuk dan salah satu kondisi sbb: */ /* Jika alokasi berhasil, Tabel memori dialokasi berukuran Max */ /* atau : jika alokasi gagal, Q kosong dg Maksimum elemen=0 */ /* Proses : Melakukan alokasi,Membuat sebuah Q kosong */ /**** Destruktor ***/

void DeAlokasi(Queue *Q);

/* Proses: Mengembalikan memori Q */ /* I.S. Q pernah dialokasi */

/* F.S. Q menjadi tidak terdefinisi lagi, MaxEl(Q) diset 0 */ /**** Primitif Add/Delete ****/

void Add (Queue * Q, infotype X);

/* Proses: Menambahkan X pada Q dengan aturan FIFO */

/* I.S. Q mungkin kosong, tabel penampung elemen Q TIDAK penuh */ /* F.S. X menjadi TAIL yang baru, TAIL "maju" */

/* Jika Tail(Q)=MaxEl+1 maka Tail(Q) diset =1 */ void Del(Queue * Q, infotype* X);

/* Proses: Menghapus X pada Q dengan aturan FIFO */ /* I.S. Q tidak mungkin kosong */

/* F.S. X = nilai elemen HEAD pd I.S.,Jika Head(Q)=MaxEl+1, */ /* Head(Q) diset=1; Q mungkin kosong */

(5)

!"#$"%&'"()&*+)+)&,&-.//011&2$3+4$+3&56$6&(6768&96%6:6&!&

;78<&>

/6

queues.c

/* File :queues.c */ #include "queues.h"

boolean IsEmpty (Queue Q) {

return ((Head(Q)==Nil) && (Tail(Q)==Nil)); }

boolean IsFull(Queue Q) {

return (NBElmt(Q)==MaxEl(Q)); }

int NBElmt(Queue Q) { if (IsEmpty(Q)) {

return 0; } else {

if (Tail(Q)>=Head(Q)) {

return (Tail(Q)-Head(Q)+1); } else {

return (MaxEl(Q)-Head(Q)+1 + Tail(Q)); }

} }

void CreateEmpty(Queue *Q, int Max) {

(*Q).T = malloc ((Max+1) * sizeof *(*Q).T);

void DeAlokasi(Queue *Q) { free((*Q).T);

if (Tail(*Q)==MaxEl(*Q)) { Tail(*Q) = 1;

if (Head(*Q)==Tail(*Q)) { Head(*Q) = Nil; Tail(*Q) = Nil; } else {

(6)

!"#$"%&'"()&*+)+)&,&-.//011&2$3+4$+3&56$6&(6768&96%6:6&!&

;78<&?

/6

mqueues.c

#include "queue.h"

int main() { Queue Q; int i;

CreateEmpty(&Q, 5);

printf("Empty: %d, Full: %d, NBElmt: %d\n", IsEmpty(Q), IsFull(Q), NBElmt(Q));

for (i=0; i<5; i++) { Add(&Q, i+1);

printf("Empty: %d, Full: %d, NBElmt: %d\n", IsEmpty(Q), IsFull(Q), NBElmt(Q));

}

Del(&Q, &i);

printf("Del: %d\n", i); Del(&Q, &i);

printf("Del: %d\n", i);

for (i=0; i<2; i++) { Add(&Q, i+1);

printf("Empty: %d, Full: %d, NBElmt: %d\n", IsEmpty(Q), IsFull(Q), NBElmt(Q));

}

for (i=1; i<=MaxEl(Q); i++) {

printf("T[%d]: %d", i, Q.T[i]);

if (i==Head(Q)) { printf(" <= HEAD"); } if (i==Tail(Q)) { printf(" <= TAIL"); } printf("\n");

}

Referensi

Dokumen terkait

Pada hari ini Selasa Tanggal Dua Puluh Bulan Enam Tahun Dua Ribu Tujuh Belas kami POKJA Konstruksi dan Barang yang dibentuk berdasarkan Surat Keputusan Kepala

Kondisi ini diduga memengaruhi perbedaan RGR kedua perlakuan tersebut (C, D), di mana pada kondisi lingkungan media budidaya yang berbeda, dengan FCR yang sama,

Berdasarkan data yang diperoleh dari informan ungkapan kepercayaan rakyat saat mayat dibawa kekuburan yang terdapat dikanagarian Salayo Kecamatan Kubung

Pada Kepengurusan Racana Wijaya Gugus Depan Kota Semarang 14.11L-L4.LL2 Universitas Negeri Semarang Tahun 2011. Semoga dapat berkarya dan meningkatkan prestasi dalam

Suatu keluarga batih dianggap sebagai suatu sistem sosial, oleh karena memiliki unsur-unsur sistem sosial yang ada pada pokoknya mencakup kepercayaan, perasaan, tujuan,

Harmonika adalah salah satu alat musik tiup yang cukup mudah untuk digunakan, harmonika bisa menghasilkan suara dengan cara meniupkan udara dari mulut ke

T Oe oQer-kill c MpMc iPies of POe nucleMr poRers Mnd POeir MNiliPy Po des Proy eMc O oPOer forc ed POem Po.. mMinPMin M NMlMnc e in POeir

MADDE 24-(1) ( Değişik: 23.09.2014 tarih 18/1 sayılı Senato Kararı) Öğrenci Konseyi Denetleme Kurulu, Öğrenci Konseyi Genel Kurulu tarafından, görev süresi