Facebook
From Stained Butterfly, 5 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 177
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. enum flaga {NIE, TAK};
  5.  
  6. struct element                                         
  7. {
  8.     int var;                                            //zmienna typu int przechowuj¹ca wartosæ                                             
  9.     struct element *nastepny;           //wskaŸnik na nastêpny element
  10. };
  11.  
  12. // pierwszy -> element1 -> element2 -> element3 -> ... -> elementx -> ostatni
  13. struct element *pierwszy = NULL;                //wskaŸnik na pierwszy element listy
  14. struct element *ostatni = NULL;                 //wskaŸnik na bierz¹cy element listy
  15.  
  16.  
  17. struct element* utworz_liste(int var)
  18. {
  19.     printf("Utworzenie listy z elementem poczatkowym o wartosci: %d\n",var);
  20.     struct element *wsk = (struct element*)malloc(sizeof(struct element));                      //alokacja pamiêci na pierwszy element listy
  21.     if(NULL == wsk)                                                                                                                                     //w przypadku nieprzydzielenia pamiêci na element listy
  22.     {                                                                                                                                                           //funkcja zwraca NULL, co swiadczy o niepowodzeniu
  23.         printf("Nieudana proba utworzenia pierwszego elementu listy!\n");                       //tworzenia listy
  24.         return NULL;
  25.     }
  26.     wsk->var = var;                                                                                                                                     //przypisanie wartosci typu int do utworzonego elementu
  27.     wsk->nastepny = NULL;                                                                                                                       //aktualnie nie ma kolejnego elementu na liscie
  28.  
  29.     pierwszy = ostatni = wsk;                                                                                                           //utworzony element jest pierwszym elementem na liscie
  30.     return wsk;                                                                                                                                         //i jednoczesnie elementem bie¿¹cym
  31. }
  32.  
  33.  
  34. struct element* dodaj_do_listy(int var, enum flaga dodaj_na_koncu)
  35. {
  36.     if(NULL == pierwszy)
  37.     {
  38.         return (utworz_liste(var));                                                                                                     //jesli lista jest pusta to dodaj utworz pierwszy element
  39.     }
  40.  
  41.     if(dodaj_na_koncu)                                                                                                                          //wyswietlanie komunikatu gdzie bedzie dodany nowy element
  42.         printf("Dodanie elementu listy na jej koncu o wartosci: %d\n",var);                     //zgodnie z wartoscia przekazanego argumentu dodaj_na_koncu
  43.     else                                                                                                                                                        //gdy dodaj_na_koncu == true to nowy element jest dodawany
  44.         printf("Dodanie elementu listy na jej poczatku o wartosci: %d\n",var);          //na koncu listy.
  45.  
  46.     struct element *wsk = (struct element*)malloc(sizeof(struct element));                      //alokacja pamiêci na kolejny element listy
  47.     if(NULL == wsk)                                                                                                                                     //w przypadku nieprzydzielenia pamiêci na element listy
  48.     {                                                                                                                                                           //funkcja zwraca NULL, co swiadczy o niepowodzeniu
  49.         printf("Nieudana proba utworzenia nowego elementu listy!\n");                           //utworzenia nowego elementu listy
  50.         return NULL;
  51.     }
  52.     wsk->var = var;                                                                                                                                     //przypisanie wartosci typu int do utworzonego elementu
  53.     wsk->nastepny = NULL;                                                                                                                       //aktualnie nie ma kolejnego elementu na liscie
  54.  
  55.     if(dodaj_na_koncu)                                                                                                                          //ustawienie odpowiednie nowego elementu na koncu
  56.     {                                                                                                                                                           //lub na poczatku listy oraz ustawienie polaczen
  57.         ostatni->nastepny = wsk;                                                                                                        //pomiedzy elementami w kazdym przypadku
  58.         ostatni = wsk;
  59.     }
  60.     else
  61.     {
  62.         wsk->nastepny = pierwszy;
  63.         pierwszy = wsk;
  64.     }
  65.     return wsk;                                                                                                                                         //funkcja zwraca wskaznik do nowoutworzonego elementu
  66. }
  67.  
  68.  
  69. struct element* przeszukaj_liste(int var, struct element **poprzedni)
  70. {
  71.     struct element *wsk = pierwszy;                                                                                                     //zmienne pomocnicze w funkcji
  72.     struct element *tmp = NULL;                                                                                                         //poszukiwanie zaczyna siê od pierwszego elementu na liscie
  73.     int znaleziony = 0;
  74.  
  75.     printf("...Przeszukiwanie listy. Szukana wartosc: %d \n",var);
  76.  
  77.     while(wsk != NULL)
  78.     {
  79.         if(wsk->var == var)                                                                                                                     //jesli szukana wartosc zostala znaleziona na liscie
  80.         {                                                                                                                                                       //to dzialanie petli zostaje przerwane
  81.             znaleziony = 1;
  82.             break;
  83.         }
  84.         else
  85.         {
  86.             tmp = wsk;
  87.             wsk = wsk->nastepny;
  88.         }
  89.     }
  90.  
  91.     if(1 == znaleziony)
  92.     {
  93.         if(poprzedni)                                                                                                                           //jesli do funkcji przekazany jest adres wskaznika
  94.             *poprzedni = tmp;                                                                                                           //do poprzedniego elementu wzgledem wyszukanego
  95.         return wsk;                                                                                                                                     //to jego wartosc jest ustawiana - wykorzystane w funkcji
  96.     }                                                                                                                                                           //skasuj_wartosc_z_listy(...)
  97.     else                                                                                                                                                        //funkcja zwraca wskaznik do struktury, ktora zwiera poszukiwana wartosc
  98.     {
  99.         return NULL;
  100.     }
  101. }
  102.  
  103.  
  104. int skasuj_wartosc_z_listy(int var)
  105. {
  106.     struct element *poprzedni = NULL;                                                                                           //zmienne pomocnicze w funkcji
  107.     struct element *do_skasowania = NULL;
  108.  
  109.     printf("...Kasowanie wartosci: %d z listy elementow\n",var);
  110.  
  111.     do_skasowania = przeszukaj_liste(var,&poprzedni);                                                           //znajdz pierwsza strukture zgodna ze wzorcem var,
  112.                                                                                                                                                                 //która zostanie skasowana
  113.         if(NULL == do_skasowania)
  114.     {
  115.         return -1;                                                                                                                                      //jesli nie znaleziono poszukiwanej wartosci to funkcja zwraca -1
  116.     }
  117.     else
  118.     {
  119.         if(NULL != poprzedni)                                                                                                           //wylaczenie kasowanego elementu z listy
  120.             poprzedni->nastepny = do_skasowania->nastepny;                                                      //czyli poprzestawianie wskaznikow w elementach
  121.                                                                                                                                                                         //omijajac element kasowany
  122.         if(do_skasowania == ostatni)                                                                                            //w zlaeznosci czy kasowany elemen znajduje sie:
  123.         {                                                                                                                                                       //wewnatrz listy, na koncu listy lub na poczatku listy
  124.             ostatni = poprzedni;
  125.         }
  126.         else if(do_skasowania == pierwszy)
  127.         {
  128.             pierwszy = do_skasowania->nastepny;
  129.         }
  130.     }
  131.  
  132.     free(do_skasowania);                                                                                                                        //zwolnienie pamieci skasowanego elementu
  133.     do_skasowania = NULL;                                                                                                                       //"wyzerowanie" wskaznika
  134.  
  135.     return 0;
  136. }
  137.  
  138.  
  139. void wydrukuj_liste(void)
  140. {                                                                                                                                                                       //funkcja wypisuje elementy listy
  141.     struct element *wsk = pierwszy;                                                                                                     //nadajac im "umowne" numery porz¹dkowe
  142.     int i=0;
  143.     if(NULL == wsk)
  144.     {
  145.         printf("Lista jest pusta!\n"); 
  146.     }
  147.         else
  148.     {
  149.             printf("\n ------- Wydruk listy / Poczatek ------- \n");
  150.             while(wsk != NULL)
  151.             {
  152.                 printf("%3d. %5d \n",i,wsk->var);
  153.                 wsk = wsk->nastepny;
  154.                 i++;
  155.             }
  156.             printf("------- Wydruk listy / Koniec --------- \n");
  157.         }
  158.     return;
  159. }
  160.  
  161. int main(void)
  162. {
  163.     int i = 0, res = 0;
  164.     struct element *wsk = NULL;
  165.  
  166.     wydrukuj_liste();  
  167.        
  168.     for(i = 100; i<105; i++)
  169.         dodaj_do_listy(i,TAK);
  170.  
  171.     wydrukuj_liste();
  172.        
  173.     for(i = 40; i>35; i--)
  174.         dodaj_do_listy(i,NIE);
  175.  
  176.     wydrukuj_liste();          
  177.        
  178.     for(i = 100; i<105; i += 2)
  179.     {
  180.         wsk = przeszukaj_liste(i, NULL);
  181.         if(NULL == wsk)
  182.         {
  183.             printf("Szukana wartosc: %d, nie zosta³a znaleziona na liscie elementow!\n",i);
  184.         }
  185.         else
  186.         {
  187.             printf("...Szukana wartosc: %d, zostala znaleziona!\n",wsk->var);
  188.         }
  189.  
  190.         wydrukuj_liste();
  191.                
  192.                 res = skasuj_wartosc_z_listy(i);
  193.         if(res != 0)
  194.         {
  195.             printf("Wartosc: %d nie zostala skasowana z powodu braku jej na liscie!\n",i);
  196.         }
  197.         else
  198.         {
  199.             printf("...Wartosc: %d zostala skasowana z listy! \n",i);
  200.         }
  201.  
  202.         wydrukuj_liste();
  203.     }
  204.        
  205.     return 0;
  206. }
  207.