#include<stdio.h>
#include<stdlib.h>
enum flaga {NIE, TAK};
struct element
{
int var; //zmienna typu int przechowuj¹ca wartosæ
struct element *nastepny; //wskaŸnik na nastêpny element
};
// pierwszy -> element1 -> element2 -> element3 -> ... -> elementx -> ostatni
struct element *pierwszy = NULL; //wskaŸnik na pierwszy element listy
struct element *ostatni = NULL; //wskaŸnik na bierz¹cy element listy
struct element* utworz_liste(int var)
{
printf("Utworzenie listy z elementem poczatkowym o wartosci: %d\n",var
);
struct element
*wsk
= (struct element
*)malloc(sizeof(struct element
)); //alokacja pamiêci na pierwszy element listy
if(NULL == wsk) //w przypadku nieprzydzielenia pamiêci na element listy
{ //funkcja zwraca NULL, co swiadczy o niepowodzeniu
printf("Nieudana proba utworzenia pierwszego elementu listy!\n"); //tworzenia listy
return NULL;
}
wsk->var = var; //przypisanie wartosci typu int do utworzonego elementu
wsk->nastepny = NULL; //aktualnie nie ma kolejnego elementu na liscie
pierwszy = ostatni = wsk; //utworzony element jest pierwszym elementem na liscie
return wsk; //i jednoczesnie elementem bie¿¹cym
}
struct element* dodaj_do_listy(int var, enum flaga dodaj_na_koncu)
{
if(NULL == pierwszy)
{
return (utworz_liste(var)); //jesli lista jest pusta to dodaj utworz pierwszy element
}
if(dodaj_na_koncu) //wyswietlanie komunikatu gdzie bedzie dodany nowy element
printf("Dodanie elementu listy na jej koncu o wartosci: %d\n",var
); //zgodnie z wartoscia przekazanego argumentu dodaj_na_koncu
else //gdy dodaj_na_koncu == true to nowy element jest dodawany
printf("Dodanie elementu listy na jej poczatku o wartosci: %d\n",var
); //na koncu listy.
struct element
*wsk
= (struct element
*)malloc(sizeof(struct element
)); //alokacja pamiêci na kolejny element listy
if(NULL == wsk) //w przypadku nieprzydzielenia pamiêci na element listy
{ //funkcja zwraca NULL, co swiadczy o niepowodzeniu
printf("Nieudana proba utworzenia nowego elementu listy!\n"); //utworzenia nowego elementu listy
return NULL;
}
wsk->var = var; //przypisanie wartosci typu int do utworzonego elementu
wsk->nastepny = NULL; //aktualnie nie ma kolejnego elementu na liscie
if(dodaj_na_koncu) //ustawienie odpowiednie nowego elementu na koncu
{ //lub na poczatku listy oraz ustawienie polaczen
ostatni->nastepny = wsk; //pomiedzy elementami w kazdym przypadku
ostatni = wsk;
}
else
{
wsk->nastepny = pierwszy;
pierwszy = wsk;
}
return wsk; //funkcja zwraca wskaznik do nowoutworzonego elementu
}
struct element* przeszukaj_liste(int var, struct element **poprzedni)
{
struct element *wsk = pierwszy; //zmienne pomocnicze w funkcji
struct element *tmp = NULL; //poszukiwanie zaczyna siê od pierwszego elementu na liscie
int znaleziony = 0;
printf("...Przeszukiwanie listy. Szukana wartosc: %d \n",var
);
while(wsk != NULL)
{
if(wsk->var == var) //jesli szukana wartosc zostala znaleziona na liscie
{ //to dzialanie petli zostaje przerwane
znaleziony = 1;
break;
}
else
{
tmp = wsk;
wsk = wsk->nastepny;
}
}
if(1 == znaleziony)
{
if(poprzedni) //jesli do funkcji przekazany jest adres wskaznika
*poprzedni = tmp; //do poprzedniego elementu wzgledem wyszukanego
return wsk; //to jego wartosc jest ustawiana - wykorzystane w funkcji
} //skasuj_wartosc_z_listy(...)
else //funkcja zwraca wskaznik do struktury, ktora zwiera poszukiwana wartosc
{
return NULL;
}
}
int skasuj_wartosc_z_listy(int var)
{
struct element *poprzedni = NULL; //zmienne pomocnicze w funkcji
struct element *do_skasowania = NULL;
printf("...Kasowanie wartosci: %d z listy elementow\n",var
);
do_skasowania = przeszukaj_liste(var,&poprzedni); //znajdz pierwsza strukture zgodna ze wzorcem var,
//która zostanie skasowana
if(NULL == do_skasowania)
{
return -1; //jesli nie znaleziono poszukiwanej wartosci to funkcja zwraca -1
}
else
{
if(NULL != poprzedni) //wylaczenie kasowanego elementu z listy
poprzedni->nastepny = do_skasowania->nastepny; //czyli poprzestawianie wskaznikow w elementach
//omijajac element kasowany
if(do_skasowania == ostatni) //w zlaeznosci czy kasowany elemen znajduje sie:
{ //wewnatrz listy, na koncu listy lub na poczatku listy
ostatni = poprzedni;
}
else if(do_skasowania == pierwszy)
{
pierwszy = do_skasowania->nastepny;
}
}
free(do_skasowania
); //zwolnienie pamieci skasowanego elementu
do_skasowania = NULL; //"wyzerowanie" wskaznika
return 0;
}
void wydrukuj_liste(void)
{ //funkcja wypisuje elementy listy
struct element *wsk = pierwszy; //nadajac im "umowne" numery porz¹dkowe
int i=0;
if(NULL == wsk)
{
printf("Lista jest pusta!\n");
}
else
{
printf("\n ------- Wydruk listy / Poczatek ------- \n");
while(wsk != NULL)
{
printf("%3d. %5d \n",i
,wsk
->var
);
wsk = wsk->nastepny;
i++;
}
printf("------- Wydruk listy / Koniec --------- \n");
}
return;
}
int main(void)
{
int i = 0, res = 0;
struct element *wsk = NULL;
wydrukuj_liste();
for(i = 100; i<105; i++)
dodaj_do_listy(i,TAK);
wydrukuj_liste();
for(i = 40; i>35; i--)
dodaj_do_listy(i,NIE);
wydrukuj_liste();
for(i = 100; i<105; i += 2)
{
wsk = przeszukaj_liste(i, NULL);
if(NULL == wsk)
{
printf("Szukana wartosc: %d, nie zosta³a znaleziona na liscie elementow!\n",i
);
}
else
{
printf("...Szukana wartosc: %d, zostala znaleziona!\n",wsk
->var
);
}
wydrukuj_liste();
res = skasuj_wartosc_z_listy(i);
if(res != 0)
{
printf("Wartosc: %d nie zostala skasowana z powodu braku jej na liscie!\n",i
);
}
else
{
printf("...Wartosc: %d zostala skasowana z listy! \n",i
);
}
wydrukuj_liste();
}
return 0;
}