//TWORZENIE.EXE
//Wczytuj calkowite poki nie napiszesz 0, drukuj liste i usun.
#include <iostream>
using namespace std;
struct SLista
{
int dane;
SLista *next;
};
void stworzenie(SLista *&glowa)
{
SLista *akt, *ogon; //Deklaruje ogon i akt bo tylko tutaj bede tego uzywal.
glowa=new SLista; //Tworzę nowy element typu SLista i głowa na niego wskazuje. [1]
cout<<"Podawaj liczby calkowite, 0 konczy liste:"<<endl; // [1]
cin>>glowa->dane; //Wpisuje w dane liczbe. [1]
if(glowa->dane==0) //Warunek, jak w dane dam zero to wywala funkcje. [1]
{
cout<<"Koniec."; // [1]
glowa->next=NULL; //Wskaznik glowa-next wskazuje na NULL, zeby wiadomo bylo ze to otatni element listy. [1]
return; //Wywala do maina. [1]
}
akt=glowa; //Wskaznik akt wskazuje tam gdzie wskaznik glowa (czyli na glowe) i wejdziemy w petle. [2]
while(akt->dane!=0) //Poki nie wpiszesz zero to: [2]
{
ogon=akt; //Wskaznik ogon wskazuje tam gdzie wskaznik akt (ogon wskazuje na przedostatni element gdy stworzymy akt). [2][5]
akt=new SLista; //Tworze ostatni element mojej listy i wskazuje na niego akt. [3][6]
cin>>akt->dane; //Wpisuje cos w pole dane w akt.[3][6]
akt->next=NULL; //Wskaznik akt-next wskazuje na NULL. [3][6]
ogon->next=akt; //Wskaznik ogon-next wskazuje na ostatni element (akt). [4][7]
}
}
void drukuj(SLista *glowa) //tutaj nie mozna tego "&" bo wszystko na nic i po co zyc.
{
cout<<"Drukuje: "<<endl;
while(glowa!=NULL)
{
cout<<glowa->dane<<'\t'; //[1]Wyswietla z 1. komorki. [2]Wyswietla dane z tego co wskazuje next z glowy (czyli nastepna komorka)
glowa=glowa->next; //[1]Glowa staje sie nextem z glowy. [2]Przechodzi dalej.
}
}
void usunall(SLista *&glowa)
{
SLista *tmp; //pomocnicza w ktorej beda elemnty od poczatku usuwane.
while(glowa!=NULL)//poki nie dojdziemy do konca.
{
tmp=glowa; //[1]pomocnicza stanie sie 1. elementem. [2]Pomocnicza staje sie kolejnym elementem.(n)
glowa=glowa->next; //[1]Glowa staje sie nextem z glowy. [2]Glowa staje sie kolejnym.(n+1)
delete tmp; //[1]usuwamy 1. element. [2]Usuwamy tmp (n)
}
}
void usunele(SLista *&glowa)
{
cout<<endl<<"Podaj nr. elemntu do usuniecia."<<endl;
int licznik;
cin>>licznik;
SLista *tmp=glowa, *tmp2;
if(licznik==1)
{
glowa=glowa->next;
delete tmp;
}
else
{
while(licznik>2) //Ta petla po to zeby znalezc element przed usuwanym.
{
tmp2=tmp;
tmp=tmp->next;
licznik--;
}
tmp2=tmp->next; // W tmp bedzie element ktory mam usnac.
tmp->next=tmp2->next; //Wskaznik wczesniejszgo od usunietego elementu wskazuje na nastpepny po usunietym.
delete tmp2;
}//Usuwam to co mam usunac, lol.
}
void dodaj(SLista *&glowa)
{
int licznik, y;
cout<<endl<<"Gdzie chcesz cos dodac?"<<endl;
cin>>licznik;
cout<<endl<<"Co chcesz dodac?"<<endl;
cin>>y;
SLista *tmp=glowa,*tmp2;
if(licznik==0)
{
tmp=new SLista;
tmp->dane=y;
tmp->next=glowa;
glowa=tmp;
}
else
{
while(licznik>1)
{
tmp=tmp->next;
licznik--;
}
tmp2=new SLista;
tmp2->dane=y;
tmp2->next=tmp->next;
tmp->next=tmp2;
}
}
int main()
{
SLista *glowa;
stworzenie(glowa);
drukuj(glowa);
usunele(glowa);
drukuj(glowa);
dodaj(glowa);
drukuj(glowa);
usunall(glowa);
}