Newsgroup: it.comp.lang.c++
Titolo: Problema con un grafo concettuale

Ciao a tutti,
avrei un problema con un grafo concettuale in c++.
Ho una lista di strutture di questo tipo:
typedef struct Conceptual
{ char* Name;		//Rappresenta la parola da mettere nel grafo
   Conceptual* Next;
   Conceptual()
   {Next=NULL;
    Name=NULL;
    }
};
Se ho una parola che si collega a più parole come mi conviene definire i  
collegamenti? (Non posso sapere cmq a priori il numero di collegamenti che  
ci sono tra una parola e le altre.)
Io pensavo di creare una variabile univoca per ogni parola e creare una  
matrice allocata dinamicamente dove indico i vari collegamenti.
Si può fare in un qualche altro modo, come ad esempio una serie di  
puntatori all'interno della lista di strutture che puntano alle varie  
parole?
Grazie
Daniele
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/m2/

 matrice allocata dinamicamente dove indico i vari collegamenti.
Esiste std::vector, usa quello al posto di una matrice allocata 
dinamicamente.
Anyway: cos'e' un grafo concettuale?
-- 
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

 parole?
Che ne dici di una lista (magari ordinati) di elementi Conceptual? Cioč
intendo qualcosa del genere:
il vocabolario č rappresentato da una lista di strutture di tipo Conceptual:
std::list<Conceptual> Vocabolario
Ogni elemento della lista č cosě formato:
typedef struct Conceptual
{ char* Name; //Rappresenta la parola da mettere nel grafo
   //Conceptual* Next; >>eliminato: con una std:.list non hai piů bisogno di
allocare esplicitamente il puntatore alla parola successiva del vocabolario
    std::list<Conceptual*> listaConcetti; //lista dei concetti "adiacenti"
alla parola nel grafo
   Conceptual()
   {
     Name=NULL;
    }
};
listaConcetti non č altro che una lista di puntatori che puntano ad altri
elementi del vocabolario.
Se possibile perň cerca di pensare il tutto piů ad oggetti, cioč per esempio
che ne diresti di una classe "Dizionario" composta dall'attributo
"Vocabolario" e su cui puoi fare una serie di operazioni come
inserisciParola(..), inserisciConcetto(..) ecc. e di una classe "Conceptual"
che di fatto sostituisce la tua struttura?
Ciao
Andrea

 };
-- 



-- 


 wrote in message
news:opsbd84m...@localhost.localdomain...


 [CUT]
Un piccolo appunto che ti faccio riguardo a std::vector e std::list, e 
che forse e' quello che ti sfugge, e' che entrambe sono strutture che 
possono variare la loro capacita' nel tempo. Questo ti solleva dalla 
necessita' di lavorare con puntatori e similia per realizzare liste 
linkate, doppio linkate, etc...
In generale, e' sempre buona cosa non reinventare la ruota, e quindi 
utilizzare quello che c'e' gia' nella libreria standard.


Utilizzo già le librerie Boost per gestire il grafo.
Grazie lo stesso
Daniele

 ha scritto nel messaggio
news:opsbfgon...@localhost.localdomain...
Una std::list ha tutte le operazioni che ti servono e funziona
concettualmente come una vera e propria lista di nodi (col puntatore Next
per intenderci), non ha un numero limitato di nodi, ma teoricamente
illimitato (è dinamica proprio come una vera e propria lista).
La listaConcetti è una lista di puntatori ad elementi Conceptual che sono
interni alla lista vera e propria (Vocabolario).
Supponi per esempio di avere la parola "albero" all'interno di Vocabolario,
all' interno della listaConcetti corrispondente si avranno magari due
puntatori uno che punta alla parola "foglie" e uno che punta alla parola
"rami" (i puntatori puntano ancora a due elementi di Vocabolario, ossia hai
un vero e proprio grafo).
Per inserire una parola (nodo) all'interno del Vocabolario (lista), ti basta
fare Vocabolario.push_back("albero"); per inserire invece un riferimento
della parola "albero" alla parola "foglie", potresti fare  :
Conceptual* parolaRif ;
std::list<Conceptual>::iterator p = Vocabolario.begin();
while (p!= Vocabolario.end())  //ricerca la parola "foglie" nella lista
    if ((*p).Name == "foglie") {
            parolaRif = p; //estrae il puntatore alla parola "foglie"
            break;
    }
if (p!= Vocabolario.end()) {
    inserisciConcetto("albero",parolaRif); //in pratica esegue un
push_back(parolaRif) nella listaConcetti di "albero"
}
(perdona eventuali errori, l'ho scritto velocemente)
Guardati bene come funzionano le std::list (modifica se possibile anche
char*Name in std::string, ti consentirà di usare l'operatore ==).
http://www.cppreference.com/cpplist.html
http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=91