void PrintQueue (Queue Q) { /* I.S. : Q terdefinisi, mungkin kosong */ /* F.S. : Semua elemen Q tertulis di layar, dengan format: [ el-head ... el-tail ], misalnya [4 8 12 9 10]. Jika kosong, tampilan di layar adalah []. */ /*kamus lokal*/ int i; /*algoritma*/ printf("["); if(!IsEmpty(Q)) { i = Head(Q); if(i<=Tail(Q)) { while(i<=Tail(Q)) { printf("%d ",Q.T[i]); i++; } } else { while(i<=MaxEl(Q)) { printf("%d ",Q.T[i]); i++; } i=1; while(i<=Tail(Q)) { printf("%d ",Q.T[i]); i++; } } } printf("]\n"); }
void DealokasiDadu(Queue *Q) /* Proses : mengembalikan memori Q */ /* I.S. Q pernah dialokasi */ /* F.S. Q menjadi tidak terdefinisi lagi, MaxEl(Q) diset 0 */ { MaxEl(*Q) = Nil; free((*Q).T); }
/* *** 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 */ { /*algoritma*/ MaxEl(*Q) = Nil; free((*Q).T); }
boolean IsFull (Queue Q) /* Mengirim true jika tabel penampung elemen Q sudah penuh yaitu mengandung MaxEl elemen */ { /*kamus lokal*/ int m = Head(Q) - Tail(Q); /*algoritma*/ return (m == 1) || (m == (-1*MaxEl(Q)+1)); }
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 dgn MaxEl = 0 */ /* Proses : Melakukan alokasi, membuat sebuah Q kosong */ { (*Q).T = (infotype_dadu *) malloc ((Max+1) * sizeof(infotype_dadu)); if ((*Q).T != NULL) { MaxEl(*Q) = Max; Head(*Q) = Nil; Tail(*Q) = Nil; } else { MaxEl(*Q) = Nil; } }
/* *** Konstruktor *** */ void CreateEmpty (Queue *Q, int Max) /* I.S. Max terdefinisi */ /* 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 memori dan membuat sebuah Q kosong */ { (*Q).T = (infotype *) malloc((Max+1)*sizeof(infotype)); if ((*Q).T != Nil) { MaxEl(*Q) = Max; Head(*Q) = Nil; Tail(*Q) = Nil; } else /* alokasi gagal */ { MaxEl(*Q)=Nil; } }
int NBElmt(Queue Q) /* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong. */ { if (IsEmptyQueue(Q)) { return 0; } else { return Tail(Q) - Head(Q) + 1 + (Head(Q) > Tail(Q) ? MaxEl(Q) : 0); } }
void CreateQueuePemain(Queue *Q, int Maks) /* I.S : Queue kosong dengan alokasi Min 2 dan Maks 4 */ /* F.S : Menghasilkan Q yang berisi informasi seluruh pemain berupa nama dengan skor awal = 0 */ { int i; Pemain P; CreateEmpty(&(*Q),Maks); for (i = 1; i <= MaxEl(*Q); i++) { printf("Nama Pemain %d : ", i); scanf("%s", &P.Nama); P.Skor = 0; Add(&(*Q),P); } }
/* *** Primitif Add/Delete *** */ void Add(Queue *Q, infotypeQueue 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" dengan mekanisme circular buffer */ { if (IsEmptyQueue(*Q)) { Head(*Q) = 1; Tail(*Q) = 1; } else if (Tail(*Q) == MaxEl(*Q)) { Tail(*Q) = 1; } else { ++Tail(*Q); } InfoTail(*Q) = X; }
void Del (Queue *Q,infotype *X) /* Proses Menghapus elemen pertama pada Q dengan aturan FIFO */ /* I.S. Q tidak kosong */ /* F.S. X = nilai elemen HEAD pada I.S., Jika Queue masih isi HEAD "maju". Jika HEAD baru menjadi MaxEl + 1, maka HEAD diset = 1; Jika Queue menjadi kosong, HEAD = TAIL = Nil. */ { /*kamus lokal*/ /*algoritma*/ (*X) = InfoHead(*Q); if (Head(*Q) == Tail(*Q)) { Head(*Q) = Nil; Tail(*Q) = Nil; } else { Head(*Q)++; if (Head(*Q) == MaxEl(*Q) + 1) Head(*Q) = 1; } }
void Del(Queue *Q, infotypeQueue *X) /* Proses: Menghapus X pada Q dengan aturan FIFO */ /* I.S. Q tidak mungkin kosong */ /* F.S. X = nilai elemen HEAD pd I.S., HEAD "maju" dengan mekanisme circular buffer; Q mungkin kosong */ { *X = InfoHead(*Q); if (Head(*Q) == Tail(*Q)) { Head(*Q) = 0; Tail(*Q) = 0; } else if (Head(*Q) == MaxEl(*Q)) { Head(*Q) = 1; } else { ++Head(*Q); } }
boolean IsFull(Queue Q) /* Mengirim true jika tabel penampung nilai elemen queue penuh */ { return ((Head(Q) == 1) && (Tail(Q) == MaxEl(Q))); }
boolean IsFull (Queue Q) /* Mengirim true jika tabel penampung elemen Q sudah penuh yaitu mengandung MaxEl elemen */ { return (Tail(Q)==MaxEl(Q)); }
boolean IsFullQueue(Queue Q) /* Mengirim true jika tabel penampung elemen Q sudah penuh */ /* yaitu mengandung elemen sebanyak MaxEl */ { return NBElmt(Q) == MaxEl(Q); }