Precedente :: Successivo |
Autore |
Messaggio |
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: 11566 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: 11566 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: 11566 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 |
|
|
|