W stawianie elementów do listy w pętli.

0

Witam, mam taki dziwny problem że jak próbuje wstawiać elementy do listy w pętli for to nie wstawiają się one poprawnie tzn. wskaźnik na następny element wskazuje na element macierzysty i program się zapętla przy próbie wyświetlania, A jeśli wstawię elementy po kolei w osobnych instrukcjach to wszystko działa poprawnie. Czego nie dostrzegam? Z góry dzięki za pomoc

Ps. dodatkowo załączam plik z danymi do przetestowania

#include <iostream>
#include <fstream>

using namespace std;

class elem_lista {
private:
	elem_lista *nast;
	int nr_albumu;
	string imie;
	string nazwisko;
	int rok_studiow;
	string kierunek;
	string specjalnosc;
public:
	elem_lista();
	elem_lista* get_nast();
	int get_nr_albumu();
	string get_imie();
	string get_nazwisko();
	int get_rok_studiow();
	string get_kierunek();
	string get_specjalnosc();
	void set_nast(elem_lista* Nast);
	void set_nr_albumu(int Nr_albumu);
	void set_imie(string Imie);
	void set_nazwisko(string Nazwisko);
	void set_rok_studiow(int Rok_studiow);
	void set_kierunek(string Kierunek);
	void set_specjalnnosc(string Specjalnosc);
	void display_elem();
	void set_values(fstream &Strumien);
};

elem_lista* elem_lista::get_nast() {
	return nast;
}
elem_lista::elem_lista() {
	nast = NULL;
}
int elem_lista::get_nr_albumu() {
	return nr_albumu;
}
string elem_lista::get_imie() {
	return imie;
}
string elem_lista::get_nazwisko() {
	return nazwisko;
}
int elem_lista::get_rok_studiow() {
	return rok_studiow;
}
string elem_lista::get_kierunek() {
	return kierunek;
}
string elem_lista::get_specjalnosc() {
	return specjalnosc;
}
void elem_lista::set_nast(elem_lista* Nast) {
	nast = Nast;
}
void elem_lista::set_nr_albumu(int Nr_albumu) {
	nr_albumu = Nr_albumu;
}
void elem_lista::set_imie(string Imie) {
	imie = Imie;
}
void elem_lista::set_nazwisko(string Nazwisko) {
	nazwisko = Nazwisko;
}
void elem_lista::set_rok_studiow(int Rok_studiow) {
	rok_studiow = Rok_studiow;
}
void elem_lista::set_kierunek(string Kierunek) {
	kierunek = Kierunek;
}
void elem_lista::set_specjalnnosc(string Specjalnosc) {
	specjalnosc = Specjalnosc;
}
void elem_lista::display_elem() {
	cout << endl << "Imie: " << imie << endl << "Nazwisko: " << nazwisko;
	cout << endl << "Nr albumu: " << nr_albumu << endl << "Rok studiow: "
			<< rok_studiow;
	cout << endl << "Kierunek: " << kierunek << endl << "Specjalnosc: "
			<< specjalnosc << endl;
}

void elem_lista::set_values(fstream &Strumien){
	Strumien >> imie>> nazwisko>> nr_albumu>> rok_studiow>> kierunek>> specjalnosc;
}



class lista {
private:
	elem_lista* front;
	elem_lista* end;
public:
	lista();
	elem_lista* get_front();
	void push_front(elem_lista element);
	void push_back(elem_lista element);
	void push_many(elem_lista tab[], int ilosc);
	void pop_front();
	void push_after(elem_lista* element, elem_lista nowy);
	elem_lista* find(int Indeks, string Nazwisko);
	void erase_elem(elem_lista* element);
};

elem_lista* lista::get_front() {
	return front;
}

void lista::push_front(elem_lista element) {
	elem_lista *temp = front;
	front = &element;
	if (end == NULL)
		end = &element;
	else
		element.set_nast(temp);
}

void lista::push_many(elem_lista tab[], int ilosc) {
	for (int i = 0; i < ilosc; i++) {
		push_front(tab[i]);
	}
}

void lista::push_back(elem_lista element) {
	end->set_nast(&element);
	end = &element;
}

void lista::pop_front() {
	elem_lista *temp = front;
	temp = temp->get_nast();
	front = temp;
}

void lista::push_after(elem_lista* element, elem_lista nowy) {
	elem_lista *temp = element->get_nast();
	element->set_nast(&nowy);
	nowy.set_nast(temp);
}

elem_lista* lista::find(int Indeks, string Nazwisko) {
	elem_lista* temp = front;
	while (temp) {
		if (temp->get_nr_albumu() == Indeks && temp->get_nazwisko() == Nazwisko)
			return temp;
		temp = temp->get_nast();
	}
	return NULL;
}

void lista::erase_elem(elem_lista* element) {
	elem_lista* temp = front;
	while (temp) {
		if (temp == element) {
			temp->set_nast(element->get_nast());
		}
		temp = temp->get_nast();
	}
}

lista::lista() {
	front = NULL;
	end = NULL;
}

void display_list(lista kolejka) {
	elem_lista* temp = kolejka.get_front();
	while (temp) {
		temp->display_elem();
		temp = temp->get_nast();
	}
}

int main() {
        lista kolejka;
	fstream plik;
	plik.open( "dane.txt", std::ios::in | std::ios::out );
	if(!plik.good()){
    	cerr << "Nie udalo sie otworzyc pliku!" << endl;
	}
	
	elem_lista tab[3];
	for (int i = 0; i < 3; i++) tab[i].set_values(plik);
	

//Jeśli zrobię tak to działa poprawnie
/*     kolejka.push_front(tab[0]);
	kolejka.push_front(tab[1]);
	kolejka.push_front(tab[2]);
*/

//jeśli zrobię tak to nie działa
	for (int i = 0; i < 3; i++) {
		kolejka.push_front(tab[i]);
	}

	display_list(kolejka);
	return 0;
}
 
0
void lista::push_front(elem_lista element) {
    elem_lista *temp = front;
    front = &element;

element to zmienna lokalna, więc po wyjściu z funkcji przestanie istnieć. Trzymanie i odwołanie się do jej adresu powoduje nieobliczalne skutki.

0
  1. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  3. Stworzyłeś studento-krzesło-grupę - takie coś nie ma prawa istnieć, podziel to na 3 klasy: Student, ListOfStudent, NodeOfStudent - ta ostatnia jako wewnętrzna prywatna struktura klasy ListOfStudent.

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