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;
}