Witam. Obecnie próbuję zrozumieć listy jednokierunkowe i utknąłem w zadaniu w którym trzeba zaimplementować funkcję wyszukującą zadaną wartość. Funkcja ma zwracać wskaźnik na znaleziony element. Funkcję napisałem jednak zawsze zwraca adres zerowy (czyli, że chyba nie znalazł elementu). Mógłby ktoś pomóc / podpowiedzieć co tu jest źle?
#include "Header.h"
struct Liczby_zmiennoprzecinkowe{
double liczby;
Liczby_zmiennoprzecinkowe * first;
Liczby_zmiennoprzecinkowe * next;
Liczby_zmiennoprzecinkowe();
void add_to_list(double nowa_liczba);
void print_list();
void delete_from_list_pozycja(int pozycja_liczby);
bool delete_from_list_wartosc(double wartosc_liczby);
void count();
Liczby_zmiennoprzecinkowe * Liczby_zmiennoprzecinkowe::find(double zadana_wartosc);
};
Liczby_zmiennoprzecinkowe::Liczby_zmiennoprzecinkowe(){
first = 0;
next = 0;
}
void Liczby_zmiennoprzecinkowe::add_to_list(double nowa_liczba)
{
Liczby_zmiennoprzecinkowe * nowa = new Liczby_zmiennoprzecinkowe;
nowa->liczby = nowa_liczba;
if (first == 0)
first = nowa;
else
{
Liczby_zmiennoprzecinkowe * temp = first;
while (temp->next)
temp = temp->next;
temp->next = nowa;
nowa->next = 0;
}
}
void Liczby_zmiennoprzecinkowe::print_list()
{
Liczby_zmiennoprzecinkowe * temp = first;
int i = 1;
while (temp){
cout << i << ". " << temp->liczby << endl;
temp = temp->next;
++i;
}
}
void Liczby_zmiennoprzecinkowe::delete_from_list_pozycja(int pozycja_liczby)
{
if (pozycja_liczby == 1)
{
Liczby_zmiennoprzecinkowe * temp = first;
first = temp->next;
}
if (pozycja_liczby >= 2)
{
int j = 1;
Liczby_zmiennoprzecinkowe * temp = first;
while (temp)
{
if ((j + 1) == pozycja_liczby) break;
temp = temp->next;
j++;
}
if (temp->next->next == 0)
temp->next = 0;
else
temp->next = temp->next->next;
}
}
bool Liczby_zmiennoprzecinkowe::delete_from_list_wartosc(double wartosc_liczby)
{
Liczby_zmiennoprzecinkowe * temp = first;
Liczby_zmiennoprzecinkowe * temp1 = NULL;
if (first == NULL)
return false;
while (temp != NULL && (temp->liczby) != (wartosc_liczby))
{
temp1 = temp;
temp = temp->next;
}
if (temp == NULL)
return false;
else if (temp == first)
{
first = first->next;
delete temp;
}
else
{
temp1->next = temp->next;
delete temp;
}
return true;
}
void Liczby_zmiennoprzecinkowe::count()
{
Liczby_zmiennoprzecinkowe * temp = first;
int i = 0;
while (temp){
temp = temp->next;
i++;
}
cout << "\nLiczba elementow listy: " << i << endl;
}
Liczby_zmiennoprzecinkowe * Liczby_zmiennoprzecinkowe::find(double zadana_wartosc)
{
Liczby_zmiennoprzecinkowe * temp = first;
while (temp && temp->liczby != zadana_wartosc) temp = temp->next;
return temp;
}
void MAIN_01()
{
cout << "\n\n" << setw(45) << "Zadanie 1";
double nowa_liczba;
int n;
char i;
Liczby_zmiennoprzecinkowe zmienna;
do{
cout << "\n1. Dodanie elementu do listy \n2. Wypisanie listy \n3. Usuniecie z listy \n4. Zliczanie elementow listy \n5. Wyszukiwanie na liscie zadanej wartosci \n6. Wyjscie do menu \n\nPodaj opcje: ";
cin >> i;
switch (i){
case '1':
{
cout << "\nPodaj ilosc liczb: ";
cin >> n;
for (int i = 0; i < n; i++){
cout << "Podaj nowa liczbe: ";
cin >> nowa_liczba;
zmienna.add_to_list(nowa_liczba);
}
}break;
case '2':
{
cout << "--------------------------------------------------------------------------------";
zmienna.print_list();
}break;
case '3':
{
char h;
cout << "\nPodaj w jaki sposob chcesz usunac liczbe z listy \n1. Przez pozycje liczby \n2. Przez wartosc liczby \n Podaj opcje: ";
cin >> h;
if (h == '1')
{
int pozycja_liczby;
cout << "\nPodaj pozycje liczby ktora chcesz usunac: ";
cin >> pozycja_liczby;
zmienna.delete_from_list_pozycja(pozycja_liczby);
}
else
{
double wartosc_liczby;
cout << "\nPodaj wartosc liczby ktora chcesz usunac: ";
cin >> wartosc_liczby;
zmienna.delete_from_list_wartosc(wartosc_liczby);
}
}break;
case '4':
{
zmienna.count();
}break;
case '5':
{
Liczby_zmiennoprzecinkowe pozycja;
Liczby_zmiennoprzecinkowe * wskaznik;
double zadana_wartosc;
cout << "\nPodaj szukana wartosc: ";
cin >> zadana_wartosc;
wskaznik = pozycja.find(zadana_wartosc);
cout << "\nSzukana wartosc znajduje sie na pozycji: " << wskaznik << "\n";
}break;
case '6':
break;
default:
{
"\nPodano bledna opcje. Prosze sprobowac ponownie.";
}break;
}
} while (i != '6');
}