sortowanie listy w C

0

Witajcie,
Męcze się z przerobieniem dodawania elementów do listy tak żeby od razu sortowały się w zależności od przechowywanej wartości od najmniejszej do największej. Nie potrafie zlokalizowac blędu w moim kodzie. Program po prostu przestaje działać z informacja 'run failed'.
Prosze o pomoc

    if (*lista == NULL) {
        (*lista)->u.wartosc = atof(wartosc);
        strcpy((*lista)->kontrakt, tekst);
        (*lista)->nastepny = NULL;
        (*lista)->poprzedni = NULL;

    } else {
        value=atof(wartosc);
        while (suwak!= NULL && n==1) {
            if(suwak->nastepny==NULL)
            {
                if((suwak->u.wartosc)<value){
                        suwak->nastepny = malloc(sizeof (kontr));
                        suwak->nastepny->poprzedni = suwak;
                        suwak->nastepny->nastepny = NULL;
                        suwak->nastepny->u.wartosc = value;
                        strcpy(suwak->nastepny->kontrakt, tekst);
                } else {
                        suwak->nastepny = malloc(sizeof (kontr));
                        suwak->nastepny->poprzedni = suwak;
                        suwak->nastepny->nastepny = NULL;
                        suwak->nastepny->u.wartosc = suwak->u.wartosc;
                        strcpy(suwak->nastepny->kontrakt, suwak->kontrakt);
                        suwak->u.wartosc = value;
                        strcpy(suwak->nastepny->kontrakt, tekst);
                }
            } else {
                if(suwak->u.wartosc>value)
                {
                    pomoc=suwak->nastepny;
                    suwak->nastepny=NULL;
                    suwak->nastepny = malloc(sizeof (kontr));
                    suwak->nastepny->poprzedni = suwak;
                    suwak->nastepny->nastepny = pomoc;
                    pomoc->poprzedni=suwak->nastepny;
                    suwak->nastepny->u.wartosc = suwak->u.wartosc;
                    strcpy(suwak->nastepny->kontrakt, suwak->kontrakt);
                    suwak->u.wartosc = value;
                    strcpy(suwak->nastepny->kontrakt, tekst);
                    n=0;
                } else {
                    suwak=suwak->nastepny;
                }
            }
            
        }
    }
 
0

Tak nakręciłeś że nie da rady w tym się połapać, a wystarczy tyle:

   value=atof(wartosc);
   for(suwak=lista;(suwak)&&(suwak->u.wartosc<=value);poprzedni=suwak,suwak=suwak->nastepny){}
   suwak=(kontr*)malloc(sizeof(kontr));
   suwak->u.wartosc=value;
   suwak->poprzedni=poprzedni;
   strcpy(suwak->kontrakt,tekst);
   if(poprzedni)
     {
      suwak->nastepny=poprzedni->nastepny;
      poprzedni->nastepny=suwak;
     }
   else
     {
      suwak->nastepny=lista;
      lista=suwak;
     }
   if(suwak->nastepny) suwak->nastepny->poprzedni=suwak; // else ostatni=suwak;
0

trochę za bardzo skomplikowałeś sobie życie:

// zgaduje, ze lista jest wskaznikiem na wskaznik na 1 element?
kontr *suwak = *lista;
kontr *przed = NULL;

// przewijamy suwak az bedzie wskazywal na element za nowym
while (suwak) {
	if (suwak->wartosc > value) break;
	przed = suwak;
	suwak = suwak->nastepny;
}

kontr *nowy = (kontr*)malloc(sizeof(kontr));
nowy->wartosc = value;
nowy->nastepny = suwak;
strcpy(nowy->kontrakt, tekst);

// sa 4 mozliwosci:
// a) lista jest pusta
if (*lista == NULL) {
	nowy->poprzedni = NULL;
	*lista = nowy;
}
// b) nowy element dodajemy do konca listy
else if (suwak == NULL) {
	przed->nastepny = nowy;
	nowy->poprzedni = = przed;
}
// c) suwak jest poczatkiem listy
else if (suwak->poprzedni == NULL) {
	nowy->poprzedni = NULL;
	suwak->poprzedni = nowy;
	*lista = nowy;
}
// d) suwak ma poprzednika
else {
	przed->nastepny = nowy;
	nowy->poprzedni = przed;
	suwak->poprzedni = nowy;
}

pisane bez sprawdzania, ale powinno działać. następnym razem miło by było, jak być również dodał kod struktury...

0

Dziękuje bardzo ! :)

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