Newsgroup: it.comp.lang.c
Titolo: un problema di debug

Ciao a tutti, credo ci sia un problema nella funzione
"inserisci"... Questo è un programma che implementa una struttura
trie per memorizzare le parole... Mi date una mano?L'input è da
c:\file.txt che continene 7 parole separate da spazi.
Grazie
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
struct nodo
   {
        char lettera; //la lettera associata al nodo
        char *parola; //lettere degli avi + parola
        short int nodoTerminale; //1 se è fine parola, 0 altrimenti
        int livello; //livello del nodo
        struct nodo *padre; //padre del nodo (usato nella visita)
        struct nodo *percorso[61]; //array di 62 puntatori
(alfabeto)
   };
static struct nodo *head;
static struct nodo *level;
int AscToInt(unsigned char c)
    //ricerca il valore corrispondente al char
    {
        if ((c >= '0') && ( c <= '9'))
           {
           return (int)(c - '0');
           }
        else if ((c >= 'a') && ( c <= 'z'))
           {
           return 10 + (int)(c - 'a');
           }
        else if ((c >= 'A') && ( c <= 'Z'))
           {
           return 36 + (int)(c - 'A');
           }
        /* non trovato */
        return -1;
    }
void inizializza()
    {
    int x;
    // Vale la pena di usare il tappo z?
    /*z = (struct nodo *) malloc(sizeof *z);
    z->padre = NULL;
    z->lettera = '\b';
    z->parola = NULL;
    z->nodo_terminale = 1;
    for (x=0; x<62; x++)
        {
        z->percorso[x] = NULL;
        }*/
    head = (struct nodo *) malloc(sizeof *head);
    head->padre = NULL;
    head->livello = 0;
    head->lettera = '\0';
    head->parola = NULL;
    head->nodoTerminale = 0; //0 non è terminale, 1 è terminale
    for (x=0; x<62; x++)
        {
        head->percorso[x] = NULL;
        }
    }
void inserisci(char *word)
    {
    int x, y, start, lunghezzaParolaVal;
    char letteraParola;
    struct nodo *p, *newNodo;
    p = head;
    lunghezzaParolaVal = strlen(word) - 1;
    x = 0;
    letteraParola = word[x];
    start=AscToInt(letteraParola);
    while ((p->percorso[start] != NULL) && (x <
lunghezzaParolaVal))
          {
          p = p->percorso[start];
          x++;
          letteraParola= word[x];
          start=AscToInt(letteraParola);
          }
    if (p->percorso[start] != NULL && (x == lunghezzaParolaVal))
          {
          p->nodoTerminale=1;
          p = p->percorso[start];
          x++;
          }
    else
        for (y = x; y < lunghezzaParolaVal; y++)
            {
            newNodo = (struct nodo *) malloc(sizeof *newNodo);
            p->percorso[start] = newNodo;
            newNodo->lettera = letteraParola;
            newNodo->padre = p;
            newNodo->livello = newNodo->padre->livello + 1;
            newNodo->parola = newNodo->padre->parola +
newNodo->lettera;
            newNodo->nodoTerminale=1;
            for (x=0; x<62; x++)
                {
                head->percorso[x] = NULL;
                }
            p=newNodo;
            y++;
            letteraParola= word[y];
            start=AscToInt(letteraParola);
            }
    if (y == lunghezzaParolaVal)
       {
       letteraParola= word[y];
       start=AscToInt(letteraParola);
       y++;
       newNodo = (struct nodo *) malloc(sizeof *newNodo);
       p->percorso[start] = newNodo;
       newNodo->lettera = letteraParola;
       newNodo->padre = p;
       newNodo->livello = newNodo->padre->livello + 1;
       newNodo->parola = newNodo->padre->parola + newNodo->lettera;
       newNodo->nodoTerminale=1;
       for (x=0; x<62; x++)
           {
           head->percorso[x] = NULL;
           }
       p=newNodo;
       }
    }
void mostra(struct nodo *t)
    {
    int x = 0;
    if(t!=NULL)
      {
      if(t->nodoTerminale==1)
        {
        //scrivi(t);
       printf ("%s\n", t->parola);
        }
      for(x=0;x<62;x++)
         {
         mostra(t->percorso[x]);
         }
      }
   }
int main(void)
    {
    char c;
    char *word;
    char parola;
 FILE *ifp;
    int x;
    word = (char *) malloc(sizeof *word);
    ifp = fopen("c:\\file.txt", "r");
    inizializza();
    for (x=0; x<8; x++) //c:\file.txt contiene 7 parole
          {
          fscanf(ifp,"%s",word); //ok, dovrei usare fgets e strtok,
ma non so come si fa! :-p
          //printf("%s", word);
          inserisci(word);
          mostra (head);
          }
    //system("PAUSE");
    }

ma non so come si fa! :-p
Mah...
e dire che ti ho scritto il programma completo nell'altro messaggio...
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 ha scritto nel
messaggio news:3m2o8t4int5o549hj...@4ax.com...
