• 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

Bila stack penuh tidak dapat dikenakan operasi penambahan data (push), dan bila stack kosong maka operasi pengambilan data (pop) tidak dapat dilakukan.. Untuk

Pengujian vibrasi unsur elemen struktur pada lokasi - lokasi kritis elemen jembatan dilakukan untuk mendapatkan data getaran saat kosong dan penuh bertujuan bagi

Maka lokasi Queue (N) telah diduduki, disini mungkin saja tidak sebanyak N elemen ada dalam antrian (karena sudah dilakukan penghapusan)...

Nilai F tabel yang diperoleh dibanding dengan nilai F hitung apabila F hitung lebih besar dari F tabel, maka ditolak sehingga dapat disimpulkan bahwa ada pengaruh yang signifikan

Awal: L terdefinisi, mungkin kosong, P terdefinisi yaitu alamat elemen yang akan disisipkan}.. {K.Akhir: P menjadi elemen

Dengan circular array, meskipun posisi terakhir telah terpakai, elemen baru tetap dapat ditambahkan pada posisi pertama jika posisi pertama dalam keadaan kosong.Jika

o Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala antrian (elemen pertama dalam antrian) yang tidak akan berubahubah o Pergerakan pada Antrian terjadi dengan

Pengujian vibrasi unsur elemen struktur pada lokasi- lokasi kritis elemen jembatan dilakukan untuk mendapatkan data getaran saat kosong dan penuh bertujuan bagi evaluasi kondisi