Proszę o sprawdzenie impl. listy jednokierunkowej

0

Programowanie obiektowe - lista zadań nr 3.
Korzystając z klasy Student z poprzedniej listy, stworzyć
listę jednokierunkową umoŜliwiającą wczytanie dowolnej liczby
obiektów typu Student. Składniki klasy muszą być chronione
(private) i dostępne tylko za pomocą odpowiednich metod.
NaleŜy stworzyć Menu umoŜliwiające:
a) Dodanie i wprowadzenie danych nowego studenta na koniec
listy (zwiększając o 1 licznik z ilością obiektów klasy
student - licznik nie moŜe być zmienną globalną)
b) Dodanie i wprowadzenie danych nowego studenta na początek
listy (zwiększając o 1 licznik z ilością obiektów klasy
student - licznik nie moŜe być zmienną globalną)
c) Wyświetlenie ilości aktualnie zapisanych studentów oraz
ich danych (imię, nazwisko, numer indeksu)
d) Wyświetlenie informacji o jednym studencie na podstawie
wczytanego z klawiatury numeru indeksu (wszystkie informacje
z klasy Student)
e) Usunięcie pojedynczego studenta na podstawie wczytanego z
klawiatury numeru indeksu
f) Skasowanie całej listy i zakończenie programu.
Nowe elementy w liście mają być tworzone dynamicznie. Proszę
pamiętać o zwalnianiu pamięci przy kasowaniu elementów z
listy.

#include <iostream>
#include <string>

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;
}

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?

0

Przy usuwaniu nie zostawiasz ciaglosci listy, wiec sie sypie, a dodawanie jakies dziwne w ogóle bez opcji dodania 3 elementu.
Dla takiej struktury:

typedef struct student {
 int index;
 struct student *next;
} LISTA;
LISTA *first = NULL;

Tak wyglada funkcja dodajaca:

void dodaj (LISTA *ptr, int value) {
 LISTA *new;
 new = (LISTA*)malloc(sizeof(LISTA));
 new->index = value;
 new->next = NULL;
 if(ptr == NULL)
   first = new;
 else {
   while(ptr->next != NULL) ptr = ptr->next;
   ptr->next = new;
 }
}

Co do usuwajacej to tak:

void usun(LISTA *ptr, int value)
{
   LISTA *del;
   while(ptr->next->index != value) ptr = ptr->next;
   del = ptr->next;
   ptr->next = del->next;
   free(del);
}

Funkcja usuwajaca nie przewiduje kilku rzeczy, wiec bedziesz musial poprawic oraz zamienic malloc na new.

1 użytkowników online, w tym zalogowanych: 0, gości: 1