-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkurir.cpp
More file actions
355 lines (341 loc) · 10.1 KB
/
Copy pathkurir.cpp
File metadata and controls
355 lines (341 loc) · 10.1 KB
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
#include"kurir.h"
void createListKurir(listKurir &L){
/**
I.S. -
F.S. telah dibuat sebuah listKurir L dengan first nil
**/
first(L) = nil;
}
infotypeKurir newDataKurir(string idkurir,string nama,string kota,int umur){
/**
mengembalikan data Kurir baru sesuai inputan user
**/
infotypeKurir data;
data.idkurir = idkurir;
data.nama = nama;
data.kota = kota;
data.umur = umur;
return data;
}
infotypePaket newDataPaket(string idpaket,string asal,string tujuan){
/**
mengembalikan data Paket baru sesuai inputan user
**/
infotypePaket data;
data.asal = asal;
data.idpaket = idpaket;
data.tujuan = tujuan;
return data;
}
adrKurir newElementKurir(infotypeKurir data){
/**
Mengembalikan P yang bertipe adrKurir yang berisi input bertipe kurir
**/
adrKurir p = new elmKurir;
info(p) = data;
next(p) = nil;
paket(p) = nil;
return p;
}
adrPaket newElementPaket(infotypePaket data){
/**
Mengembalikan P yang bertipe adrPaket yang berisi input bertipe paket
**/
adrPaket p = new elmPaket;
info(p) = data;
next(p) = nil;
return p;
}
void insertKurir(listKurir &L,adrKurir p){
//insertLast CSLL
/**
I.S. listKurir L mungkin kosong
F.S. seorang kurir P telah ditambahkan setelah elemen terakhir
**/
adrKurir Q = first(L);
if(first(L)==nil){
first(L) = p;
next(p) = first(L);
}else{
next(p) = first(L);
while(next(Q)!= first(L)){
Q = next(Q);
}
next(Q) = p;
}
}
void showDataKurir(listKurir L){
/**
I.S. terdefinisi sebuah listKurir L, mungkin kosong
F.S. semua data kurir sudah ditampilkan
**/
adrKurir Q = first(L);
if(first(L)==nil){
cout<<"List Kosong ";
}else{
cout<<"===============Data Kurir==============="<<endl;
do{
cout<<"id kurir : "<<info(Q).idkurir<<"|"<<" Nama : "<<info(Q).nama<<"|"<<" Umur : "<<info(Q).umur<<"|"<<" Kota : "<<info(Q).kota;
Q = next(Q);
cout<<endl;
}while(Q !=first(L));
}
}
adrKurir searchKurir(listKurir L,string idkurir){
/**
Mengembalikan pointer alamat adrKurir apabila terdapat seorang kurir sesuai dengan parameter input
dan mengembalikan nil apabila sebaliknya
**/
adrKurir Q = first(L);
bool found = false;
do{
if(info(Q).idkurir == idkurir){
found = true;
}else{
Q = next(Q);
}
}while(Q !=first(L)&&!found);
if(found){
return Q;
}else{
return nil;
}
}
void connect(listKurir &L,adrPaket p,string idkurir){
//insertfirst
/** I.S. terdefinisi Kurir L dan pointer Paket yang akan dimasukkan ke kurir tertentu
F.S. paket yang tersimpan di pointer P sudah masuk ke salah satu kurir yang dipilih
**/
adrKurir Q = searchKurir(L,idkurir);
if(paket(Q)==nil){
paket(Q) = p;
}else{
next(p) = paket(Q);
paket(Q) = p;
}
}
void showKurirPaket(listKurir L){
/**
I.S. terdefinisi sebuah listKurir L, mungkin kosong
F.S. semua data kurir beserta data paketnya ditampilkan
**/
adrKurir Q = first(L);
if(first(L)==nil){
cout<<"list kosong";
}
else{
do{
cout<<"Data Kurir"<<endl;
cout<<"id kurir : "<<info(Q).idkurir<<"|"<<" Nama : "<<info(Q).nama<<"|"<<" Umur : "<<info(Q).umur<<"|"<<" Kota : "<<info(Q).kota<<endl;
adrPaket p = paket(Q);
cout<<"Data Paket"<<endl;
while(p != nil){
cout<<"id paket : "<<info(p).idpaket<<"|"<<" Asal : "<<info(p).asal<<"|"<<" Tujuan : "<<info(p).tujuan<<endl;
p = next(p);
}
Q = next(Q);
}while(Q != first(L));
}
}
adrPaket SearchPaket(listKurir L,string idpaket,string idkurir){
/**
Mengembalikan pointer alamat adrPaket apabila data kurir sesuai dengan parameter input dan terdapat paket sesuai dengan parameter input
dan mengembalikan nil apabila sebaliknya
**/
//kode unik
bool found = false;
adrKurir Q = searchKurir(L,idkurir);
adrPaket p = paket(Q);
while( p != nil && !found){
if(info(p).idpaket == idpaket){
found = true;
}else{
p = next(p);
}
}
if(found){
return p;
}else{
return nil;
}
}
void deleteKurirPaket(listKurir &L,adrKurir &p,string idkurir){
/** I.S. terdefinisi sebuah listKurir L, mungkin kosong
F.S. elemen paket sudah terhapus sesuai yang diminta parameter
**/
adrKurir prec ;
adrKurir j = first(L);
do{
j = next(j);
}while(j!=first(L));
adrKurir Q = searchKurir(L,idkurir);
if(Q == nil){
cout<<"kurir tidak ditemukan"<<endl;
}
else if(paket(Q)== nil){
cout<<"kurir tidak mempunyai paket"<<endl;
}else{
}if(info(first(L)).idkurir == info(Q).idkurir){
deleteFirstKurir(L,p);
}else if (info(j).idkurir == info(Q).idkurir){
deleteLastKurir(L,p);
}else{
prec = first(L);
while(next(prec)!= Q){
prec = next(prec);
}
deleteAfterKurir(L,p,prec);
}
}
void deletePaket(listKurir &L,string idpaket,string idkurir,adrPaket &p){
/** I.S. terdefinisi sebuah listKurir L yang mempunyai child berupa paket berdasarkan parameter input,paket mungkin kosong
F.S. elemen child telah terhapus sesuai yang diminta parameter
**/
adrPaket y = SearchPaket(L,idpaket,idkurir);
adrKurir Q = searchKurir(L,idkurir);
adrPaket x = paket(Q);
while(next(x)!=nil){
x = next(x);
}
if(Q == nil){
cout<<"kurir tidak ditemukan"<<endl;
}
else if(paket(Q)== nil){
cout<<"kurir tidak mempunyai paket"<<endl;
}else{
if(info(paket(Q)).idpaket == idpaket){
deleteFirstPaket(paket(Q),p);
}else if(info(x).idpaket == idpaket){
deleteLastPaket(paket(Q),p);
}else{
adrPaket prec = paket(Q);
while(next(prec)!= y){
prec = next(prec);
}
deleteAfterPaket(paket(Q),p,prec);
}
}
}
void minimalKurir(listKurir L){
/** I.S. terdefinisi sebuah listKurir L, List tidak kosong
F.S. data kurir yang memliki paket paling sedikit ditampilkan
**/
int jml,Min;
adrKurir Q = first(L);
do{
jml = 0;
adrPaket P = paket(Q);
while(P != nil){
jml++;
P = next(P);
}
if(Min > jml || Min == jml){
Min = jml;
}
Q = next(Q);
}while(Q!=first(L));
Q = first(L);
do{
jml = 0;
adrPaket P = paket(Q);
while(P != nil){
jml++;
P = next(P);
}
if(Min > jml || Min == jml){
Min = jml;
cout<<"id kurir : "<<info(Q).idkurir<<" Nama :"<<info(Q).nama<<" Umur :"<<info(Q).umur<<" Kota :"<<info(Q).kota<<endl;
}
Q = next(Q);
}while(Q!=first(L));
}
void deleteFirstKurir(listKurir &L,adrKurir &p){
/** I.S. terdefinisi sebuah listPeserta L
F.S. elemen pertama dari list L telah dihapus dan disimpan dalam pointer alamat P
**/
adrKurir Q = first(L);
if(next(first(L))==first(L)){
p = first(L);
next(p) = nil;
first(L) = nil;
}else{
do{
Q = next(Q);
}while(Q != first(L));
p =first(L);
next(Q) = first(L);
next(p) = nil;
}
}
void deleteLastKurir(listKurir &L,adrKurir &p){
/** I.S. terdefinisi sebuah listPeserta L
F.S. elemen terakhir dari list L telah dihapus dan disimpan dalam pointer alamat P
**/
adrKurir Q = first(L);
if(next(first(L))==first(L)){
p = first(L);
next(p) = nil;
first(L) = nil;
}else{
do{
Q = next(Q);
}while(next(Q)!= first(L));
p = next(Q);
next(Q) = first(L);
next(p) = nil;
}
}
void deleteAfterKurir(listKurir &L,adrKurir &p,adrKurir prec){
/** I.S. terdefinisi sebuah listPeserta L
F.S. elemen setelah prec dari list L telah dihapus dan disimpan dalam pointer alamat P
**/
if(next(first(L))==first(L)){
p = first(L);
next(p) = nil;
first(L) = nil;
}else{
p = next(prec);
next(prec) = next(p);
next(p) = nil;
}
}
void deleteFirstPaket(adrPaket &Q,adrPaket &p){
/** I.S. terdefinisi sebuah pointer paket yang menunjuk pada child kurir
F.S. elemen pertama dari child paket telah dihapus dan disimpan dalam pointer alamat P
**/
p = Q;
Q = next(p);
next(p) = nil;
}
void deleteLastPaket(adrPaket &Q,adrPaket &p){
/** I.S. terdefinisi sebuah pointer paket yang menunjuk pada child kurir
F.S. elemen terakhir dari child paket telah dihapus dan disimpan dalam pointer alamat P
**/
while(next(Q) != nil){
p = next(Q);
next(Q) = nil;
}
}
void deleteAfterPaket(adrPaket &Q,adrPaket &p,adrPaket prec){
/** I.S. terdefinisi sebuah pointer paket yang menunjuk pada child kurir
F.S. elemen setelah prec dari child paket telah dihapus dan disimpan dalam pointer alamat P
**/
p = next(prec);
next(prec) = next(p);
next(p) = nil;
}
int selectMenu(){
cout<<"===============Menu==============="<<endl;
cout<<"1.Insert data kurir dari belakang"<<endl;
cout<<"2.Show all data kurir "<<endl;
cout<<"3.insert Data Paket"<<endl;
cout<<"4.Menampilkan seluruh data kurir beserta paketnya "<<endl;
cout<<"5.Menghapus data kurir dan paketnya"<<endl;
cout<<"6.Menghapus data paket pada kurir tertentu"<<endl;
cout<<"7.Menampilkan kurir yang memiliki paket paling sedikit"<<endl;
cout<<"0.Exit"<<endl;
cout<<"Pilihan Menu : ";
int input = 0;
cin>>input;
return input;
}