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

Sumowanie elementów listy jednokierunkowej

Aruba Cloud - Virtual Private Server VPS
0 głosów
848 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

+2 głosów
2 odpowiedzi 134 wizyt
0 głosów
2 odpowiedzi 546 wizyt
0 głosów
1 odpowiedź 730 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...