ciao a tutti, è il mio primo post su questo forum, vi voglio porre un problema che ho con questo programma :/ ci sto sbattendo da un po' .
Non riesco a capire perchè non funziona la funzione di inserimento nella lista, inoltre nel do while del main ho messo la condizione di uscita con un && che però non viene considerata perchè esce dal ciclo anke se questa condizione viene rispettata (forse || risolverebbe il problema???)!!
vi inserisco il testo del programma, così se avete voglia e tempo potrete aiutarmi
grazie...

codice:
/* Scrivere un semplice editor di linea. Conservare l'intero testo in una lista concatenata, una */
/* linea per ciascun nodo. Iniziare il programma con il comando EDIT file, dopo di che appare */
/* un prompt insieme al numero di riga. Se viene inserita la lettera I seguita da un numero n, */
/* allora il testo che segue va inserito prima della riga n. Se I non è seguita da un numero, */
/* allora il testo va inserito prima della riga attuale. Se viene inserita D con due numero n ed m, */
/* un solo numero n oppure nessun numero, allora bisogna eliminare rispettivamente le righe da */
/* n ad m, le riga n oppure la riga attuale. Fare lo stesso con il comando L, che richiede la */
/* visualizzazione di righe. Se viene inserita A, allora il testo va aggiunto alle righe esistenti. */
/* Inserendo E il programma termina, salvando il testo in un file. */

/* Inclusione librerie */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

/* Definizione costanti */
#define MAX_FRASE_SIZE 100 /* Massimo numero di caratteri per la frase da inserire in ogni nodo */

/* Struttura della lista */
typedef struct list_node *list_pointer;
typedef struct list_node {
char frase[MAX_FRASE_SIZE];
list_pointer link;
}lista;

/* Puntatore al file */
FILE *fp;

/* Prototipi funzioni */
void inserisci(list_pointer *, int , char *);
void cancella(list_pointer *, int , int );
void visualizza(list_pointer , int , int );
void leggi_file(list_pointer *, int );
void salva_file(list_pointer );
void insert_nodo(list_pointer *, list_pointer , int *);



main()
{

    int linea=1,n=0,m=0;
    char word[MAX_FRASE_SIZE];
    list_pointer testa=NULL; /* Testa della lista NULL poichè non ancora allocato spazio in memoria */

    printf("\n\t\t\t\tEDITOR DI LINEA\n");

    /* Visualizzazione file */
    leggi_file(&testa,linea);

    do
    {


        printf("%d>", linea);
        fflush(stdin);
        scanf("%[^\n]s", &word);

        switch(word[0])
        {

            case 'E':
                if(word[1]!='\0')
                {
                    inserisci(&testa,n,word);
                    linea++;
                    salva_file(testa);
                }

                if(word[1]=='\0')
                {
                    salva_file(testa);
                    exit(1);
                }
            break;

            case 'I':
                if(word[1]=='\0')
                {
                    inserisci(&testa,n,word);
                    linea++;
                }

                if(word[1]==' ' && word[3]=='\0')
                {
                    n=word[2]-'0';
                    inserisci(&testa,n,word);
                    linea++;
                }
                else
                {
                    inserisci(&testa,n,word);
                    linea++;
                }
                salva_file(testa);
            break;

            case 'D':
                if(word[1]=='\0')
                {
                    cancella(&testa,n,m);
                    linea--;
                }

                if(word[1]==' ' && word[3]=='\0')
                {
                    n=word[2]-'0';
                    cancella(&testa,n,m);
                    linea=linea-n;
                }

                if(word[1]==' ' && word[3]==' ' && word[5]==' ')
                {
                    n=word[2]-'0';
                    m=word[4]-'0';
                    cancella(&testa,n,m);
                    linea=linea-(n+m);
                }
                salva_file(testa);
            break;

            case 'L':
                if(word[1]=='\0')
                    visualizza(testa,n,m);

                if(word[1]==' ' && word[3]=='\0')
                {
                    n=word[2]-'0';
                    visualizza(testa,n,m);
                }

                if(word[1]==' ' && word[3]==' ' && word[5]==' ')
                {
                    n=word[2]-'0';
                    m=word[4]-'0';
                    visualizza(testa,n,m);
                }
            break;

            default:
                inserisci(&testa,n,word);
                linea++;
                salva_file(testa);
            break;


            }
        n=0;m=0;
    }
    while((word[0]!='E') && (word[1]!='\0'));

    fflush(stdin);
    getchar();
}


/* Funzione di inserimento nuova frase nella lista */
void inserisci(list_pointer *testa, int n, char word[])
{
    list_pointer temp,aux=*testa;
    int line=1;


    /* Se si inserisce I seguita da un numero */
    if(word[0]=='I' && word[1]==' ' && word[2]-'0'==n)
    {
        temp=(list_pointer)malloc(sizeof(lista));
        printf("%d>", n);
        fflush(stdin);
        scanf("%[^\n]s", &temp->frase);

        while(line<=n && aux)
        {
            aux=aux->link;
            line++;
        }
        if(aux)
        {
            temp->link=aux->link;
            aux->link=temp;
        }
    }


    /* Se si inserisce I seguita da nessun numero */
    if(word[0]=='I' && word[1]=='\0')
    {
        if(aux)
        {
            while(aux->link)
            {
                line++;
                aux=aux->link;
            }
            temp=(list_pointer)malloc(sizeof(lista));
            printf("%d>", line);
            fflush(stdin);
            scanf("%[^\n]s", &temp->frase);
            temp->link=aux->link;
            aux->link=temp;
        }
    }


    /* Se si inserisce qualsiasi frase */
    if(((word[0]=='I' && n!=word[2]-'0' && word[1]!='\0') || (word[0]=='A' && word[1]!='\0') || (word[0]!='I') || (word[0]!='A')))
    {
        temp=(list_pointer)malloc(sizeof(lista));
        strcpy(temp->frase,word);
        if(aux)
        {
            while(aux->link)
                aux=aux->link;
            temp->link=NULL;
            aux->link=temp;
        }
        else
        {
            temp->link=NULL;
            aux=temp;
        }
    }

/* O(n) */
}


/* Funzione di cancellazione nodi dalla lista */
void cancella(list_pointer *testa, int n, int m)
{

}


/* Funzione che copia il file nella lista */
void leggi_file(list_pointer *testa, int linea)
{
    list_pointer temp;

    fp = fopen("editor.txt","r");

    if(fp)
    {
        rewind(fp);
        while(!feof(fp))
        {
            temp=(list_pointer)malloc(sizeof(lista));
            fscanf(fp,"%s\n", temp->frase);
            insert_nodo(testa,temp,&linea);
        }
        fclose(fp);
    }
} /* O(n) */


/* Funzione di inserimento della frase nel nodo della lista */
void insert_nodo(list_pointer *testa, list_pointer temp, int *linea)
{
    list_pointer aux;

    if(*testa)
    {
        (*testa)->link=temp;
        temp->link=NULL;
    }
    else
    {
        temp->link=NULL;
        (*testa)=temp;
        return;
    }

    aux=*testa;

    while(aux)
    {
        *linea++;
        aux=aux->link;
    } /* O(n^2) */
}


/* Funzione di salvataggio della lista nel file */
void salva_file(list_pointer testa)
{
    if(testa)
    {
        fp = fopen ("editor.txt","w");
        rewind(fp);

        while(testa)
        {
            fprintf(fp,"%s\n",testa->frase);
            testa=testa->link;
        }
    }
} /* O(n) */


/* Funzione di visualizzazione della lista */
void visualizza(list_pointer testa,int n, int m)
{
    int linea=1,i;
    list_pointer aux=testa;

    if(n==-1) /* se n=-1 visualizza solo la linea attuale */
    {
        while(aux)
        {
            linea++;
            aux=aux->link;
        }
        printf("\n%d> %s", linea, aux->frase);
    }

    else if(n!=-1 && m==-1) /* se è inserito solo n allora visualizza solo la linea n */
    {
        while(linea!=n && aux)
        {
            linea++;
            aux=aux->link;
        }
        printf("\n%d> %s", linea, aux->frase);
    }

    else if(n!=-1 && m!=-1) /* se n ed m sono diversi da 0 allora visualizza le linee da n ad m */
    {
        while(linea!=n && aux)
        {
            linea++;
            aux=aux->link;
        }
        for(i=n;i<=m && aux;i++)
        {
            printf("\n%d> %s", linea, aux->frase);
            aux=aux->link;
        }
    }
}