Ejercicio 6 d - insert

Ejercicio 6 d - insert

de Mauricio Sosa Giri -
Número de respuestas: 2

Buenas.

Estoy tratando de resolver este ejercicio.

Nos dan la siguiente representación para una lista encabezada:

struct nodo {
int elem;
nodo *sig;
};

struct cabezal {
nodo *primero;
nodo *actual;
};

typedef cabezal *lista;

Y el ejercicio 6d pide:

insert: dados un entero x y una lista l, inserta el elemento x luego de la posición actual en la lista. La
posición actual pasa a ser el elemento (nodo) recién insertado. Si la lista l está vacía, el resultado es la
lista unitaria que contiene a x, siendo este elemento la posición actual en la lista resultado.

La duda que tengo es cuando por ejemplo la lista está vacía y necesito crear un nuevo nodo.
No se mucho sobre el lenguaje C, entonces no se me ocurre cómo resolverlo en código.

A lo que llegué fueron a estás dos variantes de código pero ninguna compila.

1)
void insert(int x, lista &l) {
    if (l->primero == NULL) {
        nodo nuevo = new nodo;
        nuevo->elem = x;
        nuevo->sig = NULL;
        l->primero = nuevo;
        l->actual = l->primero;
    }
}

2)
void insert(int x, lista &l) {
    if (l->primero == NULL) {
        nodo nuevo;
        nuevo.elem = x;
        nuevo.sig = NULL;
        l->primero = nuevo;
        l->actual = l->primero;
    }
}
No sé si hay algo que no estoy viendo o si es por no tener conocimiento de la programación en C.
Agradezco cualquier ayuda que me puedan brindar.

Saludos cordiales


En respuesta a Mauricio Sosa Giri

Re: Ejercicio 6 d - insert

de Mauricio Sosa Giri -
Buenas

Si agrego a la representación por ejemplo:

typedef nodo *nodoIndividual;

Y luego modifico el código de la siguiente forma:

void insert(int x, lista &l) {
    if (l->primero == NULL) {
        nodoIndividual nuevo = new nodo;
        nuevo->elem = x;
        nuevo->sig = NULL;
        l->primero = nuevo;
        l->actual = l->primero;
    }
}

Ahí sí compila, pero no estoy seguro de que sea el camino correcto ya que estoy modificando la representación de la lista indizada.

Gracias por la ayuda que me puedan brindar.

Saludos cordiales!
En respuesta a Mauricio Sosa Giri

Re: Ejercicio 6 d - insert

de Lucia Urquiola Chadarevian -
Buenas!

El new localiza y reserva memoria para un nuevo nodo, y devuelve un puntero. La segunda opción que mandaste está bien, ya que consideraste esto, y podrías hacerlo simplemente con un "nodo * nuevo = new nodo;", sin necesariamente agregar esa representación.

En realidad no estas modificando la representación de lista, porque l es un puntero a cabezal, que tiene un puntero al primer elemento y un puntero al actual, y en el caso de que la lista este vacía el primero y el actual apuntan a este nuevo nodo como pusiste.

Cabe destacar que esta función depende de la implementación de la función null, ya que en alguna de las dos es necesario reservar memoria para el cabezal (entiendo como usaste l->primero == NULL que la asignación de memoria al cabezal se hizo en la función NULL).