Mam zadanie: W istniejącej liście jednokierunkowej: jeśli średnia jest mniejsza od liczby T= 9 (tak dobrać wartość by warunek był prawdziwy ;) usuń z listy drugi i ostatni element. Zwrócić usunięte elementy przez parametry, zwrócić średnią (return), do listy na końcu dodać element będący sumą wcześniej usuniętych dwóch elementów.
Coś jednak nie działa. Wyskakuje w Windowsach komunikat "program przestał działać" (wykorzystuje Code::Blocks). Nie wiem w czym problem...
Z góry dziękuje za wskazanie błędu(ów). Ja nie mogę się doszukać. Wydaje się, że nie działa dodanie elementu na koniec listy (którego wartość równa jest sumie: skas1 + skas2).
Tak jak pisałem program się kompiluje, ale "wykrzacza" się w pewnym momencie :(
DZIEKUJE ZA POMOC!
#include <iostream>
using namespace std;
struct Wezel {
int dane;
Wezel * nast;
};
float FunkcjaZ1(Wezel * glowa, int &skas1, int &skas2, int T);
void addFront(Wezel *&poczatek, int dane);
int main()
{
Wezel * poczatek = NULL;
addFront(poczatek, 12);
addFront(poczatek, 10);
addFront(poczatek, 2);
addFront(poczatek, 6);
addFront(poczatek, 4);
addFront(poczatek, 5);
addFront(poczatek, 7);
addFront(poczatek, 3);
addFront(poczatek, 8);
addFront(poczatek, 1);
addFront(poczatek, 9);
addFront(poczatek, 11);
addFront(poczatek, 14);
int wartoscSkasowana1 = 0;
int wartoscSkasowana2 = 0;
float srednia;
srednia = FunkcjaZ1(poczatek, wartoscSkasowana1, wartoscSkasowana2, 8);
cout << "Wartosci skasowane:" << endl;
cout << wartoscSkasowana1 << endl;
cout << wartoscSkasowana2 << endl;
cout << "Wartosc srednia: " << srednia << endl;
return 0;
}
float FunkcjaZ1(Wezel * glowa, int &skas1, int &skas2, int T)
{
Wezel * p = glowa;
while(p)
{
cout << p->dane << endl;
p = p->nast;
}
p = glowa;
int ileEl = 0;
int sumaEl = 0;
float srednia = 0.0;
while(p)
{
ileEl++;
sumaEl+= p -> dane;
p = p->nast;
}
cout << "Liczba elementow: " << ileEl << endl;
cout << "Suma elementow: " << sumaEl << endl;
if (ileEl > 0)
{
srednia = (float)sumaEl / ileEl;
}
cout << "Srednia z elementow: " << srednia << endl;
if ((srednia < T) && (ileEl >= 3))
{
p = glowa;
Wezel * tmp;
tmp = p -> nast;
p->nast = tmp -> nast;
skas1=tmp->dane;
cout << "--kasowany element 2: " << skas1<< endl;
delete tmp;
ileEl--;
p = glowa;
for (int i=0; i<ileEl-2; i++)
{
p = p->nast;
}
tmp = p -> nast;
skas2 = tmp->dane;
cout << "--kasowany element ostatni: " << skas2<< endl;
delete tmp;
p->nast = NULL;
cout << endl << " PO SKASOWANIU OBU ELEMENTOW: " << endl;
p = glowa;
while(p)
{
cout << p->dane << endl;
cout << p->nast << endl;
p = p->nast;
}
Wezel * nowyEl = new Wezel;
p=glowa;
while(p)
{
p= p->nast;
}
p -> nast = nowyEl;
nowyEl->dane = skas1 + skas2;
nowyEl->nast = NULL;
}
return srednia;
}
void addFront(Wezel *&poczatek, int dane)
{
Wezel * tmp;
tmp = new Wezel;
tmp->dane = dane;
tmp->nast = poczatek;
poczatek = tmp;
}