Dzień dobry,
jestem w trakcie tworzenia bazy danych opartej o zrównoważone drzewo BST, które w każdym z węźle przechowuje wskaźnik do listy wskaźnikowej przechowującej zmiany wprowadzone w węźle.
Jeżeli użytkownik wprowadza jakieś zmiany w węźle drzewa to tworzona jest lista tych zmian, a jeżeli nie to wskaźnik jest równy zero.
Moje pytanie jest następujące: jaki jest najbardziej efektywny algorytm przechodzenia listy wskaźnikowej? Mający Waszym zdaniem najmniejszą złożoność etc.
Mam tutaj pomysł na trzy:
- Iteracje do momentu napotkania elementu, który nie zawiera wskaźnika do następnika:
Ostatni element musi być przetwarzany osobno.
Lista *temp = this->lista;
while(temp->nastepny){
// tutaj przetwarzamy aktualny element.
temp = temp->nastepny;
}
if(temp->nastepny == 0){
// tutaj przetwarzamy ostatni element.
}
- Podobna metoda z tym, że w pętli nieskończonej, która kończy swoje działanie w momencie napotkania zerowego wskaźnika na następnik:
Lista *temp = this->lista;
while(temp){
if(temp->nastepny){
// tutaj przetwarzamy aktualny element.
temp = temp->nastepny;
}
else{
// tutaj przetwarzamy ostatni element.
break;
}
}
- Funkcja rekurencyjna, podobna do przechodzenia drzewa BST.
void przejdzListe(Lista *temp){
if(temp){
// tutaj przetwarzamy aktualny element.
przejdzListe(temp->nastepny);
}
}
Wszystko bardzo ładnie mi działa, tylko chciałbym teraz zoptymalizować swój kod.
Pozdrawiam serdecznie
Grzegorz.