Liste

di Spark il
17 risposte
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

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

    Nodo *puntcorrente = l;
  • 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;
    }
  • Ma lo hai compilato? Provato?
  • Si, mi stampa questo:

    Inserimento in testa:
    elemento corrente> 4
    elemento corrente> 3
    elemento corrente> 2
    elemento corrente> 1
    Premere un tasto per continuare . . .
  • Quindi nessun problema?
  • 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?
  • 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)
  • 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.
  • 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.
  • 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
  • Forse tu non hai chiara la struttura della lista e come funzionano i puntatori.
  • Ma quando viene incrementato l'indice della lista?
  • Non c'è un incremento, non sono adiacenti gli indirizzi.

    Ti serve un libro...
  • 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