Ciao alla fine avendo poco tempo a disposizione e non avendo capito bene le liste, ho deciso di cambiare metodo!

adesso vi posto qui sotto come ho fatto, e vorrei un'aiuto per sistemare meglio tutto il codice e per correggerlo nei punti in cui ho sbagliato o poco chiaro!

se provo a compilarlo mi esce fuori il risultato richiesto ma non so se scritto in questa maniera va bene...

poi ci sono alcune cose che vorrei modificare e vorrei un vostro parere;
ad esempio:
- definire in piu funzioni diverse;
- il problema di array di una lunghezza definita;

comunque ho scritto nei commenti in modo piu definito le cose che vorrei modificare e in che modo!



aspetto un vostro aiuto come sempre ciao e grazie

codice:
/********************************/
/* Dichiarazione delle librerie */
/********************************/
#include <stdio.h>
#include <stdlib.h>


/* definizione di un elemento della sottoformula*/
typedef struct elem_lista
{
    int  quant;                /**/
    char varq;
    int neg;
    char pred;
    char varp;
} elem_lista_t;


/********************************/
/* Dichiarazione delle funzioni */
/********************************/

void stampa_messaggio_iniziale(void);





// definizione del main

int main(int argc, const char * argv[])
{
    /* dichiarazione delle variabili locali alla funzione */
    char carattere;
    int esito;
    char varleg[100];
    char varlib[100];
    int i = -1,
    j = -1;
    int quant;                /* simbolo dell'argomento            */
    char varq;
    int neg;
    char pred;
    char varp;
    
    
    /* qui vorrei metterci un menu' che ripete queste due opzioni finche' non si e' scelta una
 delle 2 e anche alla fine del punto 1)   : 1) inserimento 2) uscita dal programma*/
    
    
    /* stampa a video del messaggio iniziale del programma */
    stampa_messaggio_iniziale();
    
    /* questi comandi li devo mettere in una funzione a parte che inserisce le lettere e
verifica che siano corrette e finche non e' scritto in modo corretto lo fa riscrivere */

    while((carattere = getchar()) != '\n')
    {
    	if (carattere == '*' || carattere == '#')
	    {
            esito = ((islower(carattere = getchar()))? 1: 0);
            if (!esito)
                printf("Dopo un quantificatore ci dev'essere una variabile...\n");
            else
            {
                varq = carattere;
                quant = 1;
            }
	    }
        
        else if (carattere == '^')
        {
            carattere = getchar();
            neg = 1;
        }
        
        else if (isupper(carattere))
        {
            esito = ((islower(carattere = getchar()))? 1: 0);
            pred = carattere;
            if (!esito)
                printf("Dopo un predicato ci dev'essere una variabile...\n");
            else
            {
                varp = carattere;
            }
        }
        
        else if (carattere >= '1' && carattere <= '4')
        {
            if (varq == varp)
                varleg[++i] = varp;
            else
                varlib[++j] = varp;
        }
        
        if (!esito)
        {
            printf("E' necessario riscrivere la formula\n");
            while(getchar() != '\n');
            i = j = -1;
        }
        
        
    }
    
    
    /* questi comandi qui sotto li devo racchiudere in una funzione*/
    varleg[++i] = '\0';
    varlib[++j] = '\0';
    
    
    if (varq == varp)
        varleg[++i] = varp;
    else
        varlib[++j] = varp;

    
    printf("DEBUG: Le variabili legate sono: %s\n", varleg);
    printf("DEBUG: i = %d, j = %d\n", i, j);
    printf("DEBUG: Le variabili libere sono: %s\n", varlib);
    
    // funzione per la verifica della formula
    if (j == 0) 
        printf("la formula e' chiusa");
    
    else 
        printf("la formula e' aperta");
    
    
    return 0;
}






/* definizione della funzione di stampa a video del messaggio iniziale del programma */
void stampa_messaggio_iniziale(void)
{
    /* viene stampato a video il messaggio iniziale del programma */
    printf("\nInserire la formula di logica dei predicati.\n\n"
           "==============================\n"
           "# = esiste\n"
           "* = per ogni\n"
           "0 = operatore NOT                   (¬)\n"
           "1 = operatore AND                   (^)\n"
           "2 = operatore OR                    (v)\n"
           "3 = operatore IMPLICAZIONE          (->)\n"
           "4 = operatore DOPPIA IMPLICAZIONE   (<->)\n"
           "==============================\n\n"
           "Ogni sottoformula deve contenere un solo simbolo di predicato\n"
           "Ogni sottoformula deve contenere un solo simbolo di quantificatore\n"
           "Ogni sottoformula deve contenere una sola variabile associata al predicato e una sola variabile al quantificatore\n"
           "Il simbolo di predicato dev'essere una lettera maiuscola.\n"
           "Le variabili devono essere una lettera minuscola\n\n"
           
           "Esempi di sintassi correttamente acquisibili dal programma:\n\n"
           
           "... ");
}