/* xnagyl2.c cvicenie 8 Laszlo Nagy */ #include #include //Práca so spájaným zoznamom štruktúr. Vytvorte spájaný zoznam záznamov o tovare v //potravinách. Jednotlivé záznamy majú obsahovať názov tovaru, výrobcu, počet kusov a //jednotkovú cenu (okrem týchto položiek nezabudnite do štruktúry pridať ukazovateľa na //seba). Zoznam udržiavajte stále usporiadaný podľa názvov tovarov. //(a) Umožnite používateľovi pridať nový tovar (podľa názvu). //(b) Umožnite používateľovi zmazať tovar (podľa názvu). typedef struct tovar tov_t; struct tovar { char nazov[50]; char vyrobca[50]; int kusy; double cena; tov_t * prev; tov_t * next; }; typedef struct linked_list { tov_t * first; tov_t * last; } list_t; void list_init(list_t *list); void list_add (list_t * list); void traverse(list_t * list); void traverse_reverse (list_t * list); void list_delete (list_t * list); void linked_list_delete (list_t * list, tov_t * link); int main() { list_t tov; char c; list_init(&tov); while(c = getchar()) { fflush(stdin); switch(c) { case 'P': list_add(&tov); break; case 'V': traverse(&tov); break; case 'E': list_delete(&tov); break; case 'W': traverse_reverse(&tov); break; case 'Q': exit(0); break; } } return 0; } void list_init(list_t *list) { list->first = list->last = 0; } void list_add (list_t * list) { tov_t * link; /* calloc nam nastavi dalsie na null. */ link = (tov_t *)calloc (1 ,sizeof(tov_t)); if (! link) { fprintf (stderr, "nebolo alokovane.\n"); exit (EXIT_FAILURE); } scanf("%s", &link->nazov); scanf("%s", &link->vyrobca); scanf("%d", &link->kusy); scanf("%lf", &link->cena); if (list->last) { /* spojenie zaznamov. */ list->last->next = link; link->prev = list->last; list->last = link; } else { list->first = link; list->last = link; } } void linked_list_delete (list_t * list, tov_t * link) { tov_t * prev; tov_t * next; prev = link->prev; next = link->next; if (prev) { if (next) { /* obe zaznamy su platne, len nech preskoci aktualne*/ prev->next = next; next->prev = prev; } else { /* len zaznam predtym je platny, tak nam aktualny zaznam sa stane poslednym */ prev->next = 0; list->last = prev; } } else { if (next) { /* len dalsi zaznam je platny, tak ten dalsi sa stane prvym zaznamom */ next->prev = 0; list->first = next; } else { /* zoznam je prazdny */ list->first = 0; list->last = 0; } } free(link); } void list_delete (list_t * list) { tov_t * link; char str[50]; scanf("%s", &str); fflush(stdin); for (link = list->first; link; link = link->next) { if (!strcasecmp(str, link->nazov)) { linked_list_delete (list, link); } } } void traverse_reverse(list_t * list) { tov_t * link; for (link = list->last; link; link = link->prev) { printf("nazov tovaru: %s\n", link->nazov); printf("vyrobca: %s\n", link->vyrobca); printf("pocet kusov: %d\n", link->kusy); printf("cena tovaru: %lf\n", link->cena); printf("\n"); } } void traverse(list_t * list) { tov_t * link; for (link = list->first; link; link = link->next) { printf("nazov tovaru: %s\n", link->nazov); printf("vyrobca: %s\n", link->vyrobca); printf("pocet kusov: %d\n", link->kusy); printf("cena tovaru: %lf\n", link->cena); printf("\n"); } }