Liste

di il
17 risposte

Liste

Salve, ho realizzato questo programma funzionante sulle liste:
#include <stdio.h>
#include <stdlib.h>

typedef struct Nodo{
	int dato;
	struct Nodo *prox;
}Nodo;

typedef Nodo *Lista;

Lista Inizializza();
//funzione che inizializza una lista ponendola uguale a NULL
Lista InserimentoInTesta(Lista l, int e);
//funzione che inserisce in testa alla lista (prima posizione) un nuovo nodo di dati "e"
void StampaLista(Lista l);
//stampa a video il contenuto di una lista

int main(void){
	Lista l;
	int a = 1;
	int b = 2;
	int c = 3;
	int d = 4;

	l = Inizializza();
	printf("Inserimento in testa:\n");
	l = InserimentoInTesta(l, a);
	l = InserimentoInTesta(l, b);
	l = InserimentoInTesta(l, c);
	l = InserimentoInTesta(l, d);
	StampaLista(l);


	system("pause");
	return 0;
}

Lista Inizializza(){
	return NULL;
}

Lista InserimentoInTesta(Lista l, int e){
	//creo un nodo, lo alloco, inserisco il dato e lo faccio puntare al primo nodo della lista
	//in questo modo il nuovo nodo è adesso il primo elemento
	Nodo *temp;
	temp = malloc (sizeof(Nodo));
	temp->dato = e;
	temp->prox = l;

	return temp;
}

void StampaLista(Lista l){
	Nodo *puntcorrente = l;
	while (puntcorrente != NULL){
		printf("elemento corrente> %d\n",puntcorrente->dato);
		puntcorrente = puntcorrente->prox;
	}
}

Però non ho ben capito come fa a funzionare, in quanto nella stampa vado a creare la variabile locale Nodo *puntcorrente, e non capisco come faccia a puntare al nodo successivo attraverso l'assegnazione puntcorrente = puntcorrente->prox;
prox che valore assume?
Grazie.

17 Risposte

  • Re: Liste

    No, non può funzionare. Non può neanche compilare se non assegni il parametro in ingresso

    Nodo *puntcorrente = l;
  • Re: Liste

    Ho aggiunto l'assegnazione
    Nodo *puntcorrente = l;
    Che altro va corretto?
    In questa funzione sto assegnando temp->prox = l; , è giusto?
    Lista InserimentoInTesta(Lista l, int e){
    	//creo un nodo, lo alloco, inserisco il dato e lo faccio puntare al primo nodo della lista
    	//in questo modo il nuovo nodo è adesso il primo elemento
    	Nodo *temp;
    	temp = malloc (sizeof(Nodo));
    	temp->dato = e;
    	temp->prox = l;
    
    	return temp;
    }
  • Re: Liste

    Ma lo hai compilato? Provato?
  • Re: Liste

    Si, mi stampa questo:

    Inserimento in testa:
    elemento corrente> 4
    elemento corrente> 3
    elemento corrente> 2
    elemento corrente> 1
    Premere un tasto per continuare . . .
  • Re: Liste

    Quindi nessun problema?
  • Re: Liste

    Nessun problema, ma non ho capito perchè mi funziona:
    In questa funzione:
    Lista InserimentoInTesta(Lista l, int e){
    	//creo un nodo, lo alloco, inserisco il dato e lo faccio puntare al primo nodo della lista
    	//in questo modo il nuovo nodo è adesso il primo elemento
    	Nodo *temp;
    	temp = malloc (sizeof(Nodo));
    	temp->dato = e;
    	temp->prox = l;
    
    	return temp;
    }
    è giusta questa assegnazione? temp->prox = l;
    Così sto assengando a prox il puntatore l, ma non dovrei assegnare il puntatore della struttura successiva?
  • Re: Liste

    Infatti tecnicamente stai facendo un "push" che è appunto un inserimento in testa, sei vuoi fare il "push_back" o inserimento in coda documentati (sui vecchi thread o su un motore di ricerca)
  • Re: Liste

    Spark ha scritto:


    Così sto assengando a prox il puntatore l, ma non dovrei assegnare il puntatore della struttura successiva?
    Per l'ins in testa va bene. Non capisco il tuo problema.
  • Re: Liste

    Quello che non capisco è il perchè non vada in loop questa funzione:
    
    void StampaLista(Lista l){
    	Nodo *puntcorrente = l;
    	while (puntcorrente != NULL){
    		printf("elemento corrente> %d\n",puntcorrente->dato);
    		puntcorrente = puntcorrente->prox;
    	}
    }
    
    Questa assegnazione va ad assegnare a puntcorrente il valore di prox che dovrebbe corrispondere sempre all'indirizzo del primo nodo.
  • Re: Liste

    Ma cosa stai dicendo? In testa c'è il nodo col 4. Nella penultima riga della funzione dove l'hai creato (InserimentoInTesta) l'hai fatto puntare al nodo dove c'è il 3. puntcorrente segue la catena degli indirizzi fino a quando arriva a zero
  • Re: Liste

    Forse tu non hai chiara la struttura della lista e come funzionano i puntatori.
  • Re: Liste

    Ma quando viene incrementato l'indice della lista?
  • Re: Liste

    Non c'è un incremento, non sono adiacenti gli indirizzi.

    Ti serve un libro...
  • Re: Liste

    Spark ha scritto:


    Ma quando viene incrementato l'indice della lista?
    "Indice" della lista?

    Non c'è un indice.

    Come ti dicevo, non hai chiara la struttura e i puntatori. Con calma, rivedi questi argomenti.
Devi accedere o registrarti per scrivere nel forum
17 risposte