Il testo del problema è:
Si assuma presente in memoria una lista composta di abbreviazioni (ad esempio TO, MI,
RM) e dalle corrispondenti parole estese implementata tramite record e puntatori utilizzando
la seguente struttura:
struct elem {
char abbr[2];
char *estesa;
struct elem *next;
}
Scrivere una funzione C che, ricevendo come parametri il puntatore all’inizio della lista,
una abbreviazione e la corrispondente parola estesa cerchi l’abbreviazione nella lista e:
a) restituisca 0 se la coppia `e presente nella lista
b) restituisca 1 se la coppia non `e presente nella lista
c) restituisca 2 se l‘abbreviazione `e presente ma ad essa corrisponde una parola differente.
Inoltre, nel caso b) un nuovo record deve essere aggiunto in coda alla lista e nel caso c) la
parola estesa deve essere sostituita da quella passata come parametro.
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct elem {
char abbr[2];
char *estesa;
struct elem *next;
};
struct elem *crealista(int n);
int contr(struct elem *pun, char abb[], char est[]);
void creaelem(struct elem *t, char a[], char b[]);
int main()
{
int k;
int i=0;
do{
if(i!=0)
printf("Errore! Il numero deve essere almeno uguale a 1! \n");
printf("Inserisci il numero di elementi della lista: \n");
scanf("%d", &k);
}
while(k<1);
char ab[2];
char es[1000];
char sc;
struct elem *p;
p=crealista(k);
int y;
for( ;sc!='t'; ) {
printf("Inserisci un abbreviazione: \n");
scanf("%s", ab);
printf("Inserisci la stringa estesa: \n");
scanf("%s", es);
y=contr(p, ab, es);
if(y==0)
printf("L'abbreviazione e la stringa estesa sono presenti nella lista \n");
else {
if(y==1)
printf("L'abbreviazione non era presente nella lista ma ora \x8A stata inserita \n");
else
printf("Era presente l'abbreviazione ma non l'estensione ma ora \x8A stata inserita \n");
}
while(getchar()!='\n');
printf("Premi t per terminare: \n");
sc=getchar();
}
return 0;
}
struct elem *crealista(int n) {
struct elem *p, *pt;
p=(struct elem *)malloc(sizeof(struct elem));
printf("Inserisci l'abbrezione 1: \n");
scanf("%s", p->abbr);
p->estesa=malloc(1000*sizeof(char));
printf("Inseisci la stringa estesa 1: \n");
scanf("%s", p->estesa);
pt=p;
int i;
for(i=1; i<n; i++) {
pt->next=(struct elem *)malloc(sizeof(struct elem));
pt=pt->next;
printf("Inserisci l'abbrezione %d: \n", i+1);
scanf("%s", pt->abbr);
pt->estesa=malloc(1000*sizeof(char));
printf("Inseisci la stringa estesa %d: \n", i+1);
scanf("%s", pt->estesa);
}
pt->next=NULL;
return p;
}
int contr(struct elem *pun, char abb[], char est[]) { /* controlla che siano presenti sia l'abb. che l'est. oppure solo l'abb*/
struct elem *s, *g;
s=pun;
g=NULL;
while(s!=NULL) {
if(strcmp(s->abbr, abb)==0) {
if(strcmp(s->estesa, est)==0)
return 0;
else
g=s;
}
s=s->next;
}
if(g==NULL) {
creaelem(pun, abb, est);
return 1;
}
else
{
strcpy(g->estesa, est);
return 2;
}
}
void creaelem(struct elem *t, char a[], char b[]) { /* crea un elmento se l'abb non esiste*/
struct elem *f;
f=t;
while(f->next!=NULL)
f=f->next;
f->next=(struct elem *)malloc(sizeof(struct elem));
f=f->next;
f->estesa=malloc(strlen(b)+1);
f->next=NULL;
strcpy(f->abbr, a);
strcpy(f->estesa, b);
}
Questo codice dovrebbe funzionare, però se nel main non utilizzo la y ma metto confronto direttamente contr(p, ab, es) non funziona correttamente visto che quando inserisco una nuova abbreviazione mi stampa che era già presente.
Qualcuno mi saprebbe spiegare il perché?