Witam. Poniżej przedstawię funkcję do listy, który liczy sumę elementów znajdujących się na liście, następnie kopiuje na na koniec listy tyle elementów, ile wynosi ich pierwotna suma.
void suma (mode *&head)
{
if (head)
{
int suma = 0;
int licznik = 0;
mode*p = head;
mode*p2 = head;
while (p->next) // nie wejdzie do ostatniego elementu, stąd dodanie go po pętli
{
suma = p->vol + suma;
p = p->next;
}
suma = p->vol + suma;
while (suma > licznik)
{
p -> next = new mode;
p -> next -> vol = p2 ->vol;
p2 = p2->next;
p = p->next;
licznik++;
}
p->next = NULL;
}
}
Przy obecnej formie kodu nie będzie zsumowany ostatni element, który jest dodawany już poza pętlą. Próbowałem zrobić tam while (p), następnie, kiedy pierwsza pętla przy ostatnim elemencie przesunęłaby wskaźnik pomocniczy na puste miejsce, w następnej pętli deklarowałbym nowe miejsce po prostu dla p, a nie p->next. To jednak nie działa, Visual wszystko buguje, nie mam pojęcia, dlaczego. Alternatywna wersja kodu, która wydaje mi się o wiele bardziej poprawna, wyglądałaby tak:
void suma (mode *&head)
{
if (head)
{
int suma = 0;
int licznik = 0;
mode*p = head;
mode*p2 = head;
while (p)
{
suma = p->vol + suma;
p = p->next;
}
while (suma > licznik)
{
p = new mode;
p -> vol = p2 ->vol;
p2 = p2->next;
p = p->next;
licznik++;
}
p->next = NULL;
}
}