Salve ho dei problemi con i puntatori per realizzare la procedura

# 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;
}
dalla procedura stampa stampasomiglianza dovrei ottenere se la condizione
n!=somiglianza(tmp1->nome, alfa) fosse vera, scandendo l'elenco di tutti i treni della lista, che in output siano stampati tutti i treni con somiglianza uguale all'intero n con il treno di nome alfa.
cioè dato in input
i alfa AAPP
i beta AAS
i gamma AAP
S alfa 2
dovrei ottenere
> beta AAS
i>gamma AAP
ma il mio input mi da
>alfa AAPP
quindi capisco che nn riesco a far puntare giusto il puntatore

oltretutto la funzione somiglianza, dati in input due nomi torna correttamente il numero della somiglianza tra le sequenze di 2 treni alla volta,quindi il problema sta nel come passo i parametri a questa funzione e di come far sì che siano ad essa passati ad uno ad uno tutti i treni, e se almeno uno ha somiglianza con alfa = n allora devo stampare il nome e la sequenza di quest'ultimo.
qualcuno può aiutarmi.
grazie