#include #include #include #include typedef struct { int id; char jmeno[10]; char prijmeni[20]; char rodne_cislo[12]; char telefon[14]; char cislo_op[9]; char cislo_pasu[9]; } data; // dopredna deklarace typedef struct uzel uzel; struct uzel { data* informace; uzel* naslednik; }; typedef struct { uzel* zacatek; uzel* konec; } spojovy_seznam; spojovy_seznam vytvor_prazdny_seznam() { spojovy_seznam seznam; seznam.zacatek = malloc(sizeof(uzel)); seznam.zacatek->informace = NULL; seznam.zacatek->naslednik = NULL; seznam.konec = seznam.zacatek; return seznam; } void pridej_na_konec(spojovy_seznam* seznam, data* informace) { // zapsat data do nevyuziteho prvku seznam->konec->informace = informace; // vytvorit novy nevyuzity prvek seznam->konec->naslednik = malloc(sizeof(uzel)); seznam->konec->naslednik->naslednik = NULL; seznam->konec = seznam->konec->naslednik; } void pridej_na_zacatek(spojovy_seznam* seznam, data* informace) { uzel* stary_zacatek = seznam->zacatek; seznam->zacatek = malloc(sizeof(uzel)); seznam->zacatek->informace = informace; seznam->zacatek->naslednik = stary_zacatek; } void smaz_prvni_prvek(spojovy_seznam* seznam) { if (seznam->zacatek != NULL && seznam->zacatek->naslednik != NULL) { // zapamatovat si prvni prvek uzel* prvni_prvek = seznam->zacatek; // prepsani zacatku seznam->zacatek = prvni_prvek->naslednik; // zrusit prvni prvek free(prvni_prvek->informace); free(prvni_prvek); } } void zrus_seznam(spojovy_seznam* seznam) { // while (seznam->zacatek->naslednik != NULL) while (seznam->zacatek != seznam->konec) smaz_prvni_prvek(seznam); // dealokace nevyuziteho uzlu free(seznam->zacatek); seznam->zacatek = NULL; seznam->konec = NULL; } void smaz_prostredni_prvek(spojovy_seznam* seznam, uzel* prvek) { if (prvek->naslednik != NULL) { // presunout data z naslednika do prvku prvek->informace = prvek->naslednik->informace; // zapamatovat si naslednika uzel* naslednik = prvek->naslednik; // prepsat ukazatel na naslednika naslednika prvek->naslednik = naslednik->naslednik; // dealokace naslednika free(naslednik->informace); free(naslednik); // aktualizovat konec if (prvek->naslednik == NULL) seznam->konec = prvek; } } uzel* najdi_id(spojovy_seznam seznam, int id) { uzel* u = seznam.zacatek; while (u->naslednik != NULL) { if (u->informace->id == id) { return u; } u = u->naslednik; } return NULL; } int strcmptolower(const char* lhs, const char* rhs, int n) { // pomocma pole char lhs2[n]; char rhs2[n]; // prevod na mala pismena for (int i = 0; i < n; i++) { lhs2[i] = tolower(lhs[i]); rhs2[i] = tolower(rhs[i]); } // porovnani return strcmp(lhs2, rhs2); } uzel* najdi_jmeno(uzel* zacatek, char* jmeno) { uzel* u = zacatek; while (u->naslednik != NULL) { if (strcmptolower(u->informace->jmeno, jmeno, 10) == 0) { return u; } u = u->naslednik; } return NULL; } int main() { spojovy_seznam s = vytvor_prazdny_seznam(); FILE* soubor = fopen("lidi.txt", "r"); if (soubor == NULL) { printf("chyba otevreni souboru\n"); return 1; } int pocet = 0; int id = 1; while (pocet != EOF) { // dynamicka alokace data* informace = malloc(sizeof(data)); // nacteni data informace->id = id; pocet = fscanf(soubor, "%s %s %s %s %s %s", informace->jmeno, informace->prijmeni, informace->rodne_cislo, informace->telefon, informace->cislo_op, informace->cislo_pasu ); if (pocet == EOF) { free(informace); break; } if (pocet < 6) { printf("Nedostatek informaci na radku %d.\n", id); free(informace); continue; } // vlozeni do seznamu pridej_na_konec(&s, informace); id += 1; } fclose(soubor); // vypis prvku uzel* u = s.zacatek; while (u->naslednik != NULL) { printf("%d: %s %s\n", u->informace->id, u->informace->jmeno, u->informace->prijmeni); u = u->naslednik; } char jmeno[10]; printf("Zadej jmeno: "); scanf("%s", jmeno); // najde vsechny lidi se zadanym jmenem uzel* uz = najdi_jmeno(s.zacatek, jmeno); int pocet_lidi = 0; while (uz != NULL) { pocet_lidi++; printf("Nalezeno: id=%d: %s %s\n", uz->informace->id, uz->informace->jmeno, uz->informace->prijmeni); // dalsi clovek uz = najdi_jmeno(uz->naslednik, jmeno); } if (pocet_lidi == 0) { printf("nenalezeno\n"); } // dealokace zrus_seznam(&s); return 0; }