Advertisement
BlueBear

doubleLinkedList.c

Apr 16th, 2013
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.16 KB | None | 0 0
  1. /*
  2.     xnagyl2.c
  3.     cvicenie 8
  4.     Laszlo Nagy
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9.  
  10.  
  11. //Práca so spájaným zoznamom štruktúr. Vytvorte spájaný zoznam záznamov o tovare v
  12. //potravinách. Jednotlivé záznamy majú obsahovať názov tovaru, výrobcu, počet kusov a
  13. //jednotkovú cenu (okrem týchto položiek nezabudnite do štruktúry pridať ukazovateľa na
  14. //seba). Zoznam udržiavajte stále usporiadaný podľa názvov tovarov.
  15. //(a) Umožnite používateľovi pridať nový tovar (podľa názvu).
  16. //(b) Umožnite používateľovi zmazať tovar (podľa názvu).
  17.  
  18.  
  19. typedef struct tovar tov_t;
  20.  
  21.  
  22. struct tovar
  23. {
  24.     char nazov[50];
  25.     char vyrobca[50];
  26.     int kusy;
  27.     double cena;
  28.     tov_t * prev;
  29.     tov_t * next;
  30. };
  31.  
  32.  
  33. typedef struct linked_list
  34. {
  35.     tov_t * first;
  36.     tov_t * last;
  37. }
  38. list_t;
  39.  
  40. void list_init(list_t *list);
  41. void list_add (list_t * list);
  42. void traverse(list_t * list);
  43. void traverse_reverse (list_t * list);
  44. void list_delete (list_t * list);
  45. void linked_list_delete (list_t * list, tov_t * link);
  46.  
  47.  
  48. int main()
  49. {
  50.     list_t tov;
  51.     char c;
  52.  
  53.  
  54.     list_init(&tov);
  55.  
  56.     while(c = getchar())
  57.     {
  58.         fflush(stdin);
  59.         switch(c)
  60.         {
  61.         case 'P':
  62.             list_add(&tov);
  63.             break;
  64.         case 'V':
  65.             traverse(&tov);
  66.             break;
  67.         case 'E':
  68.             list_delete(&tov);
  69.             break;
  70.         case 'W':
  71.             traverse_reverse(&tov);
  72.             break;
  73.         case 'Q':
  74.             exit(0);
  75.             break;
  76.         }
  77.     }
  78.     return 0;
  79. }
  80.  
  81. void list_init(list_t *list)
  82. {
  83.     list->first = list->last = 0;
  84. }
  85.  
  86. void list_add (list_t * list)
  87. {
  88.     tov_t * link;
  89.  
  90.     /* calloc nam nastavi dalsie na null. */
  91.     link = (tov_t *)calloc (1 ,sizeof(tov_t));
  92.     if (! link)
  93.     {
  94.         fprintf (stderr, "nebolo alokovane.\n");
  95.         exit (EXIT_FAILURE);
  96.     }
  97.     scanf("%s", &link->nazov);
  98.     scanf("%s", &link->vyrobca);
  99.     scanf("%d", &link->kusy);
  100.     scanf("%lf", &link->cena);
  101.     if (list->last)
  102.     {
  103.         /* spojenie zaznamov. */
  104.         list->last->next = link;
  105.         link->prev = list->last;
  106.         list->last = link;
  107.     }
  108.     else
  109.     {
  110.         list->first = link;
  111.         list->last = link;
  112.     }
  113. }
  114.  
  115.  
  116. void linked_list_delete (list_t * list, tov_t * link)
  117. {
  118.     tov_t * prev;
  119.     tov_t * next;
  120.  
  121.     prev = link->prev;
  122.     next = link->next;
  123.     if (prev)
  124.     {
  125.         if (next)
  126.         {
  127.             /* obe zaznamy su platne, len nech preskoci aktualne*/
  128.             prev->next = next;
  129.             next->prev = prev;
  130.         }
  131.         else
  132.         {
  133.             /* len zaznam predtym je platny, tak nam aktualny zaznam sa stane poslednym */
  134.             prev->next = 0;
  135.             list->last = prev;
  136.         }
  137.     }
  138.     else
  139.     {
  140.         if (next)
  141.         {
  142.             /* len dalsi zaznam je platny, tak ten dalsi sa stane prvym zaznamom */
  143.             next->prev = 0;
  144.             list->first = next;
  145.         }
  146.         else
  147.         {
  148.             /* zoznam je prazdny */
  149.             list->first = 0;
  150.             list->last = 0;
  151.         }
  152.     }
  153.     free(link);
  154. }
  155.  
  156. void list_delete (list_t * list)
  157. {
  158.     tov_t * link;
  159.     char str[50];
  160.     scanf("%s", &str);
  161.     fflush(stdin);
  162.  
  163.     for (link = list->first; link; link = link->next)
  164.     {
  165.         if (!strcasecmp(str, link->nazov))
  166.         {
  167.             linked_list_delete (list, link);
  168.         }
  169.     }
  170. }
  171.  
  172. void traverse_reverse(list_t * list)
  173. {
  174.     tov_t * link;
  175.  
  176.     for (link = list->last; link; link = link->prev)
  177.     {
  178.         printf("nazov tovaru: %s\n", link->nazov);
  179.         printf("vyrobca: %s\n", link->vyrobca);
  180.         printf("pocet kusov: %d\n", link->kusy);
  181.         printf("cena tovaru: %lf\n", link->cena);
  182.         printf("\n");
  183.     }
  184. }
  185.  
  186. void traverse(list_t * list)
  187. {
  188.     tov_t * link;
  189.  
  190.     for (link = list->first; link; link = link->next)
  191.     {
  192.         printf("nazov tovaru: %s\n", link->nazov);
  193.         printf("vyrobca: %s\n", link->vyrobca);
  194.         printf("pocet kusov: %d\n", link->kusy);
  195.         printf("cena tovaru: %lf\n", link->cena);
  196.         printf("\n");
  197.     }
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement