Ciao, il tuo programma è molto disordinato quindi coordinare tutto, in quella maniera, è difficile e controproduttivo. Io ti consiglio di evitare la definizione di variabili globali (mi riferisco ad sp).
Inoltre il tipo booleano esiste, in stdbool.h.

Ho semplicemente spostato le parti del tuo programma nei diversi file. Un modo può essere questo:

File global.h - ci metti tutto quello che deve essere visibile globalmente
Codice PHP:
#ifndef GLOBAL_H
#define GLOBAL_H

#define COST_NUM_CHAR 30
#define COST_ELEM_MAX 20

#define COST_NUM_CHAR 30
#define COST_ELEM_MAX 20

typedef char string[COST_NUM_CHAR];  //definizione di un nuovo tipo di dato chiamato "string"
struct StringPool sp[COST_ELEM_MAX];  //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX" di tipo "StringPool" 

#endif 

File stringpool.h
Codice PHP:
#ifndef STRINGPOOL_H
#define STRINGPOOL_H

#include <stdbool.h>
#include "global.h"

struct StringPool
{
    
int identifier;
    
string str;
};

bool add (int identifierstring str);

#endif 
File stringpool.c
Codice PHP:
#include "stringpool.h"

bool add (int identifierstring str)
{
    
int spazio_vettore = -1//Indice di controllo presenza spazio libero
    
int i//Indice per il ciclo for di scansione
    /*Se identifier hanno dati non corretti ritorna false*/
    
if((identifier 1) || (strcmp(str,"") != 0))
    {
       return 
0;     
    }
    
/*Controlla da 0 a minore del numero massimo di elementi
    che l'identifier non è dupplicato e che ci sia almeno uno spazio vuoto
    per l'inserimento*/
    
for(i=0;i<COST_ELEM_MAX;i++)
    {
     
//se l'indice è dupplicato ritorna false
        
if(identifier == sp[i].identifier)    
        {
           return 
0;              
        }             
     
//in caso di presenza di spazio vuoto, segna la prima posizione libera
        
if(sp[i].identifier == -1)
        {
           
spazio_vettore i;                    
        }       
    }
    
    
//se tutto è andato a buon fine alloca i dati nella struttura
    
if(spazio_vettore > -1)
    {
        
sp[spazio_vettore].identifier identifier;
        return 
1;                
    }
    else
    {
        return 
0;    
    } 

File main.c
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdbool.h>

#include "global.h"
#include "stringpool.h"

void stampa(bool RITORNO_ADD);   //funzione per avvisare l'utente se l'inserimento dei dati è avvenuto con successo  
struct StringPool acquisizione(); //funzione per far inserire all'utente i dati

int main()
{
    
bool NEW_INPUT=true;
    
bool RITORNO_ADD;                //definizione variabili
    
struct StringPool TEMP_DATA;
    
int I=0;
    
    for(
I=0;I<COST_ELEM_MAX;I++)
    {
       *
sp[I].str='\0';               //ciclo utilizzato per inizializzare il vettore "sp" con i seguenti valori:
       
sp[I].identifier=-1;           //il campo "identifier" viene inizializzato con il valore "-1"
    
}                                 //il campo "str" viene inizializzato con la stringa vuota
     
    
    
for(I=0;I<COST_ELEM_MAX && NEW_INPUT==true;I++)
    {
       do{                     
           
/*questo ciclo do-while viene eseguito per far inserire all'utente i dati.
           ciclerà fino a quando i dati immessi dall'utente non saranno inseriti nel vettore (cioè se si verifica
           la seguente condizione: RITORNO_ADD==false) e se l'utente vorrà inserire nuovi dati 
           (ciè se si verifica la seguente condizione:NEW_INPUT==true)*/
                               
           
TEMP_DATA=acquisizione();   //viene chiamata la funzione "acquisizione" che ritorerà un dato di tipo 
                                       //StringPool che verrà salvato nella variabile "TEMP_DATA" 
         
           //QUI SI CHIAMA LA FUNZIONE ADD CHE RITORNA UN VALORE bool ALLA VARIABILE RITORNO_ADD E SI INVIA
           //COME PARAMETRO LA VARIABILE TEMP_DATA
           
add(TEMP_DATA.identifier,TEMP_DATA.str);//Richiamo la funzione add della libreria stringpool.c
         
           
stampa(RITORNO_ADD);        //viene chiamata la funzione "stampa" che manderà a schermo un diverso
                                       //messaggio in base all'esito dell'inserimento  
         
           
printf("\n Si vuole inserire un nuovo dato? (0=NO, 1=SI)");
           do{ 
              
scanf("%d",&NEW_INPUT);                                 //ciclo che chiede all'utente se si vuole
             
}while(NEW_INPUT<|| NEW_INPUT>1);                      //inserire un nuovo dato.Il ciclo verrà 
                                                                      //eseguito fino a quando non si inserirà
                                                                      // o 1 o 0
                                                                      
         
}while((NEW_INPUT==true) && (RITORNO_ADD==false));
    }                        
    
    
system("pause");
    
}
    
struct StringPool acquisizione()
{
       
struct StringPool TEMP_DATA;
       
       do{
            
printf("\nInserire l'ID");                     //ciclo per l'inserimento dell'ID.Ciclerà
            
scanf("%d",&TEMP_DATA.identifier);             //fino a quando non verrà immesso un numero positivo
         
}while(TEMP_DATA.identifier<0);
       
       do{          
            
printf("\nInserire la stringa");               //ciclo per l'inserimento della stringa.Ciclerà
            
scanf("%s",TEMP_DATA.str);                     //fino a quando non verrà immessa una stringa 
         
}while(*TEMP_DATA.str=='\0');                     //diversa dalla stringa vuota
         
      
return(TEMP_DATA);   
}       

void stampa(bool RITORNO_ADD)
{
   if(
RITORNO_ADD==1)                
      
printf("\nL'inserimento dei dati è avvenuto con successo");
   
   else
      
printf("\nErrore: inserimento non avvenuto"); 
      
      
/*in base all'avvenuto inserimento dei dati nel vettore, verrà stampato a video un messaggio diverso*/
                        
   
system("pause");


Compila il tutto con:
codice:
>> gcc stringpool.c -c
>> gcc main.c -c
>> gcc main.o stringpool.o -o main