/*
xnagyl2.c
cvicenie 8
Laszlo Nagy
*/
#include <stdio.h>
#include <stdlib.h>
//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");
}
}
Comments
0 B
|👍
/👎
0 B
|0 👍
/0 👎
0 B
|👍
/👎