-
Notifications
You must be signed in to change notification settings - Fork 4
/
QueueList.c
146 lines (134 loc) · 2.97 KB
/
QueueList.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* ADT Queue List */
/* File: QueueList.c */
#include "QueueList.h"
#include "boolean.h"
#include <stdlib.h>
#include <stdio.h>
/**** Prototype manajemen memori ****/
void AlokasiQueue (qaddress *P, infoqtype X)
/* I.S. P sembarang, X terdefinisi */
/* F.S. Alamat P dialokasi, jika berhasil maka InfoQ(P) = X dan NextQQ(P) = Nil */
/* P = Nil jika alokasi gagal */
{/* Kamus Lokal */
/* Algoritma */
//Algortima
*P = (qaddress)malloc(sizeof(ElmtQueue));
if (P != Nil) {
InfoQ(*P) = X;
NextQ(*P) = Nil;
}
else
P = Nil;
}
void DealokasiQueue (qaddress P)
/* I.S. P adalah hasil alokasi, P <> Nil */
/* F.S. Alamat P didealokasi, dikembalikan ke sistem */
{ /* Kamus Lokal */
/* Algoritma */
free(P);
}
/**** Predikat Pemeriksaan Kondisi Queue ****/
boolean IsQueueEmpty (Queue Q)
/* Mengirim true jika Q kosong: HEAD(Q) = Nil and TAIL(Q) = Nil */
{ /* Kamus Lokal */
/* Algoritma */
return(Head(Q)==Nil && Tail(Q)==Nil);
}
int NBElmtQueue (Queue Q)
/* Mengirimkan banyaknya elemen queue. Mengirimkan 0 jika Q kosong. */
{ /* Kamus Lokal */
int count;
qaddress P;
/* Algoritma */
count=0;
P=Head(Q);
while(P!=Nil) {
count=count+1;
P=NextQ(P);
}
return(count);
}
/**** Konstruktor ****/
void CreateQueueEmpty (Queue *Q)
/* I.S. sembarang */
/* F.S. Sebuah Q kosong terbentuk */
{/* Kamus Lokal */
/* Algoritma */
Head(*Q)=Nil;
Tail(*Q)=Nil;
}
/* *** Primitif Add/Delete *** */
void AddQueue (Queue *Q, infoqtype X)
/* Proses : Mengalokasi X dan menambahkan X pada bagian TAIL dari Q jika alokasi
berhasil; jika alokasi gagal Q tetap */
/* I.S. Q mungkin kosong */
/* F.S. X menjadi TAIL, TAIL "maju" */
{ /* Kamus Lokal*/
qaddress Pt;
/* Algoritma */
AlokasiQueue(&Pt,X);
if(Pt!=Nil) {
if(IsQueueEmpty(*Q)) {
Head(*Q)=Pt;
Tail(*Q)=Pt;
}
else {
NextQ(Tail(*Q))=Pt;
Tail(*Q)=Pt;
}
}
}
void DelQueue (Queue *Q, infoqtype *X)
/* Proses : Menghapus X pada bagian HEAD dari Q dan mendealokasi elemen HEAD */
/* I.S. Q tidak mungkin kosong */
/* F.S. X = nilai elemen HEAD pd I.S., HEAD "mundur" */
{ /* Kamus Lokal */
qaddress Pt;
/* Algoritma */
Pt=Head(*Q);
*X=InfoHead(*Q);
if(NextQ(Pt)==Nil) {
Tail(*Q)=Nil;
}
Head(*Q)=NextQ(Pt);
NextQ(Pt)=Nil;
DealokasiQueue(Pt);
}
/**** PROSES SEMUA ELEMEN QUEUE *****/
void PrintInfoQueue (Queue Q)
/* I.S. List mungkin kosong */
/* F.S. Jika list tidak kosong, */
/* Semua info yg disimpan pada elemen list diprint */
/* Jika list kosong, hanya menuliskan "list kosong" */
{/*Kamus Lokal */
qaddress P;
/* Algoritma */
if(IsQueueEmpty(Q)) {}
else {
P=Head(Q);
while(P!=Nil) {
printKata(InfoQ(P)); printf(" ");
P=NextQ(P);
}
printf("\n");
}
}
boolean SearchQueue(Queue Q, infoqtype Kata)
/* Mencari apakah ada elemen list yang beralamat P */
/* Mengirimkan true jika ada, false jika tidak ada */
{/* Kamus Lokal */
boolean found;
qaddress P;
/* Algoritma */
P=Head(Q);
found=false;
while(P!=Nil && !found) {
if(IsKataSama(InfoQ(P),Kata)) {
found=true;
}
else {
P=NextQ(P);
}
}
return(found);
}