Lista jednokierunkowa i jej sortowanie (C)

Odpowiedz Nowy wątek
2014-12-18 19:44
0

Witam, mam mały problem, ponieważ potrzebuję posortować listę jednokierunkową przy pomocy dwóch funkcji( znajdującej minimum na liście, i umieszczającej znaleziony element na początek listy). Przy wywołaniu programu powiedzmy: 2 3 1. Funkcja sort zaczyna działać ładnie w 2 pierwszy krokach a przy 3 kroku znaleziony element nagle to 1 3 i nie mogę zrozumieć skąd pojawia się nagle ta 1. Czy ktoś może pomóc ?

KOD

element *przestaw2(element *l, element *s)
{
    element *h = l;
    if (l == s) return s;
    while (l->nast != s && l->nast!=0)
    {
        l = l->nast;
    }
    l->nast = l->nast->nast;
    s->nast = h;
    return s;
}
 
element *najmniejszy(element *l)
{
    element *h = l, *a, *i=l;
    int dane;
    dane = i->dane;
    a = i;
    while (i)
    if (i->dane<dane)
    {
        a = i;
        dane = i->dane;
    }
    else
    {
        i = i->nast;
    }
    return a;
}
 
element *sortuj(element *l)
{
    element *nowy=l, *h = l, *a = l, *s;
    while (a)
    {
        printf("Co pokazuje a\n");
        drukl_2(a);
        printf("\n||||||||||||||\n");
        s = najmniejszy(a);
        printf("znaleziony");
        printf("\n----------\n");
        drukl_2(s);
        getchar();
        getchar();
        printf("\n----------\n");
        l = przestaw2(l, s);
        printf("lista");
        printf("\n----------\n");
        drukl_2(l);
        getchar();
        getchar();
        printf("\n----------\n");
        a = a->nast;
 
    }
    return l;
}
 
int main()
    {
        element *p, *s;
        test = NULL;
        p = NULL;
        printf("Hello\n");
        scanf("%d", &x);
        while (x != 0)
        {
            p = dodk(x, p);
            scanf("%d", &x);
        }
        //p=przestaw(p,s);
        printf("-------\n");
        drukl_2(p);
        s = najmniejszy(p);
        printf("\nNajmniejszy: ");
        drukl_2(s);
        p = przestaw2(p, s);
        printf("\n po przestawieniu:\n");
        drukl_2(p);
        printf("--- A teraz po sortowaniu ---\n");
        //p = usun_parzyste2(p);
        p=sortuj(p);
        drukl_2(p);
 

Pozostało 580 znaków

2014-12-18 21:06
0

Zacznij od przepisanie z użyciem nazw zmiennych takich aby tobie cokolwiek mówiły.
Chodzi o to że tak zagmatwałeś że nić już w tym kodzie nie rozumiesz, przykład:

element *najmniejszy(element *el)
  {
   element *min=el;
   for(;el;el=el->nast) if(min->dane>el->dane) min=el;
   return min;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-18 21:37
0

No ale funkcja przestaw2 i najmniejszy działają poprawnie problem jest z funkcją sortującą która ma wykorzystać te dwie funkcje i tam nie wiem dlaczego coś jest nie tak?

//edit ta popadłem w zachwyt jak dobrze o dziwo zrobiło ;d

edytowany 3x, ostatnio: lupek123, 2014-12-18 21:55

Pozostało 580 znaków

2014-12-18 21:54
0

Masz racje, wydaję ci się.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Może jakaś mała wskazówka jak to inaczej zrobić wykorzystując funkcje do znajdywania min i przestawiania wskazanego elementu ? - lupek123 2014-12-18 22:11
Przecież dałem wskazówkę: - "Zacznij od przepisanie z użyciem nazw zmiennych takich aby tobie cokolwiek mówiły." - którego słowa nie rozumiesz? - _13th_Dragon 2014-12-18 22:28

Pozostało 580 znaków

2014-12-18 23:00
0
 element *sortuj(element *l)
{
    element *lista_sort=0,*min;
    while (l)
    {
        min = najmniejszy(l);
        l = przestaw2(l, min);
        lista_sort = dodk(l->dane, lista_sort);
        l = l->nast;
    }
    return lista_sort;
}

Takie coś ostatecznie stworzyłem, ale nie jestem do końca z tego dumny...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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