LISTA DINAMICA DA UN ARRAY DI INTERI (LINGUAGGIO C)

di il
3 risposte

LISTA DINAMICA DA UN ARRAY DI INTERI (LINGUAGGIO C)

Buongiorno a tutti,
non capisco cosa ci sia di sbagliato in questa funzione (linguaggio C).
La funzione dovrebbe prendere i primi n valori dell'array v e trasferirli in una lista dinamica.
Allego anche definizione dei nodi e dei puntatori a nodo per maggiore chiarezza.

Ringrazio tutti i membri per la cortese attenzione.

PAS
typedef struct N {
int val;
struct N *next;
} Node;

typedef Node *Ptr_node;

Ptr_node list_from_array(int v[], int n)
{
  int i;
  Ptr_node list;
  list=(Ptr_node)malloc(sizeof(Node));
  if(list)
  {
    for(i=0;i<n;i++)
    {
      list->val=v[i];
      list->next=(Ptr_node)malloc(sizeof(Node));
      list=list->next;
    }
    return list;
  }
  else {
    printf("Errore");
    return NULL;
  }

3 Risposte

  • Re: LISTA DINAMICA DA UN ARRAY DI INTERI (LINGUAGGIO C)

    AccaDiHotel17 ha scritto:


    non capisco cosa ci sia di sbagliato in questa funzione (linguaggio C).
    Ciao, in realtà ci sono vari problemi:
    - la funzione dovrebbe ritornare la testa della lista, non la coda;
    - nella funzione vai a creare n+1 nodi, n all'interno del for e 1 all'esterno;
    - una lista è caratterizzata dal fatto che l'ultimo elemento, la coda, debba puntare a NULL, ma nella funzione questo passaggio è assente.

    Detto ciò, volendo mantenere quell'impostazione, potresti fare qualcosa del genere:
    Ptr_node list_from_array(int v[], int n)
    {
        Ptr_node head = (Ptr_node)malloc(sizeof(Node));
        Ptr_node temp = head;
        for(unsigned int i = 0; i < n; ++i)
        {
            temp->val = v[i];
            temp->next = (i == n - 1) ? NULL : (Ptr_node)malloc(sizeof(Node));
            temp = temp->next;
        }
        return head;
    }
    In ogni caso il mio consiglio è di implementare delle generiche funzioni aggiungi_in_testa() e aggiungi_in_coda() che poi potrai utilizzare anche per list_from_array().


    P.S.
    Magari è solo una questione di gusti ed abitudine, ma il
    typedef Node *Ptr_node;
    lo eviterei.
  • Re: LISTA DINAMICA DA UN ARRAY DI INTERI (LINGUAGGIO C)

    Ecco, credo che il problema più grande fosse la mancanza del NULL in coda, infatti mi dava un errore di segmentazione.
    Grazie mille!

    P.S. Uso la dichiarazione del puntatore al nodo per evitare di scrivere ogni volta "struct" e rendere il programma un po' più leggibile, ma come ha detto lei è questione di gusti
  • Re: LISTA DINAMICA DA UN ARRAY DI INTERI (LINGUAGGIO C)

    AccaDiHotel17 ha scritto:


    Ecco, credo che il problema più grande fosse la mancanza del NULL in coda, infatti mi dava un errore di segmentazione.
    Grazie mille!
    Di niente, ma anche gli altri due problemi che ti ho indicato impedivano il corretto funzionamento del programma.

    AccaDiHotel17 ha scritto:


    P.S. Uso la dichiarazione del puntatore al nodo per evitare di scrivere ogni volta "struct" e rendere il programma un po' più leggibile, ma come ha detto lei è questione di gusti
    Non mi riferivo al primo typedef, ma al secondo.
Devi accedere o registrarti per scrivere nel forum
3 risposte