Newsgroup: it.comp.lang.c
Titolo: inserimento in un albero di ricerca

ciao a tutti
chi mi potrebbe spiegare come può funzionare questa funzione,scusate il
gioco di parole,che ho preso da un libro.
non mi termina mai,perchè richiama se stessa all'infinito!!!!
eppure santo cielo l'ho presa da un libro, ed in quanto scritta su un
libro dovrebbe essere funzionante alla perfezione.
Non badate alla complessità dei passi per verificare se una stringa è
maggiore o no di un'altra(in ordine alfabetico chiaramente)che mi rendo
conto essere assurda,però l'inserimento in sè per sè è copiato pari pari.
Offro una ricca ricompensa a chi mi potrà essere di aiuto :)
grazie anticipato
P.S. a me sembra proprio che la condizione iniziale sia infinita, a meno
che non termini tutta la memoria del computer!!!  :o  
void insertNode(TREENODEPTR *treePtr ,char valore[],FILE *outputFile)
{
 int p1,q1,r1,t1,i1;
 p1=2;
 q1=0;
 r1=0;
 t1=0;
 i1=0;
 
 if (*treePtr==NULL)
  {
    *treePtr=malloc(sizeof(TREENODE));
    if(*treePtr != NULL)
     {
      while(valore[q1]!='\0')
      {
       (*treePtr)->stri[q1]=valore[q1];
       q1++;
      }          
      (*treePtr)->leftPtr=NULL;
      (*treePtr)->rightPtr=NULL;
     }
      else
      fprintf(outputFile,"no memory available");
   }
    else
          q1=0;
          while(valore[i1]!='\0')   
             {        
              if(valore[i1]>((*treePtr)->stri[i1]))
               {
                p1=1;
                break;
               }     
                if(valore[i1]<((*treePtr)->stri[i1]))
                 {
                  p1=0;
                  break;             
                 }     
                  if(valore[i1]==((*treePtr)->stri[i1]))
                   {
                    q1++;
                   }                 
                  i1++;
              }
              r1=strlen(valore);
              t1=strlen((*treePtr)->stri);
              if((r1<t1)&&(p1==2))
               {
                 p1=0;
               }
                if((r1==t1)&&(p1==2))
                 {
                  fprintf(outputFile,"duplicato\n");
                  return;
                 }      
      if(p1==0)
       {
        insertNode(&((*treePtr)->leftPtr),valore,outputFile);
       }
        else if(p1==1)
              {
               insertNode(&((*treePtr)->rightPtr),valore,outputFile);
              }
return;
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Dicci cosa _dovrebbe_ fare la funzione, metti tutto il codice che serve 
a capirla (ad es: dove sta la definizione di TREENODEPTR? Uno che legge 
questi sorgenti cosa fa, la deduce?), ed a quel punto magari qualcuno si 
interessera'.
Insomma, mettiti nei panni di chi legge il tuo post, e fai di tutto per 
invogliarlo ad aiutarti, e' tutto a tuo vantaggio, no...?
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003


Sfido chiunque a presentare un algoritmo di inserimento di nodi in alberi di
ricerca più brutti esteticamente, inefficenti e illegibili...
Meno male che l'hai preso da un libro. Mi dovrò decidere prima o poi anche
io a scriverne qualcuno. Ma qussto è un'altro discorso.
Sono d'accordo con Mattia Belletti che ti consiglia di postare le richieste
in modo chiaro e completo di tutto ciò che serve per poterti rispondere.
Magari fai anche capire che ci hai lavorato un po' prima di mettere il
codice la e affidarlo in pasto al gruppo.
A me veniva voglia di non rispondere neanche, proprio per i motivi di cui
sopra...
Vabbè.
Sembra che tu voglia proprio inserire nodi in alberi binari di ricerca
(visto che si fa riferimento a puntatore destro e sinistro a NODEPTR, oltre
che una stringa stri[] che contiene il valore proprio del nodo).
Il programma va in ricorsione infinita immediatamente dopo la creazione del
primo nodo perchè r1 non è mai uguale a t1.
Uno dei modi corretti di copiare quella stringa:
i = 0; /* ovvio */
while ( ( (*treeptr)->stri[i] = valore[i] ) != '\0')
   	i++;
Anche se preferisco i puntatori che permettono:
	while ( *d++ = *s++ );
(Non si aggiunge niente altro e la copia è fatta compreso il carattere '\0'
finale).
Dopo è anche possibile che la routine funzioni, ma io butterei il libro.
Se vuoi vedere del codice su ins/rem di nodi su alberi binari di ricerca, e
anche su molte altre strutture guarda:
http://www.cs.fiu.edu/~weiss/dsaa_c2e/files.html
Gli algoritmi sono interessantissimi (dal punto di vista didattico).
Buon divertimento,
FabioMDF
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/