Lista jednokierunkowa - problemy

#include 

#include 


using namespace std;


/*class Student

{

 public:

  //skladniki publiczne


  //funkcje do obsługi

// void dodajEL(); //dodaje studenta

// void usunEL(); //usuwa studenta


 private:



}; //koniec klasy*/


struct EL {

	int nr_i; //numer indeksu

	EL *next; //nastepny element

};


string imie;

string nazwisko;


//prototypy funkcji


void dodajELp(EL *&s); //dodaje element na poczatek

void dodajELk(EL *&s); //dodaje element na koniec

void wyswietlEL(EL *&s); //wyswietla element

void usunEL(EL *&s); //usuwa jeden element

//void usun(EL *&s); //usuwa wszystko

int ileEL(EL *&s); //liczy elementy


EL *start = NULL;


int main()

{


    int wybor;


    do {


     cerr << "Co chcesz zrobic?\n\n"

          << "[1] Wpisz 1, by dodac studenta na koniec listy "<< endl

          << "[2] Wpisz 2, by dodac studenta na poczatek listy "<< endl

          << "[3] Wpisz 3, by policzyc zapisanych studentow "<< endl

          << "[4] Wpisz 4, by wyswietlic informacje o studencie "<< endl

          << "[5] Wpisz 5, by usunac studenta "<< endl

          << "[6] Wpisz 6, by skasowac liste "<< endl

          << "[0] Wpisz 0, by zakonczyc program "<< endl;


     cin >> wybor;


      switch(wybor)

      {

       case 1: dodajELp(start); break; //jest

       case 2: dodajELk(start); break; //jest po czesci

       case 3: cout << "Jest "<< ileEL(start) << " zapisanych studentow " << endl << endl; break; //jest

// case 4: wyswietlEL(start); break; //nie ma

       case 5: usunEL(start); break; //jest

 // case 6: usun(start); break; //nie ma

       case 0: break;   

      }


    } while(wybor!=0);


	system("pause");

	return 0;

}


void dodajELp(EL *&s) //dodawanie elementow listy - studentow

{

    system("cls"); //czysc ekran    


	if(s==NULL) //jezeli pierwszy element

	{

		s=new EL; //stworz nowy

		s->next = NULL; //z wartoscia NULL


        cerr << "Wpisz imie studenta: " << endl;

        cin >> imie;


        cerr << "Wpisz nazwisko studenta: " << endl;

        cin >> nazwisko;


        cerr << "Podaj nr indeksu: " << endl;

		cin >> s->nr_i;

	}

}	

void dodajELk(EL *&s) //dodawanie elementow listy - studentow

{

	if(s->next==NULL)//tu dopisac warunek koncowego elementu!!!!!!!!!!!!!!!!!!!!                  

	{

		EL *e = new EL;

		e->next = NULL;


		s=new EL; //stworz nowy

		s->next = NULL; //z wartoscia NULL


        cerr << "Wpisz imie studenta: " << endl;

        cin >> imie;


        cerr << "Wpisz nazwisko studenta: " << endl;

        cin >> nazwisko;


        cerr << "Podaj nr indeksu: " << endl;

		cin >> s->nr_i;


		/*EL *licznik = start;

		int ile=0;

		while(licznik->next!=NULL)

		{ ile++;

			licznik=licznik->next;

		}

		licznik->next=e;


		for(int i=ile-1;i<=ile;i++)

		{  

			licznik=licznik->next;

		}*/

	}

}


void usunEL(EL *&s) //usun studenta

{

     system("cls"); //czysc ekran

     int x_nr; //numer indeksu podawany przy usunieciu


     cerr << "Podaj nr indeksu do usuniecia: \n";

     cin >> x_nr;

     EL *licznik = start; //licznik na poczatek


     	while(licznik->next!=NULL) //petla przechodzimy az do elementu przedostatniego listy

		{     

              if(licznik->nr_i==x_nr) //jezeli numer indeksu zgadza sie z szukanym

              {

                   //if(licznik->next==NULL)  

                   //{

                    delete s; //usun studenta

                   //}

              }        

        licznik=licznik->next; //przypisz dla aktualnego elementu listy, kolejna wartosc

        }

}


int ileEL(EL*&s) //licznik elementow

{ 

    system("cls");


	int x=0;

	while(s!=NULL)                          

	{

		x++;

		s=s->next;                          

	}

	return x;

}

[/code]

Napisałem program oparty na funkcjach, ale nie działa tak ja powinien.

Np nie rozumiem dlaczego dodawanie elementu koncowego listy (wybór 2) zawiesza działanie programu.

Gdy chciałem usunąć konkretnego studenta po nr indeksu, także zawiesiła się konsola.

Czemu tak się dzieje?

Tak się dzieje dla tego ze nie masz żadnej funkcji napisanej poprawnie.

Jedynie ileEL() mniej więcej, jeżeli nie liczyć niepotrzebnie użytej inkrementacji przyrostkowej zamiast przedrostkowej, oraz czyszczenia ekranu wewnątrz tej funkcji.