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

Sumowanie elementów listy jednokierunkowej

VPS Starter Arubacloud
0 głosów
682 wizyt
pytanie zadane 12 lutego 2020 w C i C++ przez Agnes Użytkownik (990 p.)

Próbuję napisać funkcję, która sumuje wartości w liście powiązanej. Co tu jest nie tak:

int zsumuj(element* pHead)
{
	int suma = 0;

	element* temp = pHead;

	

	if (pHead == nullptr)
	{
		return 0;
	}
	while (temp->pNext != nullptr)
	{
		suma += temp->wartosc;
		temp = temp->pNext;
	}

	delete temp;

	return suma;
}
int main()
{
	int suma = 0;

	pHead = dodaj(0);
	element* temp = pHead;

	for (int i = 1; i < 11; i++)
	{
		temp->pNext = dodaj(i);
		temp = temp->pNext;

	}
	delete temp;

	cout << zsumuj(pHead);
}

Czy problemem jest inicjalizacja elementów listy w pętli for w mainie?

1 odpowiedź

0 głosów
odpowiedź 12 lutego 2020 przez RafalS VIP (122,820 p.)

Ciężko powiedzieć bez zobaczenia całego kodu, ale na pewno nie powinieneś wołać:

delete temp;

W żadnych z dwóch przypadków nie ma sensu usuwać ostatniego elementu z listy (i to bez ustawienia poprzedniemu node'owi wskaźnika na nullptr)

komentarz 12 lutego 2020 przez Agnes Użytkownik (990 p.)
Tak, chodziło właśnie o wołanie delete'a, po usunięciu go wszystko działa dobrze.

Ale podczas pisania tego kodu wydawało mi się, że temp po wyjściu z każdej z pętli nie jest już potrzebny, więc należy go usunąć. temp miał służyć tylko do przechodzenia po kolejnych elementach listy i nie rozumiem czemu ostatni element listy jest usuwany, skoro delete jest wołany dopiero, gdy pętla się zakończy.
komentarz 12 lutego 2020 przez RafalS VIP (122,820 p.)

Samo użycie wskaźnika nie oznacza, że musisz go zwolnić:

int *p = new int;
...
int *tmp = p;

Jeśli nie chcesz w tej sytuacji, żeby obszar zarezerwowany na inta i wskazywany przez p nie przestał istnieć, to nie możesz zawołać 'delete tmp'. Masz dwa wskaźniki na ten sam obszar pamięci, ale to p - tak jakby - odpowiada za zwolnienie tego obszaru. Tmp to wskaźnik tymczasowy i semantycznie nie jest właścicielem obszaru, na który wskazuje.

Możesz też myśleć o tym, że każdemu new odpowiada dokładnie jedno delete. Nie miałeś tutaj new. Elementy listy są wcześniej zaalokowane przez new, ale nie chcesz ich tutaj usuwać, a przy tworzeniu tmp nie wywołałeś kolejnego new.

Podobne pytania

0 głosów
2 odpowiedzi 439 wizyt
0 głosów
1 odpowiedź 547 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)
0 głosów
1 odpowiedź 690 wizyt
pytanie zadane 19 stycznia 2019 w C i C++ przez dzuulie Nowicjusz (120 p.)

92,840 zapytań

141,781 odpowiedzi

320,856 komentarzy

62,172 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

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!

...