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