[C]Problema con liste
ho un problema credo nella procedura svuota,perche' quando ricerco un elemento e' come se non fosse mai stato inserito, in pratica, il programma mi chede di riempire una coda e poi passare questi dati a un vettore di liste... le altre due procedure effettuano una ricerca, la prima per nome e cognome, mentre la seconda solo per cognome e visualizza tutti gli omonimi... sto impazzendo da due ore...non riesco a trovare l'errore...
#include<stdio.h> #include<malloc.h> #define CODAVUOTA NULL typedef short boolean; typedef struct{ unsigned int g,m,a; }data; typedef struct{ char via[30],citta[30]; unsigned int numero; }residenza; typedef struct{ char cognome[30],nome[30],nascita[30],patente[30]; data D; residenza R; }tipobase; struct nodocoda{ tipobase info; struct nodocoda *next; }; typedef struct{ struct nodocoda *front,*rear; }queue; void makenullcoda(queue *q) { q->front=q->rear=CODAVUOTA; } boolean emptycoda(queue q) { return(q.front==CODAVUOTA); } tipobase front(queue q) { if(!emptycoda(q)) return(q.front->info); } void enqueue(queue *q,tipobase x) { struct nodocoda *tmp; tmp=(struct nodocoda*)malloc(sizeof(struct nodocoda)); tmp->info=x; tmp->next=CODAVUOTA; if(emptycoda(*q)) q->front=q->rear=tmp; else { q->rear->next=tmp; q->rear=tmp; } } void dequeue(queue *q) { struct nodocoda *tmp; { if(!emptycoda(*q)) { tmp=q->front->next; free(q->front); q->front=tmp; if(q->front==CODAVUOTA) q->rear=CODAVUOTA; } } } //LISTA #define LISTAVUOTA NULL typedef struct nodo{ tipobase info; struct nodo *next; }*list; typedef list position; void makenull(list *l) { *l=LISTAVUOTA; } boolean empty(list l) { return(l==LISTAVUOTA); } position first(list l) { return(LISTAVUOTA); } position end(list l) { if(l==LISTAVUOTA) return(LISTAVUOTA); while(l->next!=LISTAVUOTA) l=l->next; return(l); } void insert(list *l,position p,tipobase x) { struct nodo *tmp; tmp=(struct nodo*)malloc(sizeof(struct nodo)); tmp->info=x; if(p==LISTAVUOTA) { tmp->next=*l; *l=tmp; } else { tmp->next=p->next; p->next=tmp; } } tipobase retrieve(list l,position p) { if(!empty(l) && p!=end(l)) { if(p==LISTAVUOTA) return(l->info); else return(p->next->info); } } position next(list l,position p) { if(p!=end(l)) { if(p==LISTAVUOTA) return(l); else return(p->next); } } position locate(list l,tipobase x) { if(!empty(l)) { if(!strcmp(l->info.cognome,x.cognome) && !strcmp(l->info.nome,x.nome)) return(LISTAVUOTA); while(l->next!=LISTAVUOTA) { if(!strcmp(l->next->info.cognome,x.cognome) && !strcmp(l->next->info.nome,x.nome)) break; l=l->next; } return(l); } } //COMPITO void insord(list *l,tipobase x) { position p,u; tipobase tmp; if(empty(*l)) insert(l,first(*l),x); else { p=first(*l); u=end(*l); while(p!=u) { tmp=retrieve(*l,p); if(strcmp(tmp.cognome,x.cognome)<0 || !strcmp(tmp.cognome,x.cognome) && strcmp(tmp.nome,x.nome)<0 ) p=next(*l,p); else break; } insert(l,p,x); } } void riempi(queue *q) { tipobase x; int n; do{ printf("\n Quanti elementi vuoi inserire: "); scanf("%u",&n); fflush(stdin); }while(n<=0); while(n>0) { printf("\n Cognome: "); gets(x.cognome); printf("\n Nome: "); gets(x.nome); printf("\n Luogo di nascita: "); gets(x.nascita); printf("\n Giorno di nascita: "); scanf("%u",&x.D.g); fflush(stdin); printf("\n Mese di nascita: "); scanf("%u",&x.D.m); fflush(stdin); printf("\n Anno di nascita: "); scanf("%u",&x.D.a); fflush(stdin); printf("\n Citta' di residenza: "); gets(x.R.citta); printf("\n Via: "); gets(x.R.via); printf("\n Nnumero: "); scanf("%u",&x.R.numero); fflush(stdin); enqueue(q,x); n--; } } void svuota(queue *q,list *l) { unsigned int index; tipobase tmp; if(emptycoda(*q)) printf("\n Coda vuota"); else { while(!emptycoda(*q)) { tmp=front(*q); index=(tmp.cognome[0]-'a'); insord(l+index,tmp); dequeue(q); } } } void ricerca(list l,tipobase x) { tipobase tmp; position p; if(!empty(l)) p=locate(l,x); if(empty(l) || p==end(l)) printf("\n elemento non trovato "); else { tmp=retrieve(l,p); printf("\n Luogo di nascita: %s",tmp.nascita); printf("\n Giorno di nascita: %u",&tmp.D.g); printf("\n Mese di nascita: %u",&tmp.D.m); printf("\n Anno di nascita: %u",&tmp.D.a); printf("\n Citta' di residenza: %u",tmp.R.citta); printf("\n Via: %u",tmp.R.via); printf("\n Nnumero: %u",&tmp.R.numero); } } void cerca(list l,tipobase tmp) { char s; tipobase x; position p=first(l); if(empty(l)) printf("\n Coda vuota"); else { while(p!=end(l) && s!='n' && s!='N') { x=retrieve(l,p); if(!strcmp(x.cognome,tmp.cognome)) { printf("\n Nome: %s",x.nome); printf("\n Luogo di nascita: %s",x.nascita); printf("\n Giorno di nascita: %u",&x.D.g); printf("\n Mese di nascita: %u",&x.D.m); printf("\n Anno di nascita: %u",&x.D.a); printf("\n Citta' di residenza: %u",x.R.citta); printf("\n Via: %u",x.R.via); printf("\n Nnumero: %u",&x.R.numero); } else printf("\n elemento non trovato"); p=next(l,p); do{ printf("\n vuoi continuare?"); scanf("%c",&s); fflush(stdin); }while(s!='s' && s!='S' && s!='n' && s!='N'); } if(p==end(l)) printf("\n ricerca completata,nessun altro elemento presente"); } } unsigned int indice(char *c) { if('a'<=c[0]<='z') return(c[0]-'a'); if('A'<=c[0]<='Z') return(c[0]-'A'); return(-1); } //MAIN main() { tipobase elemento; list archivio[26]; unsigned int i,s,index; queue coda; for(i=0;i<26;i++) makenull(archivio+i); printf("\n------------MAGAZZINO-------------"); do{ printf("\n 1- Riempi coda "); printf("\n 2- Svuota coda "); printf("\n 3- Ricerca normale"); printf("\n 4- Ricerca omonimi"); printf("\n Scegli--------->> "); scanf("%u",&s); fflush(stdin); switch(s) { case 1: riempi(&coda); break; case 2: svuota(&coda,archivio); break; case 3: printf("\n Cognome: "); gets(elemento.cognome); printf("\n Nome: "); gets(elemento.nome); index=indice(elemento.cognome); if(index<0) printf("\n cognome non valido "); else ricerca(archivio[index],elemento); break; case 4: printf("\n Cognome: "); gets(elemento.cognome); index=indice(elemento.cognome); if(index<0) printf("\n cognome non valido "); else cerca(archivio[index],elemento); break; } }while(s<5); getchar(); }
Risposte
[mod="Fioravante Patrone"]Per cortesia, togli quel "aiutoooo!! " dal titolo. E magari usa lo spazio disponibile per specificare meglio il titolo del post. Grazie[/mod]