This repository has been archived by the owner on Nov 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fila_clientes.c
79 lines (70 loc) · 2.1 KB
/
fila_clientes.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
/*******************************************************************************
* Carona Comunitária USP está licenciado com uma Licença Creative Commons
* Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional (CC BY-NC-SA 4.0).
*
* Carona Comunitária USP is licensed under a Creative Commons
* Attribution-NonCommercial-ShareAlike 4.0 International License (CC BY-NC-SA 4.0).
*
* Funções paraa tratamento de fila de clientes esperando carona
*******************************************************************************/
#include "fila_clientes.h"
int ultimo_fila = -1;
lista_ligada_fila_t fila[MAX_CLIENTES];
void inicializa_fila() {
int i;
for (i = 0; i < MAX_CLIENTES; i++) { // desnecessário, mas ajuda a depurar em caso de erro
fila[i].tipo = -1;
fila[i].anterior = -1;
fila[i].prox = -1;
}
}
///@TODO: testar isso direito
void adiciona_fila(int n, int tipo) {
// adiciona_fila é chamada com n = número da thread, que é único em cada momento.
// Então, salvar em fila[n] é seguro
fila[n].tipo = tipo;
fila[n].anterior = ultimo_fila;
fila[ultimo_fila].prox = n; // guarda na entrada anterior um link para a atual
ultimo_fila = n;
}
void remove_fila(int n) {
if (fila[n].tipo == -1)
fprintf(stderr, "remove_fila() - %d não inicializado\n", n);
else {
if (n == ultimo_fila) {
ultimo_fila = fila[n].anterior;
} else {
fila[fila[n].anterior].prox = fila[n].prox;
fila[fila[n].prox].anterior = fila[n].anterior;
}
fila[n].tipo = -1;
fila[n].anterior = -1;
fila[n].prox = -1;
}
}
void muda_tipo(int n, int tipo) {
if (fila[n].tipo == -1)
fprintf(stderr, "muda_tipo() - %d não inicializado\n", n);
fila[n].tipo = tipo;
}
int inicio_fila() {
int n = ultimo_fila;
while (fila[n].anterior != -1) {
n = fila[n].anterior;
}
if (fila[n].tipo == -1) // primeira entrada é vazia = pilha vazia
return -1;
return n;
}
int prox_fila(int n) {
if (n == -1) { // n = -1 significa pegar primeiro da fila
n = inicio_fila();
if (n == -1) // fila vazia
return -1;
return n;
}
n = fila[n].prox;
if (fila[n].tipo == -1) // fim da fila
return -1;
return n;
}