• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Próba stworzenia dziennika uwag(problem w kodzie) C++

VPS Starter Arubacloud
0 głosów
204 wizyt
pytanie zadane 20 stycznia 2019 w C i C++ przez Padoski Użytkownik (990 p.)

Hejka Pisze w C++, chciałem napisać dziennik uwag uzywając struktur i list jednokierunkowych. Niestety w moim kodzie podczas kompilacji pojawia się kilka błędów m.i.n

Zgłoszono wyjątek: naruszenie dostępu do odczytu.
this było 0xCDCDCDCD.                                               w lini 24

Prosiłbym o pomoc, i sprawdzenie tego kodu, mam tez pewne watpliowsci cz poprawnie napisalem funkcje dodaj oraz usun. Z gory dziekuje za pokazanie mi bledow i wskazowki ;)

Oto kod:

#include <iostream>
#include <string>

using namespace std;

struct uczen {
	string imie;
	string nazwisko;
	int data;
	string uwaga;
	void drukuj();
	uczen *nastepny;
	uczen();
	
};

uczen::uczen()
{
	nastepny == nullptr;
}

void uczen::drukuj()
{
	cout << imie << " " << nazwisko << " " << data <<" "<< uwaga << endl;
}

struct ListaUczniow {
	uczen *pierwszy;
	void dodaj(string imie, string nazwisko, int data, string uwaga);
	void usun(int nr);
	void drukujListe();
	ListaUczniow();
};
ListaUczniow::ListaUczniow()
{
	pierwszy = nullptr;
}

void ListaUczniow::dodaj(string imie, string nazwisko, int data, string uwaga)
{
	uczen *nowa = new uczen;

	nowa->imie = imie;
	nowa->nazwisko = nazwisko;
	nowa->data = data;
	nowa->uwaga = uwaga;

	if (pierwszy == nullptr)
		pierwszy = nowa;
	else
	{
		uczen*biezaca = pierwszy;
		while (biezaca->nastepny) {
			biezaca = biezaca->nastepny;
		}
		biezaca->nastepny = nowa;
		nowa->nastepny = nullptr;
	}

}
void ListaUczniow::usun(int nr) 
{
	int licznik = 1;
	if (pierwszy == nullptr)
		return;
	if (nr == 1)
	{
		uczen *biezaca = pierwszy->nastepny;
		delete pierwszy;
		pierwszy = biezaca;

	}
	if(nr>=2) {
		uczen *tymczasowa;
		uczen * biezaca = pierwszy;
		while (biezaca)
		{
			if ((licznik + 1) == nr) break;
			biezaca = biezaca->nastepny;
			licznik++;
		}
		if (biezaca->nastepny->nastepny == nullptr)
		{
			delete biezaca->nastepny;
			biezaca->nastepny == nullptr;
		}

		tymczasowa = biezaca->nastepny->nastepny;
		delete biezaca->nastepny;
		biezaca->nastepny = tymczasowa;	
	}
}
void ListaUczniow::drukujListe()
{
	uczen *biezaca = pierwszy;
	while (biezaca != nullptr)
	{
		biezaca->drukuj();
		biezaca = biezaca->nastepny;
	}
}
void menu();
int main()
{
	menu();
	getchar();
	system("pause");
	return 0;
}
void menu()
{
	ListaUczniow* baza = new ListaUczniow;
	baza->dodaj("Pawel", "Kowalsz", 12, "Nie uczy sie");
	
	baza->drukujListe();

}

 

 

1 odpowiedź

0 głosów
odpowiedź 20 stycznia 2019 przez RafalS VIP (122,820 p.)
uczen::uczen()
{
	nastepny == nullptr;
}

pewnie chciałes tam przypisać a nie porównać :P

A tak na marginesie, nie musisz pisać konstruktora, żeby ustawić domyślne wartości pól. Można napisać tak:

struct uczen {
	uczen *nastepny = nullptr;
};
komentarz 20 stycznia 2019 przez Padoski Użytkownik (990 p.)

dzieki, zauwazylem tez to, lecz teraz mam problem z odczytem w funkcji usun:

void ListaUczniow::usun(int nr) 
{
	int licznik = 1;
	if (pierwszy == nullptr)
		return;
	if (nr == 1)
	{
		uczen *biezaca = pierwszy->nastepny;
		delete pierwszy;
		pierwszy = biezaca;

	}
	if(nr>=2) {
		uczen *tymczasowa;
		uczen * biezaca = pierwszy;
		while (biezaca)
		{
			if ((licznik + 1) == nr) break;
			biezaca = biezaca->nastepny; 
			licznik++;
		}
		if (biezaca->nastepny->nastepny == nullptr)
		{
			delete biezaca->nastepny;
			biezaca->nastepny = nullptr;
		}

		tymczasowa = biezaca->nastepny->nastepny; ///tu wywala blad
		delete biezaca->nastepny;
		biezaca->nastepny = tymczasowa;	
	}
}

 

komentarz 21 stycznia 2019 przez j23 Mędrzec (194,920 p.)
void ListaUczniow::usun(int nr) 
{
	uczen* prev = nullptr;
	uczen* curr = pierwszy;
	int licznik = 0;

	--nr;

	while (curr)
	{
		if (licznik == nr) break;
		prev = curr;
		curr = curr->nastepny; 
		++licznik;
	}

	if(!curr) return;
	if(prev) prev->nastepny = curr->nastepny;
	else pierwszy = curr->nastepny;
	delete curr;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 93 wizyt
pytanie zadane 24 marca 2020 w C i C++ przez Liryk Użytkownik (650 p.)
0 głosów
0 odpowiedzi 478 wizyt
pytanie zadane 21 sierpnia 2017 w C i C++ przez TomaszA2 Obywatel (1,720 p.)
+5 głosów
3 odpowiedzi 159 wizyt
pytanie zadane 8 kwietnia 2015 w SQL, bazy danych przez MatexQ Bywalec (2,260 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...