Bueno pues a ver... Varias cosas a mencionar:
- Pongo esto lo primero porque creo que es el error más básico de todos: El código me hace sospechar que tienes un problema con el ámbito de las variables. La pila que creas en la línea 24, la utilizas únicamente en la 115 además de forma muy extraña.
Cuando en una función estableces el nombre de una variable, puede ser cualquiera. Este nombre solo sirve dentro de la función y realmente se corresponde con el argumento que hayas pasado al llamar a la función. Ver la función mostrarPila() más adelante...
- La función Pilas_1() no es muy descriptiva. Sería mejor algo como push(p1, dato) simulando las funciones típicas de una pila (push, top, pop)
- No tiene sentido hacer una función para mostrar una pila y otra para mostrar otra pila. La gracia es tener una única función y mediante parámetros decirle qué pila mostrar en cada momento.
- Además si mueves el puntero, pierdes la referencia al inicio de la pila. Tienes que crear un puntero auxiliar.
void mostrarPila(Nodo *&p) {
Nodo *aux = p;
while(aux != NULL) { // En C++ para punteros no se debe usar NULL sino nullptr
cout << aux->dato << " ";
aux = aux->sig;
}
}
// Para mostrar las pilas 1 y 2:
mostrarPila(p1); // Aqui la variable p que se usa en la funcion hace referencia a p1
mostrarPila(p2); // Ahora la misma variable p hace referencia a p2
Yendo al grano ahora, la función para fusionar pilas deberías ser algo así:
void fusionarPilas(Nodo *&p1, Nodo *&p2, Nodo *&fusion) {
// Recorres p1 como si fueras a mostrarla pero en vez de mostrarla vas guardando cada elemento en fusion...
// Tu codigo aqui
// Recorres p2 como si fueras a mostrarla pero en vez de mostrarla vas guardando cada elemento en fusion...
// Tu codigo aqui
}
// Para llamar a la funcion:
fusionarPilas(p1, p2, pila); // La fusion se guardara en la pila <pila> de la linea 24
Es mejor hacerlo así para no modificar las pilas originales y guardar la fusion en otra diferente.
Si completas este código correctamente, debería funcionar y para comprobarlo ya sabes:
mostrarPila(pila);
Además fíjate que en tu función creas un nodo nuevo (línea 109) y luego apuntas a p1. Ese nodo nuevo se pierde, no sirve para nada.
PD: Estás trabajando con memoria dinámica (al utilizar new). Por tanto, antes de acabar el programa, debes eliminar toda esa memoria reservada mediante delete (nodo a nodo).
PD2: No es recomendable utilizar system("pause"). La mejor alternativa en C++ es utilizar cin.get() para el mismo propósito.
PD3: Las bibliotecas en C++ no llevan .h y en cambio llevan una c al principio: stdlib.h (versión C) -> cstdlib (versión C++) Funciona de todas formas por la compatibilidad con C pero no es lo más correcto.