Originariamente inviato da LeleFT
...
Una buona base di partenza potrebbe essere l'algoritmo
MergeSort, in particolare la procedura chiamata "merge".
...
Non mi pare una buona idea essendo la lista già ordinata.
Io farei cosi:
codice:
typedef struct tagLista
{
int valore;
struct tagLista* next;
} Lista;
Lista* NewNode(int val)
{
Lista *n;
n = (Lista *)malloc(sizeof(Lista));
if( n == NULL )
return NULL;
n->valore = val;
n->next = NULL;
return n;
}
Lista* Append(Lista* first, int val)
{
Lista *n = first, *nuovo;
// catena vuota
if ( first == NULL )
return NewNode(val);
n = first;
while( n->next != NULL )
{
n = n->next;
}
nuovo = NewNode(val);
n->next = nuovo;
return first;
}
void Free(Lista* first)
{
Lista *n1 = first, *n2;
while ( n1 != NULL )
{
n2 = n1->next;
free(n1);
n1 = n2;
}
}
Lista* ordina(Lista* L1, Lista* L2)
{
Lista *n;
Lista *tmp1, *tmp2;
Lista *tmpPrev;
if ( L1 == NULL )
return L2;
if ( L2 == NULL )
return NULL;
tmp1 = L1;
while ( tmp1 != NULL )
{
tmp2 = L2;
tmpPrev = NULL;
while ( tmp2 != NULL )
{
if ( tmp2->valore > tmp1->valore )
{
n = (Lista *)malloc(sizeof(Lista));
if ( !n )
{
printf("Memoria insufficiente");
return L2;
}
n->valore = tmp1->valore;
n->next = tmp2;
if ( tmpPrev )
tmpPrev->next = n;
break;
}
else if ( tmp2->next == NULL )
{
n = (Lista *)malloc(sizeof(Lista));
if ( !n )
{
printf("Memoria insufficiente");
return L2;
}
n->valore = tmp1->valore;
n->next = NULL;
tmp2->next = n;
break;
}
tmpPrev = tmp2;
tmp2 = tmp2->next;
}
tmp1 = tmp1->next;
}
return L2;
}
void Print(Lista *first)
{
Lista *n = first;
while( n != NULL )
{
printf("%d\n", n->valore);
n = n->next;
}
}
int main()
{
Lista* pLista = NULL;
Lista* pLstTmp = NULL;
pLista = Append(pLista, 1);
pLista = Append(pLista, 3);
pLista = Append(pLista, 5);
pLista = Append(pLista, 8);
pLista = Append(pLista, 13);
pLstTmp = Append(pLstTmp, 6);
pLstTmp = Append(pLstTmp, 4);
pLstTmp = Append(pLstTmp, 2);
pLstTmp = Append(pLstTmp, 21);
pLista = ordina(pLstTmp, pLista);
printf("\n");
Print(pLista);
printf("\n");
Free(pLista);
Free(pLstTmp);
return 0;
}