4
4
#include "lista.h"
5
5
#include "pilha.h"
6
6
7
-
8
7
/****************************************************/
9
8
/* Funcoes a implementar */
10
9
/****************************************************/
11
10
12
11
/*** problema 1.1 ***/
13
- lista * filtra_titulos (lista * lista1 , lista * lista2 )
12
+ lista * filtra_titulos (lista * lista1 , lista * lista2 )
14
13
{
15
- /* complexidade do algoritmo: ______________ */
16
-
17
- return NULL ;
14
+ if (lista1 == NULL || lista2 == NULL )
15
+ {
16
+ return NULL ;
17
+ }
18
+ lista * lista_n = lista_nova ();
19
+ if (lista_n == NULL )
20
+ {
21
+ return NULL ;
22
+ }
23
+ l_elemento * aponta = lista1 -> inicio ;
24
+ //l_elemento *aponta2= lista2->inicio;
25
+ while (aponta != NULL )
26
+ {
27
+ if (lista_pesquisa (lista2 , aponta -> str , LISTA_INICIO ) != NULL )
28
+ {
29
+ aponta = aponta -> proximo ;
30
+ }
31
+ else
32
+ {
33
+ lista_insere (lista_n , aponta -> str , NULL );
34
+ aponta = aponta -> proximo ;
35
+ }
36
+ }
37
+ if (lista_tamanho (lista_n ) > lista_tamanho (lista1 ))
38
+ {
39
+ return NULL ;
40
+ }
18
41
42
+ return lista_n ;
19
43
}
20
44
21
45
/*** problema 1.2 ***/
22
46
int retira_comecados_por (lista * lst , char * inicio )
23
47
{
24
- return 0 ;
48
+ int retirados = 0 ;
49
+ if (lst == NULL || inicio == NULL )
50
+ {
51
+ return 0 ;
52
+ }
53
+ l_elemento * aponta = lst -> inicio ;
54
+ char string [100 ];
55
+
56
+ while (aponta != NULL )
57
+ {
58
+ if (strstr (aponta -> str , inicio ) != NULL )
59
+ {
60
+
61
+ aponta = lista_remove (lst , aponta );
62
+ retirados ++ ;
63
+ }
64
+ else
65
+ aponta = aponta -> proximo ;
66
+ }
67
+ return retirados ;
25
68
}
26
69
27
70
/*** problema 1.3 ***/
71
+ // sempre que faco pop tenho que ver se o tilulo é igual
28
72
int insere_na_pilha (pilha * p , char * titulo )
29
73
{
30
- return 0 ;
74
+ char string [120 ];
75
+ pilha * po = pilha_nova ();
76
+ if (p == NULL || titulo == NULL || po == NULL )
77
+ {
78
+ return 0 ;
79
+ }
80
+
81
+ char * aux ;
82
+ while (strcmp (titulo , pilha_top (p )) <= 0 )
83
+ {
84
+ if (pilha_vazia (p ))
85
+ {
86
+ break ;
87
+ }
88
+
89
+ if (!strcmp (titulo , pilha_top (p )))
90
+ {
91
+ return 0 ;
92
+ }
93
+ if (strcmp (titulo , pilha_top (p )) < 0 )
94
+ {
95
+ aux = pilha_top (p );
96
+ pilha_pop (p );
97
+ pilha_push (po , aux );
98
+ }
99
+ }
100
+ pilha_push (p , titulo );
101
+
102
+ for (int i = 0 ; i < pilha_tamanho (po ); i ++ )
103
+ {
104
+ pilha_push (p , pilha_top (po ));
105
+ pilha_pop (po );
106
+ }
107
+ pilha_apaga (po );
108
+ return 1 ;
31
109
}
32
110
33
111
/****************************************************/
34
112
/* Funcoes ja implementadas (nao modificar) */
35
113
/****************************************************/
36
114
37
- lista * lerParaLista (FILE * ficheiro )
115
+ lista * lerParaLista (FILE * ficheiro )
38
116
{
39
117
char buffer [256 ], * nlptr ;
40
- lista * l ;
118
+ lista * l ;
41
119
42
120
if (ficheiro == NULL )
43
121
return NULL ;
44
122
45
123
l = lista_nova ();
46
124
47
- while (fgets (buffer , 255 , ficheiro ) != NULL )
125
+ while (fgets (buffer , 255 , ficheiro ) != NULL )
48
126
{
49
127
nlptr = strchr (buffer , '\n' );
50
128
if (nlptr )
51
- * nlptr = '\0' ;
52
- lista_insere (l ,buffer ,NULL );
129
+ * nlptr = '\0' ;
130
+ lista_insere (l , buffer , NULL );
53
131
}
54
132
55
133
return l ;
56
134
}
57
135
58
- pilha * lerParaPilha (FILE * ficheiro )
136
+ pilha * lerParaPilha (FILE * ficheiro )
59
137
{
60
138
char buffer [256 ], * nlptr ;
61
- pilha * p ;
139
+ pilha * p ;
62
140
63
141
if (ficheiro == NULL )
64
142
return NULL ;
65
143
66
144
p = pilha_nova ();
67
145
68
- while (fgets (buffer , 255 , ficheiro ) != NULL )
146
+ while (fgets (buffer , 255 , ficheiro ) != NULL )
69
147
{
70
148
nlptr = strchr (buffer , '\n' );
71
149
if (nlptr )
72
- * nlptr = '\0' ;
73
- pilha_push (p ,buffer );
150
+ * nlptr = '\0' ;
151
+ pilha_push (p , buffer );
74
152
}
75
153
return p ;
76
154
}
77
155
78
- void imprimeLista (lista * l , unsigned int n ) {
79
- if (l -> tamanho < n )
80
- printf ("ERRO... Lista possui menos de %d elementos\n" ,n );
156
+ void imprimeLista (lista * l , unsigned int n )
157
+ {
158
+ if (l -> tamanho < n )
159
+ printf ("ERRO... Lista possui menos de %d elementos\n" , n );
81
160
unsigned int i ;
82
161
l_elemento * aux = l -> inicio ;
83
- for (i = 0 ; i < n ; i ++ ) {
84
- printf ("%dº Livro: %s\n" , i + 1 ,aux -> str );
162
+ for (i = 0 ; i < n ; i ++ )
163
+ {
164
+ printf ("%dº Livro: %s\n" , i + 1 , aux -> str );
85
165
aux = aux -> proximo ;
86
166
}
87
167
}
88
168
89
169
int main ()
90
170
{
91
171
FILE * f ;
92
- lista * l1 = NULL , * l2 = NULL , * l = NULL ;
172
+ lista * l1 = NULL , * l2 = NULL , * l = NULL ;
93
173
pilha * p ;
94
174
int nmov , res ;
95
175
char * tit1 ;
96
176
97
177
/* testes */
98
- f = fopen ("livros1.txt" ,"r" );
99
- if (f == NULL )
178
+ f = fopen ("livros1.txt" , "r" );
179
+ if (f == NULL )
100
180
{
101
181
printf ("Erro ao ler ficheiro de entrada.\n" );
102
182
return 1 ;
103
183
}
104
184
l1 = lerParaLista (f );
105
185
fclose (f );
106
186
107
- f = fopen ("livros2.txt" ,"r" );
108
- if (f == NULL )
187
+ f = fopen ("livros2.txt" , "r" );
188
+ if (f == NULL )
109
189
{
110
190
printf ("Erro ao ler ficheiro de entrada.\n" );
111
191
return 1 ;
@@ -115,21 +195,21 @@ int main()
115
195
116
196
/* inicio teste prob1.1 */
117
197
l = filtra_titulos (l1 , l2 );
118
- if (l ) {
198
+ if (l )
199
+ {
119
200
printf ("\nLista resultante contem %d livros.\n" , lista_tamanho (l ));
120
- if (lista_tamanho (l ) != 12 )
201
+ if (lista_tamanho (l ) != 12 )
121
202
printf ("ERRO.. Tamanho da lista incorreto(tamanho: %d; esperado: 12)\n" , lista_tamanho (l ));
122
203
else
123
- imprimeLista (l ,lista_tamanho (l ));
204
+ imprimeLista (l , lista_tamanho (l ));
124
205
}
125
206
else
126
207
printf ("\nERRO.. filtra_titulos retornou NULL\n" );
127
208
/* fim teste prob1.1 */
128
209
129
-
130
210
/* inicio teste prob1.2 */
131
- f = fopen ("livros.txt" ,"r" );
132
- if (f == NULL )
211
+ f = fopen ("livros.txt" , "r" );
212
+ if (f == NULL )
133
213
{
134
214
printf ("Erro ao ler ficheiro de entrada.\n" );
135
215
return 1 ;
@@ -141,52 +221,55 @@ int main()
141
221
nmov = retira_comecados_por (l , "A" );
142
222
printf ("\nForam retirados %d livros\n" , nmov );
143
223
printf ("A lista contém %d livros\n" , lista_tamanho (l ));
144
- if (nmov != 146 )
145
- printf ("ERRO.. Numero de livros removidos incorreto (removidos: %d; esperado: 146\n" ,nmov );
146
- else if (lista_tamanho (l ) != 389 )
224
+ if (nmov != 146 )
225
+ printf ("ERRO.. Numero de livros removidos incorreto (removidos: %d; esperado: 146\n" , nmov );
226
+ else if (lista_tamanho (l ) != 389 )
147
227
printf ("ERRO.. Lista incorreta (tamanho: %d; esperado: 389)\n" , lista_tamanho (l ));
148
228
else
149
- printf ("9º livro da lista: %s\n" , lista_elemento (l ,8 )-> str );
229
+ printf ("9º livro da lista: %s\n" , lista_elemento (l , 8 )-> str );
150
230
/* fim teste prob1.2 */
151
231
152
-
153
232
/* inicio teste prob1.3 */
154
- f = fopen ("livros2.txt" ,"r" );
155
- if (f == NULL )
233
+ f = fopen ("livros2.txt" , "r" );
234
+ if (f == NULL )
156
235
{
157
236
printf ("Erro ao ler ficheiro de entrada.\n" );
158
237
return 1 ;
159
238
}
160
239
p = lerParaPilha (f );
161
240
fclose (f );
162
241
163
- tit1 = "Fora de Horas" ;
242
+ tit1 = "Fora de Horas" ;
164
243
res = insere_na_pilha (p , tit1 );
165
244
166
- if (res == 0 ) {
245
+ if (res == 0 )
246
+ {
167
247
printf ("\n'%s' já existe na pilha\n" , tit1 );
168
248
printf ("Numero de elementos na pilha: %d\n" , pilha_tamanho (p ));
169
249
}
170
250
else if (pilha_tamanho (p ) != 32 )
171
- printf ("\nERRO.. Numero de elementos na pilha incorreto (existentes: %d; esperado: 32)\n" ,pilha_tamanho (p ));
172
- else {
251
+ printf ("\nERRO.. Numero de elementos na pilha incorreto (existentes: %d; esperado: 32)\n" , pilha_tamanho (p ));
252
+ else
253
+ {
173
254
printf ("\n'%s' foi inserido na pilha\n" , tit1 );
174
255
printf ("Numero de elementos na pilha: %d\n" , pilha_tamanho (p ));
175
256
}
176
257
177
- tit1 = "Mundo incompleto" ;
258
+ tit1 = "Mundo incompleto" ;
178
259
res = insere_na_pilha (p , tit1 );
179
260
180
- if (res == 0 ) {
261
+ if (res == 0 )
262
+ {
181
263
printf ("'%s' já existe na pilha\n" , tit1 );
182
264
printf ("Numero de elementos na pilha: %d\n" , pilha_tamanho (p ));
183
265
}
184
266
else if (pilha_tamanho (p ) != 32 )
185
- printf ("ERRO.. Numero de elementos na pilha incorreto (existentes: %d; esperado: 32)\n" ,pilha_tamanho (p ));
186
- else {
187
- printf ("'%s' foi inserido na pilha\n" , tit1 );
188
- printf ("Numero de elementos na pilha: %d\n" , pilha_tamanho (p ));
189
- }
267
+ printf ("ERRO.. Numero de elementos na pilha incorreto (existentes: %d; esperado: 32)\n" , pilha_tamanho (p ));
268
+ else
269
+ {
270
+ printf ("'%s' foi inserido na pilha\n" , tit1 );
271
+ printf ("Numero de elementos na pilha: %d\n" , pilha_tamanho (p ));
272
+ }
190
273
puts ("" );
191
274
/* fim teste prob1.3 */
192
275
0 commit comments