Il testo dell'esercizio è questo:
Scrivere la funzione C che realizza l'algoritmo di fusione su una lista collegata con puntatori. La funzione riceve in ingresso due doppi puntatori ptrptr1 e ptrptr2,dove ptrptr1 punta alla prima metà della lista e ptrptr2 alla seconda metà della lista. Le due semi-liste puntate da ptrptr1 e ptrptr2 sono
ordinate. La lista risultato ordinata deve essere puntata da ptrptr1 e deve essere generata spostando gli elementi delle due semi-liste senza utilizzare nuove allocazioni/deallocazioni della memoria (NOTA: la lista puntata da ptrptr2 è una sottolista di quella puntata da ptrptr1).
Questo è il mio programma:
#include <stdio.h>
#include <stdlib.h>
struct list {
float value;
struct list *next_ptr;
};
void init( struct list ** ptrptr );
void main(void)
{
int value;
struct list *ptr;
int i;
int N;// numero elementi lista
init(&ptr);
printf("quanti elementi contiene la lista(numero pari):\n");
scanf("%d",&N);
for (i=1;i<=N;i++)
{
printf( "inserisci elemento (la lista deve essere ordinata in due parti): \n" );
scanf( "%d",ptr->value );
printf("elemento\n");
printf("%d",ptr->value);
ptr=ptr->next_ptr;
}
void merge(struct list *ptrptr1, struct list *ptrptr2)
{
while (ptr->value < ptr->next_ptr->value)// ptrptr1 punta i valori della lista fino a quando non si arriva a metà, cioè l'elemento successivo non è ordinato
{
ptrptr1->value=ptr->value;
ptr=ptr->next_ptr;
}
ptrptr2->value=ptr->next_ptr->value;
while(ptrptr1!=NULL && ptrptr2!=NULL)
{
if(ptrptr1->value < ptrptr2->value)
ptrptr1=(ptrptr1->next_ptr);
else
{
ptrptr1->next_ptr=ptrptr2;
ptrptr2=ptrptr2->next_ptr;
}
printf("%d lista ordinata\n",ptrptr1);
}
}
return;
}
void init( struct list ** ptrptr )
/* inizializzazione
*/
{
*ptrptr = NULL;
}