Questo è un algoritmo di ordinamento che mi sono inventato lì per lì...ci sono anche quelli canonici...magari con la ricorsione, ma non so se ti interessavano...
Codice:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct EL{
int car;
struct EL *prox;
};
typedef struct EL elemlista;
typedef elemlista *lista;
void crea(lista *,int);
void stampalista(lista);
void ordinalista(lista *);
lista spostaInTesta(lista pprimo, lista curr, lista prec);
main()
{
char invio;
int a,i=0;
lista primo=NULL;
//clrscr();
while(a!=0)
{
scanf("%d",&a);
scanf("%c",&invio);
crea(&primo,a);
i=i+1;
}
stampalista(primo);
ordinalista(&primo);
stampalista(primo);
invio = getch();
return 0;
}
void crea(lista *pprimo,int a)
{
lista curr,nuovo,prec;
nuovo = (lista)malloc(sizeof(elemlista));
if ((*pprimo)==NULL) *pprimo=nuovo;
else{
curr=*pprimo;
do
{
prec=curr;
curr=curr->prox;
} while(curr!=NULL);
prec->prox=nuovo;
}
nuovo->car=a;
nuovo->prox=NULL;
}
void stampalista(lista pprimo)
{
lista curr;
curr=pprimo;
while(curr!=NULL)
{
printf("%d ",curr->car);
curr=curr->prox;
}
}
lista spostaInTesta(lista pprimo, lista curr, lista prec)
{
prec->prox = curr->prox;
curr->prox = pprimo;
return curr;
}
void ordinalista(lista *pprimo)
{
lista curr = *pprimo;
lista prec = *pprimo;
int cont = 0, start = 1, tot = 0, scambi = 0;
while(1)
{
++tot;
if(!curr->prox)
{
curr = *pprimo;
prec = *pprimo;
scambi += cont;
if(!cont) break;
cont = 0;
}
else
{
prec = curr;
curr = curr->prox;
}
if(!curr->prox) continue;
if(curr->prox->car < (*pprimo)->car)
{
++cont;
*pprimo = spostaInTesta(*pprimo, curr->prox, curr);
}
else if(curr->car > curr->prox->car)
{
++cont;
prec->prox = curr->prox;
spostaInTesta(curr, curr->prox, curr);
curr = prec->prox;
}
}
}
Usa il tag {code}{/code} (con le quadre al posto delle grafe) per mettere il codice almeno ti mantiene l'indentazione...