#include #include // dopredna deklarace typedef struct uzel uzel; struct uzel { int id; float cislo1; float cislo2; 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->naslednik = NULL; seznam.konec = seznam.zacatek; return seznam; } void pridej_na_konec(spojovy_seznam* seznam, int id, float cislo1, float cislo2) { // zapsat data do nevyuziteho prvku seznam->konec->id = id; seznam->konec->cislo1 = cislo1; seznam->konec->cislo2 = cislo2; // 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, int id, float cislo1, float cislo2) { uzel* stary_zacatek = seznam->zacatek; seznam->zacatek = malloc(sizeof(uzel)); seznam->zacatek->id = id; seznam->zacatek->cislo1 = cislo1; seznam->zacatek->cislo2 = cislo2; 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); } } 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->id = prvek->naslednik->id; prvek->cislo1 = prvek->naslednik->cislo1; prvek->cislo2 = prvek->naslednik->cislo2; // zapamatovat si naslednika uzel* naslednik = prvek->naslednik; // prepsat ukazatel na naslednika naslednika prvek->naslednik = naslednik->naslednik; // dealokace naslednika free(naslednik); // aktualizovat konec if (prvek->naslednik == NULL) seznam->konec = prvek; } } uzel* najdi(spojovy_seznam seznam, int id) { uzel* u = seznam.zacatek; while (u->naslednik != NULL) { if (u->id == id) { return u; } u = u->naslednik; } return NULL; } int main() { spojovy_seznam s = vytvor_prazdny_seznam(); //smaz_prvni_prvek(&s); pridej_na_konec(&s, 1, 1.0, 2.0); pridej_na_konec(&s, 2, 3.0, 4.0); pridej_na_zacatek(&s, 3, 5.0, 4.0); pridej_na_konec(&s, 4, 6.0, 4.0); pridej_na_zacatek(&s, 5, 7.0, 4.0); //smaz_prvni_prvek(&s); //smaz_prostredni_prvek(&s, s.zacatek->naslednik->naslednik); // chci smazat posledni platny prvek //smaz_prostredni_prvek(&s, s.zacatek->naslednik->naslednik->naslednik); // vypis prvku uzel* u = s.zacatek; while (u->naslednik != NULL) { printf("%d: %f, %f\n", u->id, u->cislo1, u->cislo2); u = u->naslednik; } uzel* uz = najdi(s, 10); if (uz != NULL) { printf("nalezeno id=%d: %f, %f\n", uz->id, uz->cislo1, uz->cislo2); } else { printf("nenalezeno\n"); } // dealokace zrus_seznam(&s); return 0; }