Newsgroup: it.comp.lang.c
Titolo: tabella hash problemone

sto preparando alcuni programmi per dare l' esame di linguaggi... e mi
sono impantanato in uno strano problema che ho con questo:
#include <stdlib.h>
#include <stdio.h>
#define HASHSIZE 101
#define MAXWORD 100
struct nodo
{
  char* dato;
  struct nodo* succ;
};
typedef struct nodo h_nodo;
h_nodo tabella[HASHSIZE]; /*ho un array di elementi-liste*/
void getword(char* word)
{
  printf("Inserisci una parola (* per terminare): ");
  scanf("%s", word);
  word[MAXWORD]='\0';
}
int hash(char s[MAXWORD])
{
  int hashval, i;
  for (i=0; s[i]!='\0'; i++)
    hashval=s[i]+31*hashval;
  return abs(hashval%HASHSIZE);
}
void inserimento(char s[MAXWORD], int hashval)
{
  if (tabella[hashval].dato==NULL) /*se non c' e' nessun elemento*/
  {
    tabella[hashval].dato=s;
    tabella[hashval].succ=NULL;
  }
  else
  {
    h_nodo* new=(h_nodo*)malloc(sizeof(h_nodo));
    new->dato=s;
    new->succ=tabella[hashval].succ;
    tabella[hashval].succ=new;
  }
}
void stampa(void)
{
  int i;
  h_nodo* temp;
  printf("\nHashval\t\tDato\n");
  for(i=0; i<HASHSIZE; i++)
    if (tabella[i].dato!=NULL)    /*se la posizione non e' vuota*/
    {
      printf("%d\t\t%s\n", i, tabella[i].dato);
      if (tabella[i].succ!=NULL)
      {
        temp=tabella[i].succ;
        while (temp!=NULL)
        {
          printf("%d\t\t%s\n", i, tabella[i].dato);
          temp=temp->succ;
        }
      }
    }
}
int main()
{
  int i;
  char word[MAXWORD];
 
  /*inizializzo la lista*/
  for (i=0; i<HASHSIZE; i++)
    tabella[i].dato=NULL;
  printf("Tabella hash\n");
  do
  {
    getword(word);    
    if (word[0]!='*')
    {
      i=hash(word);
      inserimento(word, i);
      printf("%d\t\t%s\n", i, tabella[i].dato); /*per conferma*/
    }
  } while(word[0]!='*');
  stampa();  
  return 0;
}
il programma in questione dovrebbe acquisire delle stringhe e gestirle con
una tabella hash... ma... al momento di andare in stampa... mi ritorna
solo il carattere di controllo, e non le stringhe!
qualcuno puo' aiutarmi?
-- 
#include <stdio.h>
int main() {
  printf("%c%c%c\n",90,101,68); return 0;
}


un errore, certamente, si trova nella funzione inserimento. Non puoi fare
tabella[hashval].dato=s;
perché in questo modo il membro "dato" di *ogni* nodo punta al buffer
che utilizzi nel main; poiché al momento della stampa il buffer
contiene l'ultima stringa letta che è quella di controllo, tutte le
etichette dei tuoi nodi punteranno a quella stringa, la quale sarà
l'unica ad essere stampata.
Un modo per risolvere il problema è correggere struct nodo, cioè dentro
struct nodo
{
  char* dato;
  struct nodo* succ;
};
mettere char stringa[512] al posto di char *dato. Se vuoi, puoi
lasciare il puntatore, ma allora devi allocare dinamicamente il
vettore di char ed assegnare a dato il valore restituito da malloc.
Ora che hai a disposizione un vettore di char, devi utilizzare
strcpy() per copiare la stringa. Ricordati di includere string.h.
Con il tuo codice, di fatto le etichette dei nodi non venivano
acquisite.
Se ci sono ulteriori problemi fatti risentire.
Buon lavoro.
-- 
Ciao,
    Giuseppe

 Buon lavoro.
grazie, tutto quanto funziona alla perfezione!
