int main(int argc, char **argv) { /* Argumenti komandne linije su neophodni jer se iz komandne linije dobija ime datoteke sa informacijama o studentima */ if (argc != 2) { fprintf(stderr, "Greska: Program se poziva sa: ./a.out ime_datoteke\n"); exit(EXIT_FAILURE); } /* Otvara se datoteka za citanje */ FILE *in = NULL; in = fopen(argv[1], "r"); if (in == NULL) { fprintf(stderr, "Greska: Neuspesno otvaranje datoteke %s.\n", argv[1]); exit(EXIT_FAILURE); } /* Deklaracije pomocnih promenljiva za citanje vrednosti koje treba smestiti u listu */ char ime[MAX_IME_PREZIME], prezime[MAX_IME_PREZIME]; char broj_indeksa[MAX_INDEKS]; Cvor *glava = NULL; Cvor *trazeni = NULL; /* Ucitavanje vrednosti u listu */ while (fscanf(in, "%s %s %s", broj_indeksa, ime, prezime) != EOF) if (dodaj_na_pocetak_liste(&glava, broj_indeksa, ime, prezime)) { fprintf(stderr, "Greska: Neuspesna alokacija memorije za nov cvor\n"); oslobodi_listu(&glava); exit(EXIT_FAILURE); } /* Datoteka vise nije potrebna i zatvara se. */ fclose(in); /* Ucitava se indeks po indeks studenta koji se trazi u listi. */ while (scanf("%s", broj_indeksa) != EOF) { trazeni = pretrazi_listu(glava, broj_indeksa); if (trazeni == NULL) printf("ne\n"); else printf("da: %s %s\n", trazeni->ime, trazeni->prezime); } /* Oslobadja se memorija zauzeta za cvorove liste. */ oslobodi_listu(&glava); exit(EXIT_SUCCESS); }
main() { CVOR* l = NULL; int i; for (i = 0; i<10; i++) ubaci_na_pocetak(&l, i); ispisi_listu(l); putchar('\n'); oslobodi_listu(l); }
int main() { /* Lista je prazna na pocetku */ Cvor *glava = NULL; Cvor *trazeni = NULL; int broj; /* Testiranje funkcije za dodavanja novog broja na pocetak liste */ printf("Unesite brojeve (CTRL+D za kraj unosa): "); while (scanf("%d", &broj) > 0) { /* Ako je funkcija vratila 1, onda je bilo greske pri alokaciji memorije za nov cvor. Memoriju alociranu za cvorove liste treba osloboditi pre napustanja programa. */ if (dodaj_na_pocetak_liste(&glava, broj) == 1) { fprintf(stderr, "Greska: Neuspesna alokacija memorije za cvor.\n"); oslobodi_listu(&glava); exit(EXIT_FAILURE); } printf("\tLista: "); ispisi_listu(glava); } /* Testiranje funkcije za pretragu liste */ printf("\nUnesite broj koji se trazi: "); scanf("%d", &broj); trazeni = pretrazi_listu(glava, broj); if (trazeni == NULL) printf("Broj %d se ne nalazi u listi!\n", broj); else printf("Trazeni broj %d je u listi!\n", trazeni->vrednost); /* Oslobadja se memorija zauzeta listom */ oslobodi_listu(&glava); exit(EXIT_SUCCESS); }
void oslobodi_listu(Cvor ** adresa_glave) { /* Ako je lista vec prazna */ if (*adresa_glave == NULL) return; /* Ako lista nije prazna, treba osloboditi memoriju. Treba osloboditi rep, pre oslobadjanja memorije za glavu liste. */ oslobodi_listu(&(*adresa_glave)->sledeci); /* Nakon oslobodjenog repa, oslobadja se glava liste i azurira se glava u pozivajucoj funkciji tako da odgovara praznoj listi */ free(*adresa_glave); *adresa_glave = NULL; }
/* Funkcija oslobadja memoriju zauzetu cvorovima liste */ void oslobodi_listu(Cvor ** adresa_glave) { /* Ako je lista prazna, nema potrebe oslobadjati memoriju */ if (*adresa_glave == NULL) return; /* Rekurzivnim pozivom se oslobadja rep liste */ oslobodi_listu(&(*adresa_glave)->sledeci); /* Potom se oslobadja i glava liste */ free(*adresa_glave); /* Lista se proglasava praznom */ *adresa_glave = NULL; }
int main(int argc, char **argv) { /* Proverava se da li je program pozvan sa ispravnim brojem argumenata komandne linije. */ if (argc != 2) { fprintf(stderr, "Greska: Program se poziva sa: ./a.out datoteka.html\n"); exit(EXIT_FAILURE); } /* Priprema datoteke za citanje */ FILE *in = NULL; in = fopen(argv[1], "r"); if (in == NULL) { fprintf(stderr, "Greska: Neuspesno otvaranje datoteke %s!\n", argv[1]); exit(EXIT_FAILURE); } char c; int i = 0; char procitana[MAX_DUZINA]; Cvor *glava = NULL; Cvor *trazeni = NULL; /* Cita se datoteka, karakter po karakter, dok se ne procita karakter za kraj sadrzaja datoteke. */ while ((c = fgetc(in)) != EOF) { /* Proverava se da li se pocinje sa citanjem nove etikete */ if (c == '<') { /* Proverava se da li se cita zatvarajuca etiketa */ if ((c = fgetc(in)) == '/') { i = 0; while ((c = fgetc(in)) != '>') procitana[i++] = c; } /* Cita se otvarajuca etiketa */ else { i = 0; procitana[i++] = c; while ((c = fgetc(in)) != ' ' && c != '>') procitana[i++] = c; } procitana[i] = '\0'; /* Trazi se procitana etiketa medju postojecim cvorovima liste. Ako ne postoji, dodaje se novi cvor za ucitanu etiketu sa brojem pojavljivanja 1. Inace se uvecava broj pojavljivanja etikete. */ trazeni = pretrazi_listu(glava, procitana); if (trazeni == NULL) { if (dodaj_na_pocetak_liste(&glava, 1, procitana) == 1) { fprintf(stderr, "Greska: Neuspesna alokacija memorije za nov cvor\n"); oslobodi_listu(&glava); exit(EXIT_FAILURE); } } else trazeni->broj_pojavljivanja++; } } /* Zatvara se datoteka */ fclose(in); /* Ispisuje se sadrzaj cvorova liste */ ispisi_listu(glava); /* Oslobadja se memorija zauzeta listom */ oslobodi_listu(&glava); exit(EXIT_SUCCESS); }