Chiarimenti liste linkate in C

di il
4 risposte

Chiarimenti liste linkate in C

Salve a tutti vorrei che qualcuno mi aiutasse a chiarire dei dubbi circa le liste linkate.
struct elemento *InserisciElementoInLista(struct elemento *puntLista, char parolaDaInserire[])
int main(void) {....
printf("Dammi la parola da inserire: ");
    scanf("%s", parola);
    lista = InserisciElementoInLista(lista, parola);
    VisualizzaLista(lista);
void InserisciElementoInLista(struct elemento **puntLista, char parolaDaInserire[]) 
int main(void) {.....
printf("Dammi la parola da inserire: ");
    scanf("%s", parola);
    InserisciElementoInLista(&lista, parola);
    VisualizzaLista(lista);]
ho riportato sopra due pezzi di codice della funzione inserisci in lista.Il mio professore dice che nel primo caso si utilizza il passaggio di parametri per valore e nel secondo caso invece si tratta di passaggio di parametri per riferimento, su ciò ho qualche dubbio perchè pensavo che anche nel primo caso fosse un passaggio di parametri per riferimento mi aiutereste a capire qualcosa in più?grazie anticipatamente

4 Risposte

  • Re: Chiarimenti liste linkate in C

    Ciao bio90,
    Anche se la cosa ti sembra strana l'indirizzo che passi nella prima funzione è il puntatore al primo elemento della lista. E' analogo a qualsiasi altra variabile il cui valore è l'indirizzo.
    Se cambi il puntatore localmente non perdi il puntatore originale.
    Ti faccio un esempio:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void foo (int *p)
    {
      printf ("foo --> p=%p\n",p); // PUNTO ALLO STESSO INDIRIZZO
      p=NULL;; // .. MA SONO LOCALE 
    }
    
    int main ()
    {
      int *p;
      if ((p=malloc (10*sizeof(int)))==NULL)
      {
        perror ("malloc");
        return -1;
      }
      printf ("MAIN --> p=%p\n",p);
      foo (p);
      printf ("MAIN --> p=%p\n",p);
      
      free (p);
      return 0;
    }
    
  • Re: Chiarimenti liste linkate in C

    Questa è una raffigurazione molto superficiale di quello che succede in memoria. Credo possa essere utile per comprendere meglio ulteriori situazioni.


    Non sono una cima nel disegno, STACK e HEAP possono essere invertiti ma la logica è questa Non è difficile capire la differenza tra i due esempi che hai proposto
  • Re: Chiarimenti liste linkate in C

    Nel secondo caso invece passo l'indirizzo ad un puntatore al primo elemento della lista vero? grazie credo che adesso mi sia tutto più chiaro Posso farti un'altra domanda? qual è il vantaggio nell'implementare una lista con il secondo metodo piuttosto che con il primo? non so se mi sono spiegato bene
  • Re: Chiarimenti liste linkate in C

    Nel caso di inserimento in lista non c'è differenza nel 'consumo' di memoria passata come argomento. L'unico vantaggio del secondo metodo è che si può modificare l'indirizzo direttamente, cosa che nel primo caso deve esser fatta in restituendo (con return) e riassegnando il nuovo indirizzo.

    Il primo metodo è utile per non 'perdere' il puntamento originale. Per esempio una funzione di visualizzazione scorre la lista senza preoccuparsi di salvare il puntatore al primo elemento che rimane nello STACK del chiamante.

    Riassumendo il secondo metodo punta alla variabile locale del MAIN che a sua volta punta all'HEAP. Mentre nel primo caso abbiamo una copia del puntamento all'HEAP.

    edit:
    Nel secondo caso invece passo l'indirizzo ad un puntatore al primo elemento della lista vero?
    No, passi l'indirizzo della variabile locale main.

Devi accedere o registrarti per scrivere nel forum
4 risposte