Hej Generalnie Twój tok myślenia według mnie wygląda w miarę poprawnie, jednak jest kilka rzeczy, które wypadałoby poprawić. Zauważ, że p_blizej i p_dalej mają startową wartość NULL - czyli gdy wykonasz na takim wskaźniku dereferencje np. p_blizej->x program najprawdopodobniej rzuci segfaulta i zakończy wykonanie crashem. Poza tym nie potrzebujesz przepisywać pól tej listy - tj. x, y - tylko adresy kolejnych elementów.
Więc Twój algorytm, w podobnej formie do tego, co masz teraz mógłby działać następująco (oczywiście chodzi o tą część która dopisuje do p_blizej/p_dalej):
if (p_blizej == NULL) // Przypadek gdy ustawiamy pierwszy element w naszej liscie
{
p_blizej = pom;
p_blizej_start = pom; // Po rozdzieleniu, to bedzie pierwszy element nowej listy
}
else // Przypadek gdy dopisujemy kolejne elementy
{
p_blizej->nast = pom; // Dopisz jako kolejny element listy aktualny punkt
p_blizej = p_blizej->nast; // Przesun sie do tego punktu
}
Warto tez zadbac, zeby po dopisaniu ustawic p_blizej->nast i p_dalej->nast jako NULL (np. po pętli while) - żeby były to dwie niezależne listy - w innym przypadku moglibyśmy mieć sytuację, gdzie ostatni element z p_blizej wskazuje na jakiś element w p_dalej lub odwrotnie.
Poza tym, po podzieleniu list chcielibyśmy zapewne mieć początki nowych list - Twoje zmienne p_blizej/p_dalej będą zawierały wskaźnik na ostatni element w liście - dlatego można np. dodać zmienne p_blizej_start/p_dalej_start, które będą przechowywały początki list.
Warto jeszcze zauważyć, że else if jest niepotrzebny - dla warunku (odleglosc <= X), else oznacza to, co sprawdzasz drugi raz. Więc można się tego pozbyć np.
if(odleglosc<=X)
{
// tutaj czesc od wpisywania na p_blizej
}
else // Ten else oznacza, ze odleglosc jest wieksza
{
// tutaj czesc od wpisywania na p_dalej
}
W razie pytań pisz - pozdrawiam!