Estuve en una entrevista para una posición C en la que me presentaron un modismo que no había encontrado anteriormente. Este es un truco que simplifica la implementación de varios algoritmos que involucran listas enlazadas y me pregunto si alguien más se ha encontrado con esto.Un idioma interesante de la lista C vinculada
decir que hemos definido un registro de lista enlazada de modo:
typedef struct _record
{
char* value;
struct _record* next;
} record;
Necesitamos una función que inserta un nuevo registro de modo que toda la lista ordenada se mantiene con respecto al valor de en los registros. La siguiente implementación es más simple que cualquier otra que hubiera usado, aunque menos legible.
void insert_sorted(record** r, const char* value)
{
record* newrec = NULL;
while(*r && strcmp(value, (*r)->value) > 0)
r = &((*r)->next); /* move r to point to the next field of the record */
newrec = malloc(sizeof(record));
newrec->value = strdup(value);
newrec->next = *r;
*r = newrec;
}
Cuando se invoca la función, r puntos al puntero de cabeza de la lista. Durante el ciclo while, r se actualiza para apuntar al campo next
del registro que viene justo antes del punto en el que queremos colocar el nuevo registro. La última línea de la función actualiza el puntero principal de la lista (si el la inserción ocurre al principio) o el campo next
del registro anterior, que es bastante bueno.
Un par de preguntas:
¿Este modismo tienen un nombre o parte se menciona en ninguna literatura?
¿Hay otros como él en el lenguaje C?
yo creía que sabía C bastante bien y tenía punteros y direccionamiento indirecto bastante bien resuelto, pero este me tomó un tiempo para entender completamente.
'char * value' en lugar de' char * value'? ugh. No trabajes allí. – finnw
@finnw Esa es una cuestión de estilo personal (o lugar de trabajo). Para mí también sería 'char * value'. – zentrunix
@ JoséX. Como la mayoría de los programadores de C, cometí el error de escribir 'char * pointer1, pointer2;' varias veces. El '' char * ''(sin un espacio) hace que sea más probable que un humano lo lea de forma diferente a como lo compila el compilador (lo que hace que este error sea más probable) – finnw