[C++] własna lista niedziałająca funkcja usunelement

gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] własna lista niedziałająca funkcja usunelement

Post autor: gabrysb1995 »

Chcę nauczyć się wreszcie obiektowości i po przeczytaniu rozdziału o klasach zacząłem sobie pisać od zera strukturę danych listę.

Kod: Zaznacz cały

#include<iostream>

using namespace std;

class rekord
{
	friend class lista;
		int dane;
		rekord *wsk;
};

class lista
{
	private:
		rekord *poczatek;
		rekord *koniec;
	
	public:
		lista();
		void dodaj(int);
		void zamien(int, int);
		bool pusta();
		void wyswietlwszystkie();
		int iloscelementow();
		void usunelement(int);
};

lista::lista()
{
	poczatek=NULL;
	koniec=NULL;
}

bool lista::pusta()
{
	return(poczatek==NULL?1:0);
}


void lista::dodaj(int liczba)                 //dodaj elelement na koniec listy
{
	if(pusta())
	{
		rekord *wskpom;			// wskaznik pomocniczy
		wskpom = new rekord;	//tworzenie rekordu
		poczatek=wskpom;		//przypisanie wskaznika
		koniec=wskpom;
		wskpom->dane=liczba;	//wpisanie danych
		wskpom->wsk=NULL;		//wskaznik rekordu
	}
	else
	{
		rekord *wskpom;			// wskaznik pomocniczy
		wskpom = new rekord;	//tworzenie rekordu
		koniec->wsk=wskpom;		//przypisanie wskaznika nowego rekordu do ostatniego rekordu listy
		koniec=wskpom;			//wskaznik do konca listy
		wskpom->dane=liczba;	//wspisanie danych
		wskpom->wsk=NULL;		//wskaznik rekordu
	}
}

void lista::wyswietlwszystkie()
{
	rekord *wskpom=poczatek;
	while(wskpom!=NULL)
	{
		cout << wskpom->dane << " ";
		wskpom=(wskpom->wsk);			//przypisanie nastepnego wskaznika
	}
	if(pusta()==false)
	cout << endl;
}

int lista::iloscelementow()
{
	rekord *wskpom=poczatek;
	int licznik=0;
	while(wskpom!=NULL)					//przypisanie nastepnego wskaznika
	{
		licznik++;
		wskpom=(wskpom->wsk);
	}
	return(licznik);
}

void lista::usunelement(int numer)
{
	rekord *wskpom=poczatek;
	if(numer==1)
	{
		poczatek=(poczatek->wsk);
		delete wskpom;
	}
	if(numer >1 && numer < iloscelementow())
	{
		int licznik=1;
		while(licznik<numer-1)			//szukanie elementu poprzedzającego element usuwany
		{
			licznik++;
			wskpom=(wskpom->wsk);
		}
		rekord *wskpom2=(wskpom->wsk)->wsk;
		delete (wskpom->wsk);
		(wskpom->wsk)=wskpom2;
	}
	if(numer==iloscelementow())
	{
		int licznik=1;
		while(licznik<iloscelementow()-1)
		{
			licznik++;
			wskpom=(wskpom->wsk);
		}
		delete (wskpom->wsk);
		wskpom->wsk=NULL;
		koniec=wskpom; 	
	}
}



int main()
{
	int tablica[]={1, 2 , 3 , 4 , 5, 6};
	lista lista1;
	for(int i=0; i<6; i++)
		lista1.dodaj(tablica[i]);
	lista1.wyswietlwszystkie();
	cout << lista1.iloscelementow() <<endl;
	lista1.usunelement(4);
	lista1.wyswietlwszystkie();
	cout << lista1.iloscelementow();
}
Przy funkcji usuń element wyrzuca mi błąd gdy próbuję usunąć element przedostatni, dla innych jest wszystko ok, mógłby ktoś poratować i powiedzieć co jest nie tak? Błąd jest w 104 linii kodu. Po usunięciu rekordu, próbuje aby wskaznik poprzedzającego rekordu zaczął pokazywać na następny. Gdy tą linijkę wyrzucę, to błędu nie dostaje, tylko lista się rozwala.

edit wskpom= to skrót od wskaznika pomocniczego.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] własna lista niedziałająca funkcja usunelement

Post autor: Afish »

W funkcji kasującej masz trzy if-y, po wykonaniu drugiego zmienia się rozmiar listy, więc wykonuje się też trzeci. Dodaj else lub wyjdź z funkcji przez return.
gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] własna lista niedziałająca funkcja usunelement

Post autor: gabrysb1995 »

Dzięki wielkie, już działa, głupie przeoczenie z mojej strony -- 19 sie 2015, o 17:46 --A tak mam jeszcze jedno pytanie, może pomożesz, jak zadeklarować funkcję, która będzie zwracać wskaźnik do obiektu rekord, a pobierać będzie zmienną całkowitą?

Próbowałem (*rekord) nazwafunkcji (int) ale nie chce działać.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] własna lista niedziałająca funkcja usunelement

Post autor: Afish »

rekord *foo(int bar)
gabrysb1995
Użytkownik
Użytkownik
Posty: 96
Rejestracja: 12 mar 2011, o 14:27
Płeć: Mężczyzna
Lokalizacja: Przemyśl
Podziękował: 27 razy

[C++] własna lista niedziałająca funkcja usunelement

Post autor: gabrysb1995 »

jeszcze raz dziękuję.
ODPOWIEDZ