- 2
- 0
- CPU
- filippo.fl@hotmail.it
- Scheda Madre
- filippo.fl@hotmail.it
- HDD
- filippo.fl@hotmail.it
- RAM
- filippo.fl@hotmail.it
- GPU
- filippo.fl@hotmail.it
- Audio
- filippo.fl@hotmail.it
- Monitor
- filippo.fl@hotmail.it
- PSU
- filippo.fl@hotmail.it
- Case
- filippo.fl@hotmail.it
- OS
- filippo.fl@hotmail.it
esempio:
struttura dati ABR (ALBERO BINARIO DI RICERCA)
codice prodotto CHAR
tipologia INT
prezzo INT
pezzi INT
l’albero è ordinato per codice prodotto.
1 inserire il codice prodotto con dettagli all’interno dell’abr.
2 inserire la tipologia ed visualizzare tutti i dettagli contenenti la stessa
tipologia.
PROBLEMA nella 2 domanda perché invece di visualizzare tutti i codici prodotto con la stessa tipologia mi visualizza solamente la prima che ho inserito.
AIUTO ..!!
questo è il file sorgente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void flush (void);
#define ABRVUOTO NULL
#define STR 10
typedef struct{
char codice[STR];
unsigned int tipologia,pezzi,prezzo;
}tipobaseabr;
typedef struct nodoabr{
tipobaseabr info;
struct nodoabr *leftchild,*rightchild;
}*abr;
typedef short boolean;
boolean EMPTYABR(abr n){
return(n==ABRVUOTO);
}
void MAKENULLABR(abr *n){
*n=ABRVUOTO;
}
abr LEFTCHILD(abr n){
if(!EMPTYABR(n))
return(n->leftchild);
}
abr RIGHTCHILD(abr n){
if(!EMPTYABR(n))
return(n->rightchild);
}
tipobaseabr LABEL(abr n){
if(!EMPTYABR(n))
return(n->info);
}
boolean MEMBER(abr n,tipobaseabr x){
if(EMPTYABR(n)) return 0;
if(!confrontaabr(n->info,x)) return 1;
if(confrontaabr(n->info,x)>0) return MEMBER(n->leftchild,x);
else return MEMBER(n->rightchild,x);
}
void INSERTABR(abr *n,tipobaseabr x){
if(EMPTYABR(*n)){
(*n)=(struct nodoabr *)malloc(sizeof(struct nodoabr));
(*n)->info=x;
(*n)->leftchild = (*n) ->rightchild = ABRVUOTO;
}else if(confrontaabr((*n)->info,x)>0)INSERTABR(&(*n)->leftchild,x);
else if(confrontaabr((*n)->info,x)<0) INSERTABR(&(*n)->rightchild,x);
}
int confrontaabr(tipobaseabr a,tipobaseabr b){
return strcmp(a.codice,b.codice);
}
int confrontatipologia(tipobaseabr a,tipobaseabr b){
return (a.tipologia-b.tipologia);
}
void Leggistringa(char s[],unsigned short dim){
unsigned short i;
for(i=0;(s=getchar())!='\n' && i<dim-1;i++);
s='\0';
if(i==dim-1) flush();
}
unsigned int INDICE(tipobaseabr x,unsigned int n){
unsigned int i,s=0;
for(i=0;x.codice!= '\0' ;i++)
if(x.codice>='0' && x.codice<='9')
s += x.codice;
return(s%n);
}
void allocazione(abr **n,unsigned int x){
*n=(abr *)malloc(x*sizeof(abr));
}
void inserimentoprodotto(tipobaseabr *x){
printf("\nInserimento codice prodotto:");
Leggistringa(x->codice,STR);
}
void inserimentodettagli(tipobaseabr *x){
printf("\nInserisci la tipologia:");
scanf("%u",&x->tipologia);
flush();
printf("\nNumero di pezzi:");
scanf("%u",&x->pezzi);
flush();
printf("\nPrezzo prodotto:");
scanf("%u",&x->prezzo);
flush();
}
void inserimentotipologia(tipobaseabr *x){
printf("\nInserisci la tipologia:");
scanf("%u",&x->tipologia);
flush();
}
void INSERIMENTO_PRODOTTO(abr *n,tipobaseabr);
void VISUALIZZA_DETTAGLI(abr n);
boolean DETTAGLI(abr n,tipobaseabr x);
abr * archivio;
main(){
unsigned int i,scelta,n,index;
tipobaseabr prodotto;
do{
printf("\nInserisci la dimensione del vettore:");
scanf("%u",&n);
flush();
}while(n<2);
allocazione(&archivio,n);
for(i=0;i<n;i++)
MAKENULLABR(archivio + i);
do{
printf("\n---ESAME 18-02---");
printf("\n1inserimento prodotto");
printf("\n2infromazione prodotto dalla tipologia");
printf("\n3fine");
printf("\nscelta--->");
scanf("%u",&scelta);
flush();
switch(scelta){
case 1:
inserimentoprodotto(&prodotto);
index = INDICE(prodotto,n);
INSERIMENTO_PRODOTTO(archivio+index,prodotto);
break;
case 2:
inserimentotipologia(&prodotto);
if(!DETTAGLI(*archivio,prodotto))
printf("\ntitolo non trovato.");
break;
}
}while(scelta<3);
}
void flush(void){
while(getchar()!='\n');
}
void INSERIMENTO_PRODOTTO(abr *n,tipobaseabr x){
if(MEMBER(*n,x))
printf("\nIl codice inserito e' gia' in archivio.");
else {
inserimentodettagli(&x);
INSERTABR(n,x);
}
}
void VISUALIZZA_DETTAGLI(abr n){
if(!EMPTYABR(n))
printf("\nCodice prodotto:%s",n->info.codice);
printf("\nNumero pezzi:%u",n->info.pezzi);
printf("\nPrezzo prodotto:%u",n->info.prezzo);
}
boolean DETTAGLI(abr n,tipobaseabr x){
if(EMPTYABR(n)) return 0;
if(!confrontatipologia(n->info,x)){
VISUALIZZA_DETTAGLI(n);
return 1;
}
if(confrontatipologia(n->info,x)>0) return DETTAGLI(n->leftchild,x);
else return DETTAGLI(n->rightchild,x);
}
struttura dati ABR (ALBERO BINARIO DI RICERCA)
codice prodotto CHAR
tipologia INT
prezzo INT
pezzi INT
l’albero è ordinato per codice prodotto.
1 inserire il codice prodotto con dettagli all’interno dell’abr.
2 inserire la tipologia ed visualizzare tutti i dettagli contenenti la stessa
tipologia.
PROBLEMA nella 2 domanda perché invece di visualizzare tutti i codici prodotto con la stessa tipologia mi visualizza solamente la prima che ho inserito.
AIUTO ..!!
questo è il file sorgente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void flush (void);
#define ABRVUOTO NULL
#define STR 10
typedef struct{
char codice[STR];
unsigned int tipologia,pezzi,prezzo;
}tipobaseabr;
typedef struct nodoabr{
tipobaseabr info;
struct nodoabr *leftchild,*rightchild;
}*abr;
typedef short boolean;
boolean EMPTYABR(abr n){
return(n==ABRVUOTO);
}
void MAKENULLABR(abr *n){
*n=ABRVUOTO;
}
abr LEFTCHILD(abr n){
if(!EMPTYABR(n))
return(n->leftchild);
}
abr RIGHTCHILD(abr n){
if(!EMPTYABR(n))
return(n->rightchild);
}
tipobaseabr LABEL(abr n){
if(!EMPTYABR(n))
return(n->info);
}
boolean MEMBER(abr n,tipobaseabr x){
if(EMPTYABR(n)) return 0;
if(!confrontaabr(n->info,x)) return 1;
if(confrontaabr(n->info,x)>0) return MEMBER(n->leftchild,x);
else return MEMBER(n->rightchild,x);
}
void INSERTABR(abr *n,tipobaseabr x){
if(EMPTYABR(*n)){
(*n)=(struct nodoabr *)malloc(sizeof(struct nodoabr));
(*n)->info=x;
(*n)->leftchild = (*n) ->rightchild = ABRVUOTO;
}else if(confrontaabr((*n)->info,x)>0)INSERTABR(&(*n)->leftchild,x);
else if(confrontaabr((*n)->info,x)<0) INSERTABR(&(*n)->rightchild,x);
}
int confrontaabr(tipobaseabr a,tipobaseabr b){
return strcmp(a.codice,b.codice);
}
int confrontatipologia(tipobaseabr a,tipobaseabr b){
return (a.tipologia-b.tipologia);
}
void Leggistringa(char s[],unsigned short dim){
unsigned short i;
for(i=0;(s=getchar())!='\n' && i<dim-1;i++);
s='\0';
if(i==dim-1) flush();
}
unsigned int INDICE(tipobaseabr x,unsigned int n){
unsigned int i,s=0;
for(i=0;x.codice!= '\0' ;i++)
if(x.codice>='0' && x.codice<='9')
s += x.codice;
return(s%n);
}
void allocazione(abr **n,unsigned int x){
*n=(abr *)malloc(x*sizeof(abr));
}
void inserimentoprodotto(tipobaseabr *x){
printf("\nInserimento codice prodotto:");
Leggistringa(x->codice,STR);
}
void inserimentodettagli(tipobaseabr *x){
printf("\nInserisci la tipologia:");
scanf("%u",&x->tipologia);
flush();
printf("\nNumero di pezzi:");
scanf("%u",&x->pezzi);
flush();
printf("\nPrezzo prodotto:");
scanf("%u",&x->prezzo);
flush();
}
void inserimentotipologia(tipobaseabr *x){
printf("\nInserisci la tipologia:");
scanf("%u",&x->tipologia);
flush();
}
void INSERIMENTO_PRODOTTO(abr *n,tipobaseabr);
void VISUALIZZA_DETTAGLI(abr n);
boolean DETTAGLI(abr n,tipobaseabr x);
abr * archivio;
main(){
unsigned int i,scelta,n,index;
tipobaseabr prodotto;
do{
printf("\nInserisci la dimensione del vettore:");
scanf("%u",&n);
flush();
}while(n<2);
allocazione(&archivio,n);
for(i=0;i<n;i++)
MAKENULLABR(archivio + i);
do{
printf("\n---ESAME 18-02---");
printf("\n1inserimento prodotto");
printf("\n2infromazione prodotto dalla tipologia");
printf("\n3fine");
printf("\nscelta--->");
scanf("%u",&scelta);
flush();
switch(scelta){
case 1:
inserimentoprodotto(&prodotto);
index = INDICE(prodotto,n);
INSERIMENTO_PRODOTTO(archivio+index,prodotto);
break;
case 2:
inserimentotipologia(&prodotto);
if(!DETTAGLI(*archivio,prodotto))
printf("\ntitolo non trovato.");
break;
}
}while(scelta<3);
}
void flush(void){
while(getchar()!='\n');
}
void INSERIMENTO_PRODOTTO(abr *n,tipobaseabr x){
if(MEMBER(*n,x))
printf("\nIl codice inserito e' gia' in archivio.");
else {
inserimentodettagli(&x);
INSERTABR(n,x);
}
}
void VISUALIZZA_DETTAGLI(abr n){
if(!EMPTYABR(n))
printf("\nCodice prodotto:%s",n->info.codice);
printf("\nNumero pezzi:%u",n->info.pezzi);
printf("\nPrezzo prodotto:%u",n->info.prezzo);
}
boolean DETTAGLI(abr n,tipobaseabr x){
if(EMPTYABR(n)) return 0;
if(!confrontatipologia(n->info,x)){
VISUALIZZA_DETTAGLI(n);
return 1;
}
if(confrontatipologia(n->info,x)>0) return DETTAGLI(n->leftchild,x);
else return DETTAGLI(n->rightchild,x);
}