Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C] - creare lista concatenata con puntatore doppio

    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.
    codice:
    /*
    ** 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.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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:
    codice:
    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
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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

    codice:
    Prodotto_t *lista;
    e quindi

    codice:
    inizialista( &lista) ;
    e

    codice:
    buyprodotto( &lista, np, quantita );
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    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?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    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).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.