Precedente :: Successivo |
Autore |
Messaggio |
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 17 Feb 2014 10:46 Oggetto: |
|
|
ecco, si impara sempre qualcosa.
si vede che quando ho studiato io, gli alberi di questo tipo non erano ancora spuntati |
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 17 Feb 2014 17:08 Oggetto: |
|
|
evvaiiii funziona grazie SverX per il supporto che mi hai dato
Allora, il trie funziona, riesco a inserire e fare ricerche interattive digitando solo alcuni caratteri (se vuoi ti regalo il codice come regalo per il tuo aiuto ahaha )
A parte tutto mi hai dato una mano grandissima..non ho ancora finito
Devo mettere insieme le due parti
- ho lavorato sul file per isolare le varie stringhe
- ho creato il trie e le funzioni di inserimento e ricerca
Ora devo fare in modo di inserire tutti i dati del file all'interno del trie (o dei trie?)
Per fare le mie ricerche di Titoli e Argomenti ho bisogno di 2 strutture (cioè di un trie per i titoli e nel campo che contiene il titolo mettere anche tutti gli argomenti e di un trie per gli argomenti con analogo comportamento) oppure c'è un modo per utilizzarne uno solo?
Scusa se continuo ancora a stressarti ma sei l'unico che mi ha dato una mano ti sono debitrice |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 18 Feb 2014 10:59 Oggetto: |
|
|
probabilmente hai bisogno di due trie, uno per i titoli e uno per gli argomenti. In più direi che hai bisogno di qualcosa che colleghi i due, ovvero che colleghi ogni titolo ai suoi argomenti... e qui cosa scegliere dipende soprattutto dal senso in cui andrai a fare le ricerche, immagino... |
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 18 Feb 2014 14:09 Oggetto: |
|
|
La mia idea iniziale era quella di inserire in ciascuna foglia del trie relativo ai Titoli (ovviamente nelle foglie che mi rappresentano un percorso di lunghezza >0 e dunque a cui è associato un Titolo) una lista (o un array) di Argomenti e viceversa nel trie relativo agli argomenti inserire in ogni foglia una lista (o un array) contenente i Titoli..
che dici? può andare? |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 19 Feb 2014 15:36 Oggetto: |
|
|
penso funzioni... o potresti semplicemente inserire una lista di puntatori alle strutture dell'altro albero... |
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 21 Feb 2014 20:47 Oggetto: |
|
|
Ho finito Alla fine ho usato un trie di liste e ho fatto come ti avevo spiegato nel post precedente.
Io non so come ringraziarti, mi hai aiutata tantissimo e senza di te non ce l'avrei mai fatta
Un'ultima cosa poi chiudo: Devo creare un file .h in cui inserire tutte le strutture che ho definito e relative funzioni o posso lasciare tutto nel file .c?
E nel primo caso, nel file .h vanno inserite altre cose?
Grazie (spero sia l'ultimo disturbo che ti darò) |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 24 Feb 2014 09:35 Oggetto: |
|
|
i file .h sono fondamentali se nel tuo progetto userai più di un file .c solo, e quindi avrai delle definizioni che 'condividerai' tra i vari sorgenti, altrimenti non è per niente necessario (come hai detto funziona, no? )
detto che non è necessario, se vuoi comunque farlo fai pure. attenzione che nel file .h vanno messe solo definizioni (tipi, prototipi delle funzioni etc etc) e NON vanno messe le funzioni e le dichiarazioni di variabili.
|
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 19 Mar 2014 18:03 Oggetto: |
|
|
Rieccomi di nuovo. Scusami se riesumo questo topic ma avrei un piccolo quesito ancora sul progette di qualche tempo fa.
Mi rivolgo a te, SverX perchè tu mi hai aiutato l'ultima volta, ma ovviamente la richiesta di aiuto è estesa a tutti coloro che volessero gentilmente aiutarmi.
Il problema è questo..ho il mio trie in cui in ogni foglia vi è una lista contenente delle stringhe. Quando voglio inserire una nuova stringa, funziona tutto bene se uso l'inserimento in Coda, ma non funziona per nulla quando uso l'inserimento in Testa.
Essendo il mio un file di dimensioni notevoli, usare l'inserimento in Coda diventa troppo dispendioso e quindi sono costretta ad utilizzare l'inserimento in Testa.
Tuttavia quando uso quest'ultimo metodo e poi vado a fare una ricerca nel trie e stampo la lista corrispondente alla stringa cercata, ottengo soltanto la stringa che vi era prima dell'Inserisci in Testa.
E' come se il puntatore alla mia lista, puntasse in maniera fissa all'elemento che avevo prima di fare Inserisci In Testa e quindi tutti gli elementi che inserisco successivamente si perdono e non vi posso più accedere. Mentre con l'Inserisci In Coda li trovo perchè li inserisco dopo l'elemento al quale posso accedere.
Però non capisco come fare a risolvere. La funzione Inserisci In Testa è corretta, se applicata su una normale lista fa quello che deve fare, ma sul mio trie non va proprio.
Come posso risolvere?
Scusate se mi sono espressa male, probabilmente senza codice sotto mano per voi è difficile giudicare, ma se poteste darmi una mano ve ne sarei grata. Se vi servono ulteriori info o pezzi di codice ve li posso postare.
Grazie ancora a tutti |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 20 Mar 2014 12:05 Oggetto: |
|
|
Da come spieghi il malfunzionamento sembra che non aggiorni il puntatore all'inizio della lista... negli aggiornamenti in testa in effetti devi fare solo due cose (item è l'elemento, list la lista):
item.next=list;
list=&item;
vedi se per caso hai una funzione con qualche cosa passato per valore e non per indirizzo e quindi in effetti non stai facendo l'update...
|
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 20 Mar 2014 17:09 Oggetto: |
|
|
grazie per avermi risposto
allora..questa è la mia funzione InserisciInTesta
Codice: | void InserisciInTesta(ListaDiElementi *lista, char *string){
ListaDiElementi aux;
aux=malloc(sizeof(ElementoLista));
strcpy(aux->dato,string);
aux->succ=*lista;
*lista=aux;
}
|
E mi sembra che sia a posto. Dici di controllare se la funzione in cui la chiamo abbia gli argomenti che mi interssano passati per valore?
Ora controllo..nel frattempo..non ci sono errori nella mia funzione giusto? |
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 20 Mar 2014 17:17 Oggetto: |
|
|
Domanda da 1.000.000 $:
quando chiamo la funzione che vorrebbe inserire un elemento nella lista (che è in sostanza una foglia dell'albero) io faccio la ricerca di quella foglia che mi restituisce il puntatore ad essa.
Dopodichè vado a modificare la lista passando come argomento della mia funzione l'indirizzo della lista. Ma può bastare? O quando voglio modificare quel puntatore devo passare come argomento l'intero albero?
Grazie ancora:) |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 21 Mar 2014 10:10 Oggetto: |
|
|
non so perché ma la funzione non mi convince al 100%... però sono davvero un po' fuori allenamento...
... in sostanza, se 'lista' è un puntatore a ListaDiElementi, allora non dovrebbe essere:
Codice: | aux->succ=lista;
lista=aux; |
?
edit: sono andato a recuperare un pezzo di codice mio... direi che la differenza principale dalla tua è che il puntatore alla lista viene passato per indirizzo (vedi che uso **list ?), nella tua funzione invece per valore:
Codice: |
void item_Insert (struct item *item, struct item **list) {
// inserisce sempre in testa, tanto la lista non è ordinata
item->next = *list; // item è un puntatore, punta al campo next, che è un puntatore
// nel quale viene copiato il valore di list, che è un puntatore
*list = item; // list è un puntatore, passato per referenza, al quale si assegna il
// valore di item
} |
|
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 21 Mar 2014 16:19 Oggetto: |
|
|
edit: ho scritto una sciocchezza..ci ripenso e commento di nuovo:)
edit2: ok, ho capito cosa fai..anche se nel tuo caso hai già un nodo della lista e lo attacchi in cima, mentre io il mio nuovo nodo lo costruisco all'interno della funzione. E' corretto?
Il punto è sempre lo stesso però. Ho provato anche la tua versione ma non va. O meglio, se prendo una lista singolarmente entrambe le funzioni di inserimento in testa (la mia e la tua) funzionano. Ma quando vado ad applicarle alla lista che fa parte del mio albero, non la modifica..la foglia punta sempre allo stesso elemento della lista.
Ti scrivo il codice di come ho strutturato l'albero di liste:
Codice: | struct Nodo {
ListaDiElementi nodo; //ogni nodo è una lista di stringhe
struct Nodo *figlio[95]; //ASCII 128 caratteri (ma solo i 95 stampabili)
};
typedef struct Nodo NodoTrie;
typedef NodoTrie *Trie;
|
|
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 21 Mar 2014 17:10 Oggetto: |
|
|
sì, nel mio esempio l'item è già creato prima, ma questo non fa differenza... la vera differenza è che nel mio codice, io passo il puntatore alla lista tramite l'indirizzo (e quindi passo un puntatore al puntatore alla lista, per quello ci sono due * ). Nella chiamata, se head è il puntatore all'inizio della lista, io ovviamente passo &head
Ora che hai corretto la tua funzione, immagino aggiungendo l'asterisco mancante, così:
Codice: | void InserisciInTesta(ListaDiElementi **lista, char *string){
ListaDiElementi aux;
aux=malloc(sizeof(ElementoLista));
strcpy(aux->dato,string);
aux->succ=*lista;
*lista=aux;
} |
ti rimane da verificare cosa le passi quando la chiami. |
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 21 Mar 2014 17:16 Oggetto: |
|
|
forse tra i parametri della funzione che hai scritto ci va ElementoLista al posto di ListaDiElementi..comunque non va:( provo a cercare altrove l'errore..
edit: può essere che non va perchè la foglia dell'albero non è propriamente una lista ma un tipo strutturato che contiene un campo lista e un altro campo (che è un'array di puntatori)? |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11586 Residenza: Tokelau
|
Inviato: 21 Mar 2014 17:53 Oggetto: |
|
|
dovrebbe andare, ovviamente il puntatore che devi passare (per referenza) alla funzione di inserimento in testa non sarà il puntatore al tipo 'strutturato', ma un puntatore al campo lista, tipo in
Codice: | &struttura.campolista |
oppure
Codice: | &(puntatore_a_struttura->campolista) |
(le parentesi forse non sono strettamente necessarie ma io le metterei comunque ) |
|
Top |
|
|
kiara91 Mortale pio
Registrato: 31/01/14 17:56 Messaggi: 20
|
Inviato: 21 Mar 2014 19:21 Oggetto: |
|
|
Dovrei aver risolto. Quando volevo modificare la lista che mi interessava, mi facevo restituire da una funzione di ricerca il puntatore al primo elemento della lista, mentre a me serviva l'indirizzo del puntatore al primo elemento della lista.
Ora su un trie creato a parte funziona. Nel progetto originario c'è ancora un SegmentationFault ma non dovrebbe essere nulla di preoccupante.
Ti aggiorno appena trovo il baco
Per il momento ancora grazie grazie grazie <3 |
|
Top |
|
|
|