Kod: Zaznacz cały
Sr=sr+tmp->x; // co dzieje się w tej linijce ?
Chyba powinno być tak:
Kod: Zaznacz cały
sr = sr + tmp->x; // co dzieje się w tej linijce ?
prawda? Po prostu do średniej (tak naprawdę to nie jest średnia, ale suma kolejnych elementów...) dodajemy wartość, jaka jest przechowywana w elemencie, na który obecnie wskazuje x.
Poczytaj czym są wskaźniki i jak ich się używa.
Z kolei ja czegoś nie rozumiem w tym kodzie. Zakładamy, że to jest lista cykliczna, tak? W takim razie ona
zawsze ma następny i poprzedni element, a Twoja procedura się nie zakończy (poza tym w pierwszym while liczysz po kolei, a w drugim wspak, więc jeśli to byłaby niecykliczna lista, to wszystko pomiędzy elementem wskazywanym przez "ptr" a końcem policzone byłoby dwukrotnie). Ja bym raz przeleciał po wszystkich elementach wychodząc z pętli gdy znów wskazujemy na to samo co
ptr, czyli zrobił tak:
Kod: Zaznacz cały
float srednia(element *ptr)
{
int liczbaElementow = 0;
float suma = 0;
element *tmp = ptr;
if(ptr == 0) // Jeśli nie ma żadnego elementu - zwróć zero.
return 0;
do // ponieważ na początku tmp == ptr, to musimy choć raz policzyć ten element
{
++liczbaElementow; // zwiększamy liczbę dotychczas policzonych elementów
suma = suma + tmp->x; // do sumy dodajemy wartość obecnie wskazywanego
tmp = tmp->next; // przechodzimy do następnego elementu
} while(tmp != ptr); // warunek przechodzenia dalej
return (suma / liczbaElementow);
}
Kontroluj małe i duże litery w zmiennych (zmienna "Sr" to co innego niż "sr"!) i w typach, a także średniki. Poza tym używaj śmiało
double zamiast
float, bo
float jest dość ograniczonej precyzji, a pamięci w kompie raczej nam tak szybko nie zabraknie ;]