[C] Inserimento in coda

Messaggioda desterix95 » 26/06/2017, 18:26

Buonasera, vorrei sapere: come mai in questa funzione dell'inserimento in coda si utilizza il doppio puntatore e non il semplice puntatore? Perchè $text(*ptrptr)$ punta il primo elemento di $text(*next_ptr)$ e in particolare il suo primo elemento?
Codice:
struct list {
   float value;
   struct list *next_ptr;
};

void suf_insert(struct list **ptrptr, float v) {
   while (*ptrptr != NULL) {
      ptrptr = &((*ptrptr)->next_ptr);
   }
   pre_insert(ptrptr, v);
}

Grazie
desterix95
Junior Member
Junior Member
 
Messaggio: 66 di 222
Iscritto il: 10/07/2015, 14:37

Re: [C] Inserimento in coda

Messaggioda apatriarca » 26/06/2017, 18:28

Perché nel caso in cui sia ptrptr == NULL, il puntatore va modificato in modo che contenga il nuovo nodo.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4698 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Inserimento in coda

Messaggioda apatriarca » 26/06/2017, 18:49

Esiste una implementazione alternativa delle liste in cui, invece di usare un valore uguale a NULL per le definire la fine della lista si usa un nodo particolare. Perché sia possibile farlo è tuttavia necessario fare uso di una struttura separata che definisca la lista. L'implementazione di molte funzioni diventa più semplice perché spariscono alcuni casi particolari da gestire separatamente (come il primo o l'ultimo elemento della lista).
Codice:
struct list_node {
    float value;
    struct list *next;
};

struct list {
    struct list_node ROOT;
};

void list_init(struct list *lst) {
    lst->ROOT->next = &(lst->ROOT);
}

/* Ogni lista ha almeno un nodo per cui non c'è alcun caso particolare */
void list_insert(struct list_node *n, float v) {
    struct list_node *new_node = malloc(sizeof(struct list_node));
    new_node->value = v;
    new_node->next = n->next;
    n->next = new_node;
}

void pre_insert(struct list *lst, float v) {
    return list_insert(lst->ROOT, v);
}

struct list_node *find_last(struct list *lst) {
    struct list_node *current = lst->ROOT;
    while (current->next != lst->ROOT) { current = current->next; }
    return current;
}

void suf_insert(struct list *lst, float v) {
    list_insert(find_last(lst), v);
}
apatriarca
Moderatore
Moderatore
 
Messaggio: 4699 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Inserimento in coda

Messaggioda desterix95 » 27/06/2017, 08:38

Ok, però non sono riuscito a capire come mai viene usato il doppio puntatore invece del puntatore a una variabile, eppure il doppio puntatore serve soltanto a entrare nella lista, cosa che può essere fatta anche da un puntatore a una variabile, così $text(ptr->value)$
E poi un'altra cosa: questa funzione sotto è per l'inserimento ordinato in ordine crescente ma è un inserimento ordinato che riguarda il singolo elemento $text((*ptrptr)->value)$ o tutta la lista viene ordinata? E anche qua sempre il solito dubbio del doppio puntatore:
Codice:
void ord_insert(struct list **ptrptr, float v) {
   while (*ptrptr != NULL && ((*ptrptr)->value<v)) {
      ptrptr = &((*ptrptr)->next_ptr);
   }
   pre_insert(ptrptr, v);
}


Grazie
desterix95
Junior Member
Junior Member
 
Messaggio: 67 di 222
Iscritto il: 10/07/2015, 14:37

Re: [C] Inserimento in coda

Messaggioda apatriarca » 27/06/2017, 08:50

Nel caso in cui la lista sia vuota il puntatore al primo elemento deve cambiare ed è quindi necessario che sia un puntatore a puntatore. Se passassi solo un puntatore la sua modifica rimarrebbe limitata al corpo della funzione.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4700 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite