Code
Ciao a tutti! la funzione che ho scritto al fondo fa parte di un programma per la gestione di una coda. Fino al primo "else" mi è tutto chiaro, ma poi questo:
(*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr;
mi crea confusione. Non riesco a capire cosa facciano esattamente queste due istruzioni, so che impostano un nuovo nodo come nodo finale della coda, ma non riesco a capire come.
Grazie in anticipo per le risposte!!
void enqueue(QUENODEPTR *headptr, QUEUENODEPTR *tailptr, char value)
{
QUEUENODEPTR newPtr;
newptr = malloc(sizeof(QUEUENODE));
if (newPtr != NULL) {
newPtr->data = value;
newPtr->nextPtr = NULL;
if (isEmpty(*headPtr))
*headPtr = newPtr;
else
(*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr;
}
else
printf("%c not inserted. No memory available.\n", value);
}
(*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr;
mi crea confusione. Non riesco a capire cosa facciano esattamente queste due istruzioni, so che impostano un nuovo nodo come nodo finale della coda, ma non riesco a capire come.
Grazie in anticipo per le risposte!!
void enqueue(QUENODEPTR *headptr, QUEUENODEPTR *tailptr, char value)
{
QUEUENODEPTR newPtr;
newptr = malloc(sizeof(QUEUENODE));
if (newPtr != NULL) {
newPtr->data = value;
newPtr->nextPtr = NULL;
if (isEmpty(*headPtr))
*headPtr = newPtr;
else
(*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr;
}
else
printf("%c not inserted. No memory available.\n", value);
}
Risposte
Per prima cosa usa il tag code per inserire il codice sorgente in modo da non avere problemi con simboli particolari e in modo da non perdere la formattazione.
Questa istruzione non è molto diversa dall'altra e come per l'altra ti conviene cercare di spezzarla in cose che capisci. Quindi l'istruzione seguente può essere divisa nei seguenti passaggi:
Come esercizio, come interpreteresti un'istruzione come:
Supponi che il tipo dell'espressione a destra dell'uguale (e quindi anche dell'altra). Quali sono i tipi delle variabili ptr0 e ptr1 assumendo che next e prev siano campi della stessa struttura di tipo T?
Questa istruzione non è molto diversa dall'altra e come per l'altra ti conviene cercare di spezzarla in cose che capisci. Quindi l'istruzione seguente può essere divisa nei seguenti passaggi:
QUENODEPTR *tail = *tailPtr; // ottiene un puntatore all'ultimo nodo corrente tail->nextPtr = newPtr; // aggiunge un nodo dopo l'ultimo nodo corrente
Come esercizio, come interpreteresti un'istruzione come:
((*ptr0)->next)[3] = (*ptr1).prev;
Supponi che il tipo dell'espressione a destra dell'uguale (e quindi anche dell'altra). Quali sono i tipi delle variabili ptr0 e ptr1 assumendo che next e prev siano campi della stessa struttura di tipo T?
non capisco perchè c'è l'indice 3, però dovrebbe
fare in modo che il puntatore ptr0 che punta al
nodo successivo punti invece al nodo precedente.
per quanto riguarda la tua risposta, io ho scritto:
code](*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr;[[/code]
sapevo già che la prima istruzione ordinava a tailPtr di puntatr al nuovo nodo newPtr, ma non ho capito il senso di quella dopo.
fare in modo che il puntatore ptr0 che punta al
nodo successivo punti invece al nodo precedente.
per quanto riguarda la tua risposta, io ho scritto:
code](*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr;[[/code]
sapevo già che la prima istruzione ordinava a tailPtr di puntatr al nuovo nodo newPtr, ma non ho capito il senso di quella dopo.
Il 3 è principalmente solo per distrazione.. Vuol semplicemente dire che next è probabilmente un array. Non interviene però nel tipo di ptr0 e ptr1.
La seconda riga aggiorna il puntatore all'ultimo nodo della coda.
La seconda riga aggiorna il puntatore all'ultimo nodo della coda.
quindi è giusto come ho detto?
Riguardo a cosa? Il codice che hai postato aggiunge un nodo alla fine della lista e aggiorna quindi i puntatore al primo e ultimo nodo in modo che puntino ai nodi corretti. Ma se hai capito più o meno cosa fa quel codice qual'è il problema?