PDA

Visualizza la versione completa : [C] ordinare liste


clock2
15-03-2010, 19:30
Non funziona la funzione ordina! qualcuno pu aiutarmi?



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

int main (void)
{
lista lis;
lis=leggiLista();
stampaLista(lis);
lis=ordina(lis);
stampaLista(lis);
system("PAUSE");
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;
temp=L->next;
while(temp!=NULL)
{
if(L->val>temp->val)
{
valore=L->val;
L->val=temp->val;
temp->val=valore;
}
temp=temp->next;
}
return L;
}



void stampaLista (lista L)
{
while(L!=NULL)
{
printf("\n%d\n",L->val);
L=L->next;
}
printf("----------------------------");
}

MrX87
16-03-2010, 01:01
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!

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



# 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("----------------------------");
}

clock2
16-03-2010, 10:49
grazie mille! avevi ragione, confrontavo sempre con il primo.. :dh:
grazie ancora!
ciao :ciauz:

Loading