Dadas dos listas dobles, insertar los elementos de la primer lista (Lista 1) en la segunda lista (Lista 2), manteniendo ordenada la 2da lista. Al final los apuntadores Primero y Último de la primer lista deberán apuntar a NULL.
Defina la o las estructuras de datos necesarias que permitan manejar las listas dobles de nombres del problema anterior.
Realice la función insertaEnListaD para listas doblemente ligadas, la cual recibe como parámetros la variable de la estructura con las 2 cabezas de la lista 1 y otra variable con las 2 cabezas de la lista 2 de nombres y regresa modificadas las 2 listas (las 2 cabezas de la Lista 1 con NULL y la Lista 2 con los nodos insertados de la lista 1).
Hola,
Te dejo la idea general con código, adaptado a los nombres que mencionas (Primero/Último como punteros de cabeza y cola):
typedef struct Nodo {
int dato;
struct Nodo *anterior;
struct Nodo *siguiente;
} Nodo;
typedef struct {
Nodo *primero;
Nodo *ultimo;
} ListaD;
void insertaEnListaD(ListaD *lista2, int valor) {
Nodo *nuevo = malloc(sizeof(Nodo));
nuevo->dato = valor;
if (lista2->primero == NULL) {
nuevo->anterior = NULL;
nuevo->siguiente = NULL;
lista2->primero = nuevo;
lista2->ultimo = nuevo;
return;
}
Nodo *actual = lista2->primero;
while (actual != NULL && actual->dato < valor) {
actual = actual->siguiente;
}
if (actual == NULL) {
nuevo->anterior = lista2->ultimo;
nuevo->siguiente = NULL;
lista2->ultimo->siguiente = nuevo;
lista2->ultimo = nuevo;
} else {
nuevo->siguiente = actual;
nuevo->anterior = actual->anterior;
if (actual->anterior != NULL) {
actual->anterior->siguiente = nuevo;
} else {
lista2->primero = nuevo;
}
actual->anterior = nuevo;
}
}
void moverLista(ListaD *lista1, ListaD *lista2) {
Nodo *actual = lista1->primero;
while (actual != NULL) {
insertaEnListaD(lista2, actual->dato);
actual = actual->siguiente;
}
lista1->primero = NULL;
lista1->ultimo = NULL;
}
La función insertaEnListaD busca la primera posición donde el valor a insertar es menor que el nodo actual, y coloca ahí el nuevo nodo enlazando los cuatro punteros (el siguiente del anterior, el anterior del siguiente, y los dos del propio nodo nuevo). Ojo con los tres casos que hay que cubrir: lista vacía, insertar al final, e insertar en medio o al principio.
Nota: si esto es un ejercicio de clase probablemente toque liberar memoria en algún punto (no lo he hecho aquí para no alargar el ejemplo), y si malloc puede fallar en tu entorno conviene comprobar que no devuelve NULL antes de usarlo.
Un saludo,
David Carrero