Ciao, ho dato un'occhiata al codice e ho notato che comunque nel tuo confronto per ordinare( nella funzione ordina) fai scorrere solo un puntatore e confronti tutti i numeri sempre con il primo della lista!
codice:
if(L->val>temp->val)
nella funzione ordina L non viene mai modificato, quindi confronti tutti i valori della lista con il primo elemento!
Comunque ho provato ad abbozzare un altro metodo che assomiglia ad un selection sort adattato ad una lista!
Posto il codice qua sotto...se ci sono problemi chiedi pure!
Ciao
codice:
# include <stdlib.h>
# include <stdio.h>
typedef struct nodo *lista;
typedef struct nodo {
int val;
lista next;
}nodo;
lista leggiLista (void);
lista ordina(lista L);
void stampaLista (lista L);
nodo* find_min ( nodo *p );
int main (void)
{
lista lis;
lis=leggiLista();
stampaLista(lis);
lis=ordina(lis);
stampaLista(lis);
return 0;
}
lista leggiLista (void)
{
lista N,L=NULL;
int val;
while (1)
{
printf("inserisci valore: ");
scanf("%d",&val);
if (val==0) break;
N=(nodo *)malloc (sizeof(nodo));
if(!N)
{
printf("non c'è spazio");
break;
}
N->val=val;
N->next=L;
L=N;
}
return L;
}
lista ordina (lista L)
{
int valore;
nodo *temp;
nodo *p1, *p2;
p1 = L;
while(p1!=NULL)
{
temp = find_min ( p1 );
if ( p1->val != temp->val ) {
valore = p1->val;
p1->val = temp->val;
temp->val = valore;
}
p1 = p1->next;
}
return L;
}
nodo* find_min ( nodo *p )
{
nodo* tmp_min;
nodo* p_index;
int min = p->val;
p_index = p->next;
tmp_min = p;
while ( p_index != NULL ) {
if ( p_index->val < min ) {
tmp_min = p_index;
min = p_index->val;
}
p_index = p_index->next;
}
return tmp_min;
}
void stampaLista (lista L)
{
while(L!=NULL)
{
printf("\n%d\n",L->val);
L=L->next;
}
printf("----------------------------");
}