Rozbijanie i sortowanie list jednokierunkowych

0

Witam. Mam utworzoną i wypełnioną listę.
Wygląda ona orientacyjnie tak:
user image
Struktura:

struct Test{
    char data[11];
    unsigned int wynik;
    struct Test *next;
}

Należy ją rozbić względem daty ( oznaczyłem kolorami, aby było bardziej widoczne ) i następnie posortować. Ma to wyglądać mniej więcej tak:
user image

  1. Jak się za to zabrać? Mam utworzoną tablicę dwuwymiarową ze wszystkimi datami, które występują ( w danym przykładzie byłyby to 3 daty ).
  2. Myślałem może, aby stworzyć tablicę jednowymiarową typu
    struct Test

    , aby połączyć daty z drugiego obrazka.

  3. Czy dałoby się posortować według daty i potem rosnąco nie rozbijając na kilka list? Wtedy miałbym na początku daty czerwone posortowane rosnąco, następnie zielone posortowane rosnąco i na końcu niebieskie posortowane rosnąco?
1

Najpierw posortować wg (data+numer) po czym rozbić.
Najlepsze dla list to mergesort.

0

Jak na razie postanowiłem pokombinować i mam coś takiego:

pre=head; //poprzedni przed podmienianym
for(i=0; i<ile_dat; i++){ //ile_dat = ilość wszystkich występujących dat
    for(tmp=head; tmp; tmp=tmp->next){
        if(strcmp(tmp->data, daty[i])==0) //daty[i] = tablica 2d z wszystkimi datami
            if(tmp!=head){
                pre->next=tmp->next;
                tmp->next=head; //przenosimy na początek
                head=tmp; //staje się początkiem
            }
        pre=pre->next;
    }
} 

Jednak wydaję mi się, że to się zapętli, gdyż jeżeli przeniesiemy tmp na początek to tmp->next również się zmieni.
Da się to jakoś obejść?

0

No dobra, to ma sens, ale jeżeli mam dwa warunki?
Żebym miał sortować tylko po wynik to byłoby prosto. Tutaj muszę jeszcze posortować po dacie.

0
int compare(struct Test *a,struct Test *b)
  {
   int ret=strcmp(a->data,b->data);
   return ret?ret:((a->wynik>b->wynik)-(a->wynik<b->wynik));
  }
0

Mam jeszcze głupie, banalne pytanie.
Załóżmy, że wskaźnik o nazwie tmp wskazuje na jakąś listę. Tworzę nowy wskaźnik o nazwie tmp2 i chciałbym przekopiować listę wskazywaną przez tmp do tmp2. Jak to zapisać?

*tmp=*tmp2 
0

Odpowiedź oczywiście zależy od tego co rozumiesz pod "jakąś listę", oraz od tego czy musi to być pełna kopia czy wystarczy płytka.

0

user image

Załóżmy, że chcę "skopiować" cały ( wszystkie pola i wartości ) element niebieski, ten na który wskazuje wskaźnik tmp.

1
struct Jakas_Struktura_Opisujaca_Element_Listy x=*tmp;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0