Visualizza la versione completa : [C] Creare lista concatenata con puntatore doppio
tigerjack89
23-02-2012, 15:54
Abbiamo un tipo Prodotto_t che contiene informazioni sui prodotti di un supermercato. Ogni Prodotto_t è pensato per far parte di una lista; contiene quindi un riferimento al nodo successivo.
Per creare la lista di prodotti utilizzo un doppio puntatore a Prodotto_t.
Il mio dubbio è su queste due funzioni: è giusto procedere in questo modo? E' sensato creare un doppio puntatore che sarà la lista dei nostri prodotti e poi aggiungervi un prodotto.
/*
** Inizializza il primo elemento della lista a NULL.
*/
void inizialista(Prodotto_t **lista)
{
*lista = NULL;
}
/*
** Acquista quantita elementi di product e li inserisce nella lista.
** Restituisce errore se il prodotto non è valido o la quantità inserita è minore
** di zero.
*/
void buyprodotto(Prodotto_t **list, Prodotto_t *product, int quantita)
{
if (quantita <= 0)
{
fprintf(stderr, "addprodotto: Quantita non valida\n");
return;
}
if (product == NULL)
{
fprintf(stderr, "addprodotto: Prodotto non valido\n");
return;
}
//Definisco la quanttà di prodotto da aggiungere
product->quantita = quantita;
Prodotto_t *current;
if (*list == NULL)
{
*list = product;
}
else
{
current = *list;
while ( current != NULL && current->codice != product->codice)
current = current->next;
if (current == NULL) //arrivati alla fine della lista, prodotto non ancora presente
current = product;
else //trovato prodotto con lo stesso codice
current->quantita += product->quantita;
}
}
Grazie mille a tutti epr l'aiuto.
E' "genericamente" giusto ... perché non dovrebbe esserlo?
Non hai un problema particolare e continui ad aprire questi thread ... prima o poi qualche moderatore te lo farà notare ...
tigerjack89
23-02-2012, 16:04
Originariamente inviato da oregon
E' "genericamente" giusto ... perché non dovrebbe esserlo?
Non hai un problema particolare e continui ad aprire questi thread ... prima o poi qualche moderatore te lo farà notare ...
Stavo per specificare anche che ho un problema, mi hai bruciato sul tempo.
In ogni caso, quando invoco le diverse funzioni dal main, il programma va in segmentation fault (quando mai no).
Allego le parti principali del main, l'intero main sarebbe troppo lungo. Ecco qua:
int main()
{
[...]
Prodotto_t *np;
Prodotto_t **lista;
[...]
inizialista(lista);
[...]//La funzione creaprodotto crea un nuovo prodotto e restituisce un puntatore a Prodotto_t
np = creaprodotto(nome, codice, tipo, prezzoacq, prezzoven, scadenza);
[...]
buyprodotto(lista, np, quantita); //qui il programma va in fault
}
Allora non partire con un post che non c'entra nulla e fai direttamente la domanda presentando il problema.
Problema che sta nel main, dato che deve essere
Prodotto_t *lista;
e quindi
inizialista( &lista) ;
e
buyprodotto( &lista, np, quantita );
tigerjack89
23-02-2012, 16:21
Originariamente inviato da oregon
...
Grazie mille per il tuo aiuto, anche se il post non è dei migliori hai risolto il mio problema :)
Comunque, tornando al programma, come mai è sbagliato creare un Prodotto_t **lista e passarlo come parametro?
E' sbagliato perché tu devi lavorare con un puntatore alla lista.
E' solo per permettere di modificare il puntatore che lo passi come doppio puntatore, ma NON parti da un doppio puntatore.
E' come dire che lavori con un numero intero ma per modificarlo lo passi per puntatore alle funzioni. Ma il tuo dato rimane un int nel main.
tigerjack89
23-02-2012, 16:32
Originariamente inviato da oregon
E' sbagliato perché tu devi lavorare con un puntatore alla lista.
E' solo per permettere di modificare il puntatore che lo passi come doppio puntatore, ma NON parti da un doppio puntatore.
E' come dire che lavori con un numero intero ma per modificarlo lo passi per puntatore alle funzioni. Ma il tuo dato rimane un int nel main.
Mmm. Come dicevo, sono una frana coi puntatori. Davvero non mi entrano ancora completamente in testa, soprattutto quando si inizia a parlare di puntatori di puntatori.
Correggimi se sbaglio:
Prodotto_t *np è un puntatore. Passando np come parametro a una funzione f(), la f lo tratterà come puntatore e potrà modificarlo
Prodotto_t **lista è un puntatore di puntatori. Per modificarlo, a questo punto, non basta passare direttamente lista alla funzione, perchè non passerebbe l'indirizzo del puntatore, ma solo l'elemento puntato. Per questo è necessario procedere come da te descritto.
Qualcosa l'ho capita o sono proprio fuori strada?
Originariamente inviato da tigerjack89
Prodotto_t *np è un puntatore. Passando np come parametro a una funzione f(), la f lo tratterà come puntatore e potrà modificarlo
Potrà modificarlo ... cosa?
Prodotto_t **lista è un puntatore di puntatori.
E' un puntatore a puntatore, non di puntatori.
tigerjack89
23-02-2012, 16:44
Originariamente inviato da oregon
Potrà modificarlo ... cosa?
l'elemento puntato dal puntatore, in questo caso un elemento del tipo Prodotto_t
E' un puntatore a puntatore, non di puntatori.
Giusto :)
Originariamente inviato da tigerjack89
Mmm. Come dicevo, sono una frana coi puntatori. Davvero non mi entrano ancora completamente in testa, soprattutto quando si inizia a parlare di puntatori di puntatori.
Però a questo punto conviene documentarsi prima ancora di iniziare a cimentarsi con qualcosa che non si conosce un minimo, altrimenti queste discussioni finiscono per essere un chiacchiericcio che, partendo da un problema generale, in realtà ne trattano uno specifico (un errore) dovuto a un uso improprio di un elemento su cui poi si snocciola l'intero thread.
In questo modo, gestire la discussione diventa impossibile, e non è nemmeno utile a nessuno perché parla di tutto o niente, in modo disordinato.
Invito a suddividere problemi più grossi in parti più piccole, ad affrontarli singolarmente dopo essersi adeguatamente documentati in proposito (in caso di dubbi, il forum è a disposizione, purché si parli di una cosa per volta e in modo organico).