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
|
#include <stdio.h>
#include <stdlib.h>
/* tukaj si kar nekaj kode izposodimo iz prejsnje naloge, predvsem za branje iz standardnega vhoda, zato ne bom pisal komentarjev tam, kjer so ze v nalogi 3. */
struct preusm {
int s; /* izvorni naslov */
int t; /* naslov, na katerega bomo preusmerjeni */
int o; /* 1, v kolikor smo ze obiskali to preusmeritev, 0 na zacetku */
};
int podprogram(
struct preusm * p, /* seznam preusmeritev */
int n, /* stevilo preusmeritev */
int z /* naslov, ki naj ga funkcija obravnava - rekurzija */
) { /* vrne nic, ce se zacikla, vrne koncni naslov, ko se le-ta najde */
int i = 0; /* iteracijski decek */
for (i = 0; i < n; i++) /* za vsako preusmeritev */
if (p[i].s == z) { /* ko najdemo nas naslov */
if (p[i].o == 1) /* ups, ocitno se zacikla, na tej preusmeritvi smo ze bili */
return 0; /* vrnemo s statusom, ki zaznamuje zaciklanost */
p[i].o = 1; /* za v prihodnje zaznamujemo, da smo na tej preusmeritvi ze bili */
return podprogram(p, n, p[i].t); /* rekurzivno naprej sledimo preusmeritvam */
}
return z; /* ocitno tega naslova ni v tabeli preusmeritev, to je koncni naslov */
}
/* vhodni podatki - seznam preusmeritev
* 1,2 1,3 1,4 6,2 8,3 1,6 2,6 1,6
* argv[1] - z (zacetni naslov) v desetiskem sistemu
*
* jaz osebno menim, da n ni potreben in je tu samo zato, da me zavede. zatorej program ne uporablja nja, glede na navodilo pa ga mora sprejeti, zato ga dajte v argv[2], vendar ne bo uporabljen.
* */
int main (int argc, char ** argv) {
if (argc < 1+1) { /* ce ni podanega zacetnega naslova */
fprintf(stderr, "uporaba: %s z (stevilka) < 4.in (preusmeritve)\n", argv[0]);
return 1; /* napaka */
}
struct preusm * k = malloc(sizeof(struct preusm)*1);
char * b = malloc(sizeof(char)*1);
size_t d = 0;
char * p;
char c = fgetc(stdin);
int o;
int z;
while (!feof(stdin)) {
b = realloc(b, sizeof(char)*(d+2));
b[d++] = c;
c = fgetc(stdin);
}
if (b[d-1] == '\n')
d--;
if (b[d-1] == '\r')
d--;
b[d] = '\0';
d = 0;
p = b;
z = atoi(argv[1]); /* pridobimo zacetni naslov */
do {
k = realloc(k, sizeof(struct preusm)*(d+2));
k[d].o = 0;
k[d].s = strtol(p, &p, 10 /* mimogrede, ta desetica oznacuje desetiski sistem */);
p++;
k[d].t = strtol(p, &p, 10);
p++;
d++;
} while (p[-1] != '\0');
o = podprogram(k, d, z);
fprintf(stdout, "%s%c%d\n", o == 0 ? "preusmeritev se zacikla\n" : "preusmeritve se koncajo na naslovu", o == 0 ? '\0' : ' ', o); /* malo format string magije */
free(b);
b = NULL;
free(k);
k = NULL;
return 0;
}
|