Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - liste e co
Forum - C/C++ - liste e co

Avatar
frankus89 (Normal User)
Rookie


Messaggi: 23
Iscritto: 20/02/2009

Segnala al moderatore
Postato alle 23:21
Venerdì, 20/02/2009
salve a tutti!
ho scoperto questo bellissimo forum sulla programmazione e ho subito qualche domanda da fare.

devo scrivere un programma che consenta le normali funzioni di gestione di una lista, come l'inserimento di un elemento, la sua cancellazione o la ricerca di esso.

ecco quindi la parte di codice che dovrebbe servire alle mie domande:
Codice sorgente - presumibilmente C++

  1. struct EL {
  2.                 int n;
  3.                 struct EL *next;
  4.           }
  5. typedef struct EL elemList;
  6.  
  7. typedef elemList *listOfElem;



"*listOfElem" rappresenta una classe di puntatori che fanno riferimento a elemList??

Codice sorgente - presumibilmente C/C++

  1. int Elemento_in_lista(listOfElem list,int elem);



perchè per controllare se un elemento è in lista uso un semplice riferimento per parametro e non per indirizzo??

Codice sorgente - presumibilmente C/C++

  1. void Inizializza(listOfElem *list){
  2.                                         *list=NULL;



questo servirebbe ad inizializzare la lista a null, cioè a far puntare da "list" NULL??
quindi "list" è il puntatore che punta al primo elemento dopo la testa della lista??

ultima domanda:
per controllare se una lista è vuota o meno (cioè se è composta solo dalla sua testa), scrivo
Codice sorgente - presumibilmente Plain Text

  1. if(list==NULL)


o
Codice sorgente - presumibilmente Plain Text

  1. if(*list==NULL)


??

spero possiate darmi una risposta..contando su di voi, saluti.:)

PM Quote
Avatar
gioser (Normal User)
Pro


Messaggi: 111
Iscritto: 03/10/2008

Segnala al moderatore
Postato alle 4:01
Martedì, 24/02/2009
Testo quotato

Postato originariamente da frankus89:

Codice sorgente - presumibilmente C++

  1. struct EL {
  2.                 int n;
  3.                 struct EL *next;
  4.           }
  5. typedef struct EL elemList;
  6.  
  7. typedef elemList *listOfElem;



"*listOfElem" rappresenta una classe di puntatori che fanno riferimento a elemList??




listOfElem non è una classe. È un tipo definito dall'utente. Rappresenta un puntatore alla struttura EL.
Anche elemList è un tipo definito dall'utente. Sostanzialmente serve a evitare di scrivere "struct" tutte le volte :)

Testo quotato

Postato originariamente da frankus89:

Codice sorgente - presumibilmente C/C++

  1. int Elemento_in_lista(listOfElem list,int elem);



perchè per controllare se un elemento è in lista uso un semplice riferimento per parametro e non per indirizzo??




il parametro è di tipo listOfElem, che è un puntatore a EL.

Testo quotato

Postato originariamente da frankus89:

Codice sorgente - presumibilmente C/C++

  1. void Inizializza(listOfElem *list){
  2.                                         *list=NULL;



questo servirebbe ad inizializzare la lista a null, cioè a far puntare da "list" NULL??
quindi "list" è il puntatore che punta al primo elemento dopo la testa della lista??



list è un puntatore a un puntatore.
In C per permettere alle funzioni di modificare i parametri bisogna passarli per indirizzo.
Per modificare un puntatore bisogna passarne l'indirizzo, cioè un puntatore a un puntatore. :)

Testo quotato

Postato originariamente da frankus89:

ultima domanda:
per controllare se una lista è vuota o meno (cioè se è composta solo dalla sua testa), scrivo
Codice sorgente - presumibilmente Plain Text

  1. if(list==NULL)


o
Codice sorgente - presumibilmente Plain Text

  1. if(*list==NULL)


??

spero possiate darmi una risposta..contando su di voi, saluti.:)



se list è di tipo listOfElem, allora è un semplice puntatore e quindi devi usare

Codice sorgente - presumibilmente Plain Text

  1. if(list==NULL)




ciao :)

PM Quote
Avatar
frankus89 (Normal User)
Rookie


Messaggi: 23
Iscritto: 20/02/2009

Segnala al moderatore
Postato alle 10:23
Martedì, 24/02/2009
grazie 10000!! ho capito adesso!
olo che una domanda chiave mi "affligge"..
perchè usiamo un puntatore a puntatore per il primo elemento della lista, piuttosto che un semplice puntatore??
forse la risposta è nella precedente , ma io non l'ho capita..
grazie
saluti

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:32
Lunedì, 02/03/2009
il motivo è che per modificare il valore di una variabile passata come parametro bisogna passarla per indirizzo, ossia come puntatore, altrimenti verrebbe modificata localmente alla funzione e basta.

Nel tuo caso specifico ciò che fai non è altro che passare un puntatore ad una variabile di tipo listOfElem tutto qui. Il fatto che poi listOfElem sia a sua volta un puntatore e quindi risulti un puntatore a puntatore è per così una cosa relativa.

spero di essere stato chiaro

PM Quote