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.
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.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); }
Qualcuno mi saprebbe spiegare il perché?

Rispondi quotando
