[C] Inserimento in coda

desterix95
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?
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

Risposte
apatriarca
Perché nel caso in cui sia ptrptr == NULL, il puntatore va modificato in modo che contenga il nuovo nodo.

apatriarca
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).
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);
}

desterix95
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:
void ord_insert(struct list **ptrptr, float v) {
	while (*ptrptr != NULL && ((*ptrptr)->value<v)) {
		ptrptr = &((*ptrptr)->next_ptr);
	}
	pre_insert(ptrptr, v);
}


Grazie

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.