Dubbio sulla struttura dati

di il
6 risposte

Dubbio sulla struttura dati

In realtà non ho ben capito una riga di un codice preso su internet sull'implementazione della struttura lista (il programma funziona correttamente).
quello che non capisco è la scrittura :
void stampaLista(struct elemento *);
void: vuol dire che non ritorna nessun valore
stampalista: è il nome della funzione
struct elemento * :rappresenta l'argomento di tipo struttura che ha definito sopra, ma perchè usa l'asterisco (*)? cosa intende con questa scrittura? quali sono i suoi usi?

altro dubbio è su questa riga:
struct elemento *creaLista();

perchè mette l'asterisco vicino alla funzione creaLista() ?

so che l'asterisco rappresenta un puntatore ma non ho capito in questo caso come lo usa.

posto per completezza l'intero codice:


// crea lista di n elementi
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>

struct elemento{
	int inf;	// valore
	struct elemento *pun; //puntatore elemento successivo
};

struct elemento *creaLista();
void stampaLista(struct elemento *);

int main(){
	struct elemento *lista;
	lista=creaLista();
	stampaLista(lista);
	return 0;
}

struct elemento *creaLista(){
	struct elemento *p,*punt;
	int i,n,K;
	printf("specificare numero elementi ");
	K=scanf("%d",&n);
	if (n==0){
		p=NULL; // Lista vuota
	}else{
		p=(struct elemento *)malloc(sizeof(struct elemento));
		printf("inserisci elemento ");
		K=scanf("%d",&p->inf);
		punt=p;
		for (i=2;i<=n;i++){
			punt->pun=(struct elemento *)malloc(sizeof(struct elemento));
			punt=punt->pun;
			printf("inserisci elemento: ");
			K=scanf("%d",&punt->inf);			
		}
		punt->pun=NULL; //marcatore fine lista
	}
	return (p);	
}

void stampaLista(struct elemento *p){
	printf("lista: ");
	while (p!=NULL){
		printf("%d",p->inf);
		printf("->");
		p=p->pun; // scorre elemento
	}
	printf("NULL \n");
}
grazie in anticipo

6 Risposte

  • Re: Dubbio sulla struttura dati

    void stampaLista(struct elemento *p)
    La lista è gestita con i puntatori e un puntatore ad una struttura di tipo elemento si raggiunge proprio con la sua notazione *p.

    Essendo p un puntatore si può raggiungere l'elemento puntato da p e poi col p-> posso raggiungere gli elementi delle struttura da lui puntata. Un elemento interessante è p->pun che fa si che p raggiunga il prossimo elemento nella lista. Pensalo come delle scatole legate col filo una coll'altra. p rappresenta la posizione in cui mi trovo adesso (la scatola attuale) e p->pun mi fa andare alla scatola successiva.

    Stesso discorso per
    
    struct elemento *creaLista()
    Questa mi fa tornare un puntatore di tipo elemento che punterà alla prima ed unica scatola creata in questo momento.
  • Re: Dubbio sulla struttura dati

    Scatole ...
  • Re: Dubbio sulla struttura dati

    Thnx, corretto.
  • Re: Dubbio sulla struttura dati

    Allora intanto grazie per le risposte!
    ho provato a implementare da zero la struttura lista (cercando di cambiare qualcosa) ma mi da errore di segmentazione e non ho capito bene perché.
    
    
    // creazione lista
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    struct SNode{	// struttura che contiene :
    	int value;  // informazioni sul nodo
    	struct SNode *next; // puntatore al nodo successivo
    };
    
    typedef struct SNode TNode; //definito tipo di dato di nome TNode
    
    TNode** creaLista();
    TNode** insert(TNode **lista,int elem,TNode **inizio);
    void stampa(TNode **lista,TNode **inizio);
    
    int main(){
    	TNode **lista,**inizio; // puntatore a puntatore di nodi 
    	int scan,n,elem,i;
    	lista=creaLista();// puntatore punta a NULL 
    	printf("quanti elementi vuoi insierire? ");
    	scan=scanf("%d \n",&n); // numeri elementi da inserire
    	for (i=0;i<n;i++){
    		elem=i;	// per prova prendo elementi = i
    		lista=insert(lista,elem,inizio); // inserisco elem in lista
    	}
    	printf("puntatore è: %d", (*lista)->value);
    	stampa(lista,inizio);
    	return 0;
    }
    
    TNode** creaLista(){
    	return NULL;
    }
    
    TNode** insert(TNode **lista,int elem,TNode **inizio){
    	TNode *newNode;
    	newNode=(TNode *)malloc(sizeof(TNode)); //alloca spazio per nodo
    	if (lista==NULL){
    		newNode->value=elem; // nuovo nodo ha valore elem
    		newNode->next=NULL; // imposto puntatore successivo a NULL
    		lista=&(newNode); //puntatore lista: punta a nodo successivo
    		inizio=&(newNode); // inizio punta al primo elem
    		printf("puntatore è: %d", (*lista)->value);
    	}else{
    		newNode->value=elem; // nuovo nodo ha valore elem
    		newNode->next=NULL; // imposto puntatore successivo a NULL
    		(*lista)->next=(newNode); //puntatore lista: punta a nodo successivo
    		printf("puntatore è dopo f: %d", (*lista)->value);
    	}
    	return lista;
    }
    
    void stampa(TNode **lista,TNode **inizio){
    	if (lista==NULL){
    		printf("lista vuota \n");
    	}else{
    		while ((*inizio)->next!=NULL){ // fino a che un nodo non punta a NULL stampo valore dei nodi
    			printf("--> %d \n",(*lista)->value);
    			inizio=&((*lista)->next);
    		}
    	}		
    }
    
    
    
    ho cercato di commentare anche il codice in modo che per voi fosse più facile capire ciò che intendevo fare.
  • Re: Dubbio sulla struttura dati

    Sinceramente tutti quei puntatori mi hanno creato un bel po' di confusione

    Per rendere il codice più comprensibile e più semplice ( anche per te ) ti consiglio di usare i puntatori singoli e di "passarli" alle funzioni tramite l'operatore &.
  • Re: Dubbio sulla struttura dati

    Si in effetti ho fatto cosi e sono riuscito a corregge!
Devi accedere o registrarti per scrivere nel forum
6 risposte