# include<stdio.h>
# include<stdlib.h>
# include<time.h>
# include<string.h>
/*
STRUTTURA DATI CHE IMPLEMENTA I TRENI MERCI
*/
struct listaTreniMerci2 {
char nome[40];
char sequenza[40];
struct listaTreniMerci2 *next;
};
/*
PUNTATORE ALLA LISTA CONTENTE I TRENI
*/
struct listaTreniMerci2 *treniMerci2;
/*
Funzione inserisci
Questa funzione inserisce nella lista dei treni un nuovo treno, il cui nome e
la cui struttura sono definiti dalla stringa passata in input, restituendo il
puntatore alla lista dei treni.
Nel caso sia già presente un treno dello stesso nome di quello passato dalla
stringa di input non viene compiuta alcuna operazione.
*/
struct listaTreniMerci2 *inserisci(char *alfa, char *w, struct listaTreniMerci2 *tmp){
struct listaTreniMerci2 *p1, *p2, *t;
t=(struct listaTreniMerci2 *)malloc(sizeof(struct listaTreniMerci2));
strcpy(t->nome, alfa);
strcpy(t->sequenza, w);
/*ordina_seq(w, t->sequenza);*/
t->next=NULL;
if (tmp == NULL)
return(t);
p1=tmp;
p2=tmp;
while (p1 != NULL && (strcmp(p1->nome, alfa) != 0)) {
if (strcmp(p1->sequenza, w) > 0) {
if (p1 == tmp) {
t->next=p1;
tmp=t;
return(tmp);
}
else {
while (p2->next != p1)
p2=p2->next;
t->next=p1;
p2->next=t;
return(tmp);
}
}
else
p1 = p1->next;
}
if (p1 == NULL){
while(p2->next != NULL)
p2=p2->next;
p2->next=t;
}
return(tmp);
}
/*
Procedura stampatreni
Stampa tutti i treni inseriti in ordine lessicografico secondo la sequenza dei
vagoni.
*/
void stampatreni() {
struct listaTreniMerci2 *tmp;
if (treniMerci2 == NULL) {
printf(">Non sono presenti treni! \n");
return;
}
tmp = treniMerci2;
printf("> (\n");
while (tmp != NULL ) {
printf("> %s", tmp->nome);
printf(": %s\n", tmp->sequenza);
tmp = tmp-> next;
}
printf("> )\n");
}
/*
Funzione somiglianza
Stampa il grado di somiglianza dei treni di nome alfa e beta.
*/
int somiglianza(char * alfa, char *beta){
struct listaTreniMerci2 *tmp1/*, *tmp2*/;
int result=0;
int i;
char alfatmp[40], betatmp[40];
char *p1= alfatmp;
char *p2= betatmp;
if (treniMerci2 == NULL) {
printf(">Non sono presenti treni! \n");
return;
}
tmp1=treniMerci2;
/*tmp2=treniMerci2;*/
while(tmp1 != NULL &&(strcmp(tmp1->nome,alfa) !=0)){
tmp1=tmp1->next;
}
for(i=0;i<strlen(tmp1->sequenza);i++) {
*p1++ = tmp1->sequenza[i];
}
while(tmp1 != NULL &&(strcmp(tmp1->nome, beta)!=0)){
tmp1=tmp1->next;
}
for(i=0;i<strlen(tmp1->sequenza);i++) {
*p2++ = tmp1->sequenza[i];
}
*p1 = '\0';
*p2 = '\0';
int max;
int a = strlen(alfatmp);
int b = strlen(alfatmp);
if (a==b)
max = a;
else if (a>b)
max=b;
else max=a;
for (i=0;i<max;i++) {
if ((alfatmp[i]==betatmp[i])){
result++;
}}
return result;
/*printf("> %d\n", result);*/
}
/*
Procedura stampasomiglianza
Stampa in ordine lessicografico secondo le sequenze di vagoni tutti i treni
che hanno grado di somiglianza n con alfa, come nome del treno.
*/
void stampasomiglianza(char *alfa, int n){
struct listaTreniMerci2 *tmp1;
if (treniMerci2 == NULL) {
printf(">Non sono presenti treni! \n");
return;
}
tmp1=treniMerci2;
while(tmp1 != NULL)
tmp1->next;
if((strcmp(tmp1->nome, alfa)!=0)&&(n!=somiglianza(tmp1->nome, alfa))) {
printf("Nessun treno ha somiglianza %d", n);
printf(" con %s\n", alfa);*/
}
else {
printf("> %s", tmp1->nome);
printf(" %s\n", tmp1->sequenza);
}
void scegliFunzione(){
char alfa[40], beta[40], w[40];
int n, valore_somiglianza;
char tastoScelto;
char c;
scanf("%c", &c);
while (c != 'f') {
switch(c){
case 'i': scanf("%s", &alfa);
scanf("%s", &w);
treniMerci2=inserisci(alfa, w, treniMerci2);
scanf("%c", &tastoScelto);
break;
case 's': stampatreni();
scanf("%c", &tastoScelto);
break;
case 'S': scanf("%s", &alfa);
scanf("%d", &n);
stampasomiglianza(alfa, n);
scanf("%c", &tastoScelto);
break;
case 'm': scanf("%s", &alfa);
scanf("%s", &beta);
valore_somiglianza=somiglianza(alfa, beta);
printf("> %d\n", valore_somiglianza);
scanf("%c", &tastoScelto);
break;
}
scanf("%c", &c);
}
return;
}
/*
Funzione main
La funzione principale del programma che inizializza i puntatori alle liste e
invoca la procedura scegliFunzione.
*/
int main(){
treniMerci2 = (struct listaTreniMerci2 *)malloc(sizeof(struct listaTreniMerci2));
treniMerci2 = NULL;
scegliFunzione();
return 0;
}