Lista jednokierunkowa i jej sortowanie (C)

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);
 
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;
  }
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

0

Masz racje, wydaję ci się.

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...

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