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;
0

Ok, dziękuję bardzo.
Pytanie znów z innej beczki. Aby usunąć element listy znajdujący się w środku ( tak jak w poprzednim przykładzie - element niebieski ) muszę znać jego poprzednika. Można to jakoś obejść?

0

Tak, lista dwukierunkowa.

0

Problem w tym, że muszę korzystać z listy jednokierunkowej :(

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