#include #include /* 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; }