Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Aiuto linguaggio C
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 17 Feb 2014 10:46    Oggetto: Rispondi citando

Shocked ecco, si impara sempre qualcosa.

si vede che quando ho studiato io, gli alberi di questo tipo non erano ancora spuntati Laughing Laughing Laughing
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 17 Feb 2014 17:08    Oggetto: Rispondi citando

evvaiiii funziona Very Happy 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 Very Happy )

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 Sad ti sono debitrice
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 18 Feb 2014 10:59    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 18 Feb 2014 14:09    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 19 Feb 2014 15:36    Oggetto: Rispondi citando

penso funzioni... o potresti semplicemente inserire una lista di puntatori alle strutture dell'altro albero...
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 21 Feb 2014 20:47    Oggetto: Rispondi citando

Ho finito Smile 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 Embarassed Squeeze Squeeze

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ò) Smile
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 24 Feb 2014 09:35    Oggetto: Rispondi citando

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? Smile )

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.

Ciao
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 19 Mar 2014 18:03    Oggetto: Rispondi citando

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 Embarassed
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 20 Mar 2014 12:05    Oggetto: Rispondi citando

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...

Ciao
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 20 Mar 2014 17:09    Oggetto: Rispondi citando

grazie per avermi risposto Smile

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
Profilo Invia messaggio privato
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 20 Mar 2014 17:17    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 21 Mar 2014 10:10    Oggetto: Rispondi citando

non so perché ma la funzione non mi convince al 100%... però sono davvero un po' fuori allenamento... Rolling Eyes
... 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
}


Ciao
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 21 Mar 2014 16:19    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 21 Mar 2014 17:10    Oggetto: Rispondi citando

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 Smile

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
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 21 Mar 2014 17:16    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11559
Residenza: Tokelau

MessaggioInviato: 21 Mar 2014 17:53    Oggetto: Rispondi citando

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 Wink )
Top
Profilo Invia messaggio privato HomePage
kiara91
Mortale pio
Mortale pio


Registrato: 31/01/14 17:56
Messaggi: 20

MessaggioInviato: 21 Mar 2014 19:21    Oggetto: Rispondi

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 Embarassed

Per il momento ancora grazie grazie grazie <3
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Vai a Precedente  1, 2
Pagina 2 di 2

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi