Problema inserimento in lista C

di il
3 risposte

Problema inserimento in lista C

Ragazzi sono nuovo nel forum. Spero di non violare nessuna regola con questo mio primo post.
Ho appena iniziato a maneggiare la gestione dinamica della memoria. Dopo aver studiato la teoria, volevo fare un piccolo programmino che permettesse all'utente di creare una lista di interi, con inserimento in cima, e che poi stampasse tutti gli elementi della lista. Il programma xò non riesce a stampare nulla. Ho inserito un controllo del valore assunto dal puntatore testa: non dovrebbe essere NULL, invece purtroppo è così. Vi prego aiutatemi a trovare l'errore, sono ore che provo a capire dove sbaglio !!!
#include <stdio.h>
#include <stdlib.h>

int main(void)
{

	typedef struct nodo_s{
			int num;
			struct nodo_s *prox;
			}nodo_t;

	void inserisci(nodo_t *a,int elemento)
	{
		nodo_t *nuovo;
		nuovo=(nodo_t *)malloc(sizeof(nodo_t));
		nuovo->num=elemento;
		nuovo->prox=a;
		a=nuovo;
	}
	int choice=1;
	int k;
	nodo_t *testa, *temp;
	testa=NULL;
	while(choice)
	{
		printf("Inserisci un elemento in lista\n");
		scanf("%d",&k);
		inserisci(testa,k);
		printf("Vuoi inseri un altro elemento ?\npremi 1 per si\npremi 0 per no\n");
		scanf("%d",&choice);	
	}
	printf("Ecco gli elementi inseriti in lista:\n");
	temp=testa;
	if(testa==NULL)
		printf("Errore");
	while(temp)
	{
		printf("%d - ",temp->num);
		temp=temp->prox;		
	}
	return 0;		
}

3 Risposte

  • Re: Problema inserimento in lista C

    Ciao megasors,
    per modificare il valore della testa, hai due posibilità o usi:
    
    void inserisci(nodo_t **a, int elemento)
    
    Nota il '**' in questo modo modifichi il puntatore (e non solo il valore puntato) oppure restituisci la nuova testa con:
    
    nodo_t * inserisci(nodo_t *a, int elemento)
    
    Ti posto il codice corretto con la seconda soluzione (nota: Il codice che hai postato era un poco pasticciato avevi messo la funzione 'inserisci' dentro il main).
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct nodo_s
    {
    	int num;
    	struct nodo_s *prox;
    } nodo_t;
    
    nodo_t * inserisci(nodo_t *a, int elemento)
    {
    	nodo_t *nuovo=(nodo_t *)malloc(sizeof(nodo_t));
    	nuovo->num=elemento;
    	nuovo->prox=a;
    	return nuovo;
    }
    
    int main(void)
    {
    	int choice=1;
    	nodo_t *testa = NULL;
    	while(choice)
    	{
    		int k;
    		printf("Inserisci un elemento in lista\n");
    		scanf("%d",&k);
    		testa = inserisci(testa,k);
    		printf("Vuoi inseri un altro elemento ?\npremi 1 per si\npremi 0 per no\n");
    		scanf("%d",&choice);   
    	}
    	printf("Ecco gli elementi inseriti in lista:\n");
    	nodo_t *temp=testa;
    	if(testa==NULL)
    		printf("Errore");
    	while(temp)
    	{
    		printf("%d - ",temp->num);
    		temp=temp->prox;      
    	}
    	return 0;      
    }
    
  • Re: Problema inserimento in lista C

    Grazie mille per la risposta. Il primo modo per l'inserimento in lista cioè
    nodo_t* inserisci(nodo_t *a, int num)
    l'ho capito e sembra piuttosto lineare.
    Per quanto riguarda il secondo modo, invece, cioè
    void inserisci(nodo_t **a,int num)
    ho qualche dubbio. La necessità di creare un doppio puntatore da dove deriva ? Deriva dal fatto che la testa della lista deve essere passata come riferimento e non come valore alla funzione ? Cioè, nonostante sia un puntatore, a sua volta deve essere passata attraverso un puntatore ? Scusatemi, probabilmente è banale come domanda, ma sono alle prime armi !!!
  • Re: Problema inserimento in lista C

    I doppi puntatori sono una brutta bestia, nell' antichità sopperivano alla mancanza del passaggio per indirizzo, tendenzialmente tendo ad evitarli. Comunque guarda questo esempio:
    
    #include <iostream>
    using namespace std;
    
    void SetPointer_1(int* p)
    {
    	p = (int*) 0x111111111;
    }
    
    void SetPointer_2(int*& p)
    {
    	p = (int*) 0x222222222;
    }
    
    void SetPointer_3(int** p)
    {
    	*p = (int*) 0x3333333333;
    }
    
    int main(void)
    {
    	int *p = (int*) 0x0000000;
    	cout << p << endl;
    
    	SetPointer_1(p); // questo non funziona p rimane inalterato
    	cout << p << endl;
    
    	SetPointer_2(p); // Ok
    	cout << p << endl;
    
    	SetPointer_3(&p); // Ok
    	cout << p << endl;
    
    	return 0;      
    }
    
    Nell' esempio non sto a fare le malloc ma assegno degli indirizzi di fantasia ai puntatori.
    Provalo e dimmi se ti è chiaro. Oltre a questi poi c' è il sistema (che hai già visto) di far restituire il valore alla funzione.
Devi accedere o registrarti per scrivere nel forum
3 risposte