#include #include #include #include // struktura pro data typedef struct { char jmeno[15]; char prijmeni[30]; int vek; char pohlavi; char narodnost[30]; int znamka; int deti; float vyska; float vaha; char bydliste[30]; } data_typ; // dopredna deklarace typedef struct uzel uzel; struct uzel { // datova polozka data_typ* data; // ukazatel na nasledujici prvek uzel* naslednik; }; typedef struct { uzel* zacatek; uzel* konec; } spojovy_seznam; // funkce pro nacteni jednoho radku textu ze souboru bool fgetLine(FILE* soubor, char* string, int maxDelka) { for (int i = 0; i < maxDelka; i++) { // precti znak z terminalu int znak = fgetc(soubor); // kontrola jestli nedoslo k chybe cteni if (ferror(soubor)) { printf("Chyba: neslo precist cely radek\n"); return false; } // zkontroluj, jestli neni konec vstupu if (znak != EOF && znak != '\n') string[i] = znak; else { // konec vstupu - ukonci string a prerus cyklus string[i] = '\0'; return true; } } // v cyklu jsme nedosli ke znaku EOF ani k '\n' - radek je delsi nez (maxDelka - 1) // (vypisujeme maxDelka - 1, protoze posledni znak musi byt '\0', ktery ale uzivatel nezadava) printf("Chyba: radek je delsi nez maximalni povolena delka %d znaku.\n", maxDelka - 1); return false; } void vypis_data(data_typ* data) { printf("%s %s %d %c %s %d %d %f %f %s\n", data->jmeno, data->prijmeni, data->vek, data->pohlavi, data->narodnost, data->znamka, data->deti, data->vyska, data->vaha, data->bydliste ); } uzel* vytvor_prvek(data_typ* data) { // dynamicka alokace uzel* novy = malloc(sizeof(uzel)); if (novy == NULL) { printf("chyba alokace\n"); return NULL; } // zapis dat novy->data = data; novy->naslednik = NULL; return novy; } void vloz_na_zacatek(spojovy_seznam* s, data_typ* data) { // napred zajistime, ze existuje specialni prvek if (s->zacatek == NULL) { // vytvorime specialni prvek uzel* novy = vytvor_prvek(NULL); if (novy == NULL) { free(data); return; } // nastavime zacatek a konec s->zacatek = novy; s->konec = novy; } // pokracujeme jako pred tim... uzel* novy = vytvor_prvek(data); if (novy == NULL) { free(data); return; } // vlozeni do seznamu novy->naslednik = s->zacatek; s->zacatek = novy; } void vloz_na_konec(spojovy_seznam* s, data_typ* data) { if (s->zacatek == NULL) { vloz_na_zacatek(s, data); } else { // dynamicka alokace uzel* novy = vytvor_prvek(s->konec->data); if (novy == NULL) return; // vlozeni do seznamu novy->naslednik = NULL; s->konec->naslednik = novy; // prepsat data s->konec->data = data; // aktualizovat ukazatel na konec s->konec = novy; } } void vypis_seznam(spojovy_seznam s) { uzel* aktualni = s.zacatek; while (aktualni != s.konec) { vypis_data(aktualni->data); aktualni = aktualni->naslednik; } } void zrus_seznam(spojovy_seznam* s) { while (s->zacatek != NULL) { uzel* aktualni = s->zacatek; s->zacatek = aktualni->naslednik; free(aktualni->data); free(aktualni); } s->konec = NULL; } uzel* najdi(spojovy_seznam s, char* jmeno) { uzel* aktualni = s.zacatek; while (aktualni != s.konec) { if (strcmp(aktualni->data->jmeno, jmeno) == 0) return aktualni; aktualni = aktualni->naslednik; } return NULL; } uzel* najdi_dalsi(uzel* aktualni, char* jmeno) { while (aktualni->naslednik != NULL) { if (strcmp(aktualni->data->jmeno, jmeno) == 0) return aktualni; aktualni = aktualni->naslednik; } return NULL; } int main() { spojovy_seznam s; s.zacatek = NULL; s.konec = NULL; FILE* soubor = fopen("seznam.txt", "r"); if (soubor == NULL) { printf("chyba otevreni souboru\n"); return 1; } while (!feof(soubor)) { // precteni radku ze souboru char radek[1000]; fgetLine(soubor, radek, 1000); // preskocit hlavicku if (radek[0] == '#') continue; // vytvorit data data_typ* data = malloc(sizeof(data_typ)); if (data == NULL) { printf("chyba alokace\n"); fclose(soubor); return 1; } // zpracovani radku int pocet = sscanf(radek, "%s %s %d %c %s %d %d %f %f %s", data->jmeno, data->prijmeni, &data->vek, &data->pohlavi, data->narodnost, &data->znamka, &data->deti, &data->vyska, &data->vaha, data->bydliste ); if (pocet != 10) { if (pocet >= 0) printf("chyba: na radku je jen %d polozek.\n", pocet); free(data); continue; } // vlozit data do seznamu //vloz_na_zacatek(&s, data); vloz_na_konec(&s, data); } // vypsat data vypis_seznam(s); // hledani //uzel* u = najdi(s, "Jana"); uzel* u = najdi_dalsi(s.zacatek, "Jana"); if (u != NULL) { printf("nalezeno: "); vypis_data(u->data); uzel* v = najdi_dalsi(u->naslednik, "Jana"); } else { printf("nenalezeno\n"); } fclose(soubor); zrus_seznam(&s); return 0; }