programmazione linguaggio c.

pippotto89

Nuovo Utente
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);
}
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Dal momento che hai detto che l'ABR è ordinato per codice prodotto, se vuoi trovare tutti i prodotti con la tipologia data in input, devi attraversarlo tutto. Poi, ha poco senso che, per confrontare le tipologie, passi i nodi; passa direttamente le tipologie, no? Altrimenti, per visualizzare i dettagli dei prodotti di una certa tipologia, devi creare un nodo "finto" per poterla passare, come hai fatto te..

Suppongo che DETTAGLI restituisca 1 se è stato trovato almeno un elemento della tipologia, 0 altrimenti; inoltre, assumo che confrontatipologia prenda in input due interi (le tipologie) e non due nodi.

La funzione dovrebbe essere la seguente:

Codice:
boolean DETTAGLI(abr n, int tipologia){
if(EMPTYABR(n)) 
  return 0;
if(!confrontatipologia(n->info.tipologia, tipologia)){
  VISUALIZZA_DETTAGLI(n);
  return 1;
}
boolean outSx = DETTAGLI(n->leftchild, tipologia);
boolean outDx = DETTAGLI(n->rightchild,tipologia);
return outSx > outDx ? outSx : outDx;
}
 
  • Mi piace
Reazioni: pippotto89

pippotto89

Nuovo Utente
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
Il problema purtroppo persiste!!!
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Hai ragione, scusa... ho lasciato un return che non doveva esserci! Prova così:

Codice:
boolean DETTAGLI(abr n, int tipologia){
  if(EMPTYABR(n)) 
    return 0;
  boolean out = 0;
  if(!confrontatipologia(n->info.tipologia, tipologia)){
    VISUALIZZA_DETTAGLI(n);
    out = 1;
  }
  boolean outSx = DETTAGLI(n->leftchild, tipologia);
  boolean outDx = DETTAGLI(n->rightchild,tipologia);
  return outSx || outDx || out;
}
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili