View Single Post
Old 08-09-2002, 12:48   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
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...
cionci è offline   Rispondi citando il messaggio o parte di esso