-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmemoria.c
More file actions
70 lines (64 loc) · 2.13 KB
/
memoria.c
File metadata and controls
70 lines (64 loc) · 2.13 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
/* iaed-23 - ist1106326 - project2 */
/* Funções relacionadas com a gestão de memória do programa.*/
#include "dados.h"
/* Liberta toda a memória usada pelo programa até à chamada da função. */
void liberta_memoria(data* database) {
carreira_t* carreira = database->carreiras;
ligacao_t* ligacao = carreira->origem;
paragem_t* paragem = database->paragens;
carreira_que_passa_t* tmp;
carreira_que_passa_t* carreira_que_passa = paragem->carreiras;
while(carreira != NULL) {
ligacao = carreira->origem;
while(ligacao != NULL) {
if(ligacao->seguinte != NULL) {
ligacao = ligacao->seguinte;
free(ligacao->anterior);
}
else {
free(ligacao);
break;
}
}
if(carreira->nome != NULL) free(carreira->nome);
if(carreira->seguinte != NULL) {
carreira = carreira->seguinte;
free(carreira->anterior);
}
else {
free(carreira);
break;
}
}
while(paragem != NULL) {
carreira_que_passa = paragem->carreiras;
while (carreira_que_passa != NULL) {
tmp = carreira_que_passa;
carreira_que_passa = carreira_que_passa->seguinte;
free(tmp);
}
if(paragem->nome != NULL) free(paragem->nome);
if(paragem->seguinte != NULL) {
paragem = paragem->seguinte;
free(paragem->anterior);
}
else {
free(paragem);
break;
}
}
/* Aqui não são inicializadas as listas porque a função
pode ser chamada no fim do programa, ocasião em que voltar
a inicializá-las só para as libertar depois é completamente
redundante.*/
database->carreiras = NULL;
database->paragens = NULL;
}
/* Quando a memória é excedida, esta função apresenta uma mensagem de erro,
apaga toda a memória usada até à chamada da função, e termina o programa. */
void saida_controlada(data* database) {
printf("No memory.");
liberta_memoria(database);
free(database);
exit(EXIT_FAILURE);
}