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