Mam problem ze zrealizowaniem zadanego polecenia. Mój program ma wczytywać z pliku do listy jednokierunkowej współrzędne par punktów, będących punktami początkowymi i końcowymi odcinków. I z tą częścią sobie poradziłam. Jednak teraz dysponuję listą jednokierunkową, zawierającą elementy o polach „x1”, „y1”, „x2”, „y2” oraz wskaźnik na element następny i muszę napisać funkcję, która dokonałaby posortowania elementów listy względem współrzędnej x końca odcinka (czyli pola “x2”) w porządku rosnącym, jednak niestety nie bardzo wiem jak to zrobić. Próbowałam coś wymyślić, ale chyba jednak nie doszłam do niczego sensownego. Bardzo proszę o pomoc. Na innym forum znalazłam taki schemat postępowania.
Rozumiem co należy robić krok po kroku, ale nie potrafię tego zapisać. Przy próbach realizacji w końcu gubię się w tym co piszę. Patrząc na punkt 6 rozumiem, że to ma działać rekurencyjnie, tak? Bardzo proszę o pomoc, potrzebuję tego na jutro, a już nie bardzo wiem jak to rozpisać. Może istnieje jakiś inny, dość przystępny sposób wykonania tego sortowania?
Najpierw sobie dopisz do swojej struktury danych (listy jednokierunkowej) metodę zamiany elementów na liście.
Jak będziesz miał taką metodę to pozostaje Ci tylko zaimplementować algorytm sortowania, który używa swapowania, pamiętając, że wartością jest x2 z elementu listy.
Powiem tak, na zajęciach mieliśmy podstawy podstaw. Teraz dostajemy do zrealizowania programy, które nijak mają się do tego, co robiliśmy wcześniej. Dlatego szukam pomocy, bo sama nie jestem w stanie zastosować pewnych algorytmów.
No to teraz napisz funkcję swap_elements(SLista element1, SLista element2) po prostu zamieniając pole next w obu listach pamiętając o szczególnych przypadkach (pierwszym i ostatnim elemencie).
Potem już tylko implementujesz sortowanie używając funkcji swap_elements do zamiany miejsc.
czyli ta funkcja swap_elements ma zamieniać ze sobą jedynie pola next elementu1 i elementu2? przepraszam, jeśli źle to rozumiem, ale nigdy nie używałam funkcji swap
Poczytaj sobie o bubble sort, przy liście jednokierunkowej powinno to być łatwe w realizacji, tak jak już koledzy pisali potrzebujesz funkcji która zamienia kolejnością elementy na liście.
Najprościej chyba będzie zrobić sortowanie przez wybór. Najpierw tworzysz sobie pustą listę posortowaną, potem wyszukujesz największy element, usuwasz z początkowej listy i dodajesz na początek posortowanej, powtarzasz dopóki początkowa lista nie będzie pusta.
Przykład:
void sortuj(SLista*& l)
{
SLista* n = 0;
while(l)
{
SLista *max = l, *pmax = 0;
for(SLista *p = l, *i = l->next; i; p = i, i = i->next)
if(i->x2 >= max->x2)
max = i, pmax = p;
if(pmax)
pmax->next = max->next;
else
l = max->next;
max->next = n;
n = max;
}
l = n;
}
Jeśli rzeczywiście dostajecie zadania znacznie przekraczające to czego was uczyli to lepiej żebyś nauczyła się programować we własnym zakresie. Polecam:
Mogłabym prosić o pomoc z zaimplementowaniem algorytmu sortowania? Nie mogę się w tym połapać, tzn jeśli chodzi o sortowanie bąbelkowe, to jak to jest, na samym początku muszę zliczyć ilość elementów listy do posortowania i potem zastosować pętlę for? Czy jakoś inaczej to trzeba zrobić? Staram się to zrozumieć i ogólnie ćwiczę sobie pisanie różnych programów w oparciu o różne materiały pomocnicze, ale ten muszę zrobić akurat na jutro, a nigdy nie stosowałam tego typu algorytmów.
Olej powyższe porady poza tą udzieloną przez @Rolek0. Znajdujesz max i przenosisz do pustej listy (łatwy, indukcyjny dowód, że działa).
PS
struct SLista
{
int x1;
int y1;
int x2;
int y2;
SLista *next;
};
Co znaczą u ciebie inty, bo mi to wygląda na jakieś odcinki/wektory. Musisz w ogóle zacząć od zdefiniowania porządku to jest aby posortować jakiś zbiór musisz wiedzieć kiedy element jest mniejszy od innego.
Ale to jest konieczne? Moim zadaniem jest posortować te pary punktów (tzn. odcinki) względem współrzędnej x-owej końca odcinka (czyli w moim przypadku x2).
Ach, nie zwróciłem uwagi w pierwszym poście, że masz zdefiniowany porządek (własnie jako x2). No to w sumie pozostaje użyć kodu który podał ci @Rolek0.