обмен данными стеков

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

struct Node
{
    int data;
    Node* nextptr;
};


void Push(Node*&head, int data) {
    Node *temp = new Node();
    temp->data = data;
    temp->nextptr = head;
    head = temp;
}

void Pop(Node*& head) {
    if (head) {
        Node* temp = head->nextptr;
        delete head;
        head = temp;
    }
}

void Clear(Node*& head) {
    while (head) {
        Pop(head);
    }
}

void lout(Node* head) {
    Node* temp = head;
    while (head) {
        cout << head->data << " ";
        head = head->nextptr;
    }
    cout << endl;
}

void first_task(Node* p1, Node* p2) {
    Node* tempp1 = p1;
    Node* tempp2 = p2;
    lout(tempp1);
    Clear(p1);
    while (tempp2) {
        Push(p1, tempp2->data);
        tempp2 = tempp2->nextptr;
    }
    Clear(p2);
    while (tempp1) {
        Push(p2, tempp1->data);
        tempp1 = tempp1->nextptr;
    }
    lout(p1);
    cout << endl;
    lout(p2);
}

int main() {
    Node *stack1 = nullptr;
    Node *stack2 = nullptr;
    for (int i = 0; i < 10; i++) {
        Push(stack1, i);
    }
    for (int i = 20; i < 30; i++) {
        Push(stack2, i);
    }
    
    cout << "Before swap:"<<endl;
    lout(stack1);
    cout << endl;
    lout(stack2);
    cout << "After swap:" << endl;
    first_task(stack1,stack2);
    
    return 0;
}

В функции first_task() нужно переписать значения первого стека во второй, а со второго в первый. p1 и p2 - указатели на вершины стеков. Стек р1 выводится нормально, а р2 может словить исключение "Вызвано исключение: нарушение доступа для чтения. tempp1 было 0xDDDDDDDD.", может вывести 3 числа из 10, может вывести 5 чисел. Причем это те же значения, что и в стеке tempp2(от 20 до 29), хотя должны выводится значения tempp1(от 0 до 9).


Ответы (0 шт):