Проблема с добавлением элемента в кольцевой список на C++

Всем здравствуйте! Столкнулся с проблемой при создании кольцевого односвязного списка. При выводе элементов списка сделал проверку на кольцо - вывожу адрес элемента и адрес следующего элемента. В кольцевом списке, при выводе последнего элемента должен вывестись его адрес, а также адрес первого элемента, так как за последним стоит первый (особенность кольцевого списка), но адрес первого элемента не выводится... Возможно где-то забыл указатель... Уже всё просмотрел но не могу найти ошибку...

#include<iostream>
using namespace std;

struct Node
{
    int item;
    Node* next;
};

void print(Node* head);
void add(Node** head, int x);
void addByPosition(Node** head, int x);
Node* find(Node** head, int index);
void del(Node** head);
void delByPosition(Node** head, int index);
void clean(Node** head);
void search(Node** head);

int main() {
    setlocale(LC_ALL, "rus");
    Node* head = new Node;
    head->item = 0;
    head->next = nullptr;
    Node* pred;
    int action, x;
    bool check = 0;
act:cout << "\n1) Добавление элемента\n2) Вывод циклическго списка\n3) Удаление элемента" <<
"\n4) Очистка списка\n5) Поиск элемента\n0) Завершить программу\n";
cin >> action;
if (cin.fail())
{
    cin.clear();
    cin.ignore();
    cout << "\nИзмените ввод!\n";
    goto act;
}
switch (action)
{
case 1:
{
    bool b = 0;
    cout << "\nВведите элемент добавления: ";
    while (!b)
    {
        cin >> x;
        if (!cin)
        {
            cout << "\nИзмените ввод!\n";
            cin.clear();
            cin.ignore();
        }
        else b = 1;
    }
    b = 0;
    if (head->item == 0)
    {
        Node* pv = new Node;
        pv->item = x;
        pv->next = head;
        head->next = pv;
        head->item++;
        cout << endl; goto act;
    }
    else
    {
        int choice;
        cout << "\n1) По позиции\n2) По значению\n";
        while (!b)
        {
            cin >> choice;
            if ((!cin) || (choice > 2) || (choice < 1))
            {
                cout << "\nИзмените ввод!\n";
                cin.clear();
                cin.ignore();
            }
            else b = 1;
        }
        if (choice == 1) {
            addByPosition(&head, x); cout << endl; goto act;
        }
        else {
            add(&head, x); cout << endl; goto act;
        }
    }
}
case 2:
{
    if (head->item == 0)
    {
        cout << "\nСписок пуст!\n"; goto act;
    }
    else
    {
        print(head); cout << endl; goto act;
    }
}
case 3:
{
    int index;
    if (head->item == 0)
    {
        cout << "\nСписок пуст!\n"; goto act;
    }
    else
    {
        int d;
        bool b = 0;
        cout << "\n1) По значению\n2) По позиции\n";
        while (!b)
        {
            cin >> d;
            if ((!cin) || (d < 1) || (d > 2))
            {
                cout << "\nИзмените ввод!\n";
                cin.clear();
                cin.ignore();
            }
            else b = 1;
        }
        if (d == 1)
        {
            del(&head); cout << endl; goto act;
        }
        else
        {
            b = 0;
            cout << "\nВведите позицию: ";
            while (!b)
            {
                cin >> index;
                if ((!cin) || (index < 1) || (index > head->item))
                {
                    cout << "\nИзмените ввод!\n";
                    cin.clear();
                    cin.ignore();
                }
                else b = 1;
            }
            delByPosition(&head, index); cout << endl; goto act;
        }
    }
}
case 4:
{
    if (head->item == 0)
    {
        cout << "\nСписок пуст!\n"; goto act;
    }
    else
    {
        clean(&head); cout << endl; goto act;
    }
}
case 5:
{
    if (head->item == 0)
    {
        cout << "\nСписок пуст!\n"; goto act;
    }
    else
    {
        search(&head); cout << endl; goto act;
    }
}
deault: {system("pause"); return 0; }
}
}

void print(Node* head) {
    Node* pv = new Node;
    pv = head->next;
    do {
        cout << "\nЭлемент списка и его адрес: " << pv->item << " - " << &pv->item;
        cout << "\nАдрес следующего элемента: " << pv->next << "\n\n";
        pv = pv->next;
    } while (pv != head);
}

void add(Node** head, int x) {
    Node* pv = new Node;
    pv->item = x;
    Node* pred = new Node;
    pred = (*head)->next;
    do {
        if (pred->next == *head) {
            pv->next = *head;
            pred->next = pv;
            break;
        }
        else pred = pred->next;
    } while (pred != *head);
    (*head)->item++;
    cout << "Операция выполена.\n";
}

void addByPosition(Node** head, int x) {
    int index, choice1;
    Node* pred = new Node;
    cout << "\nВведите позицию: ";
    m:cin >> index;
    if ((!cin) || (index < 1)) {
        cout << "\nИзмените ввод!\n";
        cin.clear();
        cin.ignore(); goto m;
    }

    bool b1 = 0;
    cout << "\n1) На позицию\n2) Перед позицией\n3) После позиции\n";
    while (!b1) {
        cin >> choice1;
        if ((choice1 > 3) || (choice1 < 1) || (cin.fail())) {
            cin.clear();
            cin.ignore();
            cout << "\nИзмените ввод!\n";
        }
        else b1 = 1;
    }
    if (choice1 == 1) {
        Node* pv = new Node;
        pv->item = x;
        if (index == 1) {
            pv->next = (*head)->next;
            (*head)->next = pv;
        }
        else {
            pred = find(head, index - 1);
            pv->next = pred->next;
            pred->next = pv;
        }
        cout << "\nОперация выполнена.\n";
        (*head)->item++;
    }
    else if (choice1 == 2) {
        Node* pv = new Node;
        pv->item = x;
        if (index == 1) {
            add(head, x);
        }
        else {
            if (index - 2 == 0) {
                pv->next = (*head)->next;
                (*head)->next = pv;
            }
            else {
                pred = find(head, index - 2);
                pv->next = pred->next;
                pred->next = pv;
            }
            cout << "\nОперация выполнена.\n";
        }
        (*head)->item++;
    }
    else {
        Node* pv = new Node;
        pv->item = x;
        if (index == (*head)->item) {
            pred = find(head, index);
            pv->next = *head;
            pred->next = pv;
        }
        else {
            pred = find(head, index);
            pv->next = pred->next;
            pred->next = pv;
        }
        (*head)->item++;
        cout << "\nОперация выполнена.\n";
    }
}

Node* find(Node** head, int index) {
    Node* pv = new Node;
    pv = (*head)->next;
    int k = 1;
    while (pv) {
        if (k == index)
            return pv;
        else {
            pv = pv->next;
            k++;
        }
    }
    return pv = nullptr;
}

void del(Node** head) {
    int x, index = 0;
    bool b = 0;
    cout << "\nВведите элемент удаления: ";
    while (!b) {
        cin >> x;
        if (!cin) {
            cout << "\nИзмените ввод!\n";
            cin.clear();
            cin.ignore();
        }
        else b = 1;
    }
    bool b1 = 0;
    Node* pv = new Node;
    pv = (*head)->next;
    Node* pred = new Node;
    do {
        index++;
        if (pv->item == x) {
            b1 = 1;
            break;
        }
        pv = pv->next;
    } while (pv);
    if (b1) {
        if (index == 1) {
            Node* gv = new Node;
            gv = (*head)->next;
            (*head)->next = (*head)->next->next;
            delete gv; gv = nullptr;
        }
        else if (index == (*head)->item) {
            pred = find(head, index - 1);
            Node* gv = new Node;
            gv = pred->next;
            pred->next = *head;
            delete gv; gv = nullptr;
        }
        else {
            pred = find(head, index - 1);
            Node* gv = new Node;
            gv = pred->next;
            pred->next = pred->next->next;
            delete gv; gv = nullptr;
        }
        cout << "\nЭлемент " << x << " удален с позиции " << index << endl;
        (*head)->item--;
    }
    else cout << "\nТакого элемента нет!\n";
}

void delByPosition(Node** head, int index) {
    bool b = 0; int c, a;
    cout << "\n1) По позиции\n2) Перед позицией\n3) После позиции\n";
    while (!b) {
        cin >> c;
        if ((!cin) || (c < 1) || (c > 3))
        {
            cout << "\nИзмените ввод!\n";
            cin.clear();
            cin.ignore();
        }
        else b = 1;
    }
    Node* pred = new Node;
    if ((index == 1) && (c == 1) || ((index == (*head)->item && (c == 3)))) {
        Node* gv = new Node;
        gv = (*head)->next;
        a = gv->item;
        (*head)->next = (*head)->next->next;
        delete gv; gv = nullptr;
    }
    else if ((index == (*head)->item) && (c == 1) || ((index == 1) && (c == 2))) {
        if (c == 1)
            pred = find(head, index - 1);
        if (c == 2)
            pred = find(head, (*head)->item - 1);
        Node* gv = new Node;
        gv = pred->next;
        a = gv->item;
        pred->next = *head;
        delete gv; gv = nullptr;
    }
    else if ((c == 2) && (index - 2 == 0)) {
        Node* gv = new Node;
        gv = (*head)->next;
        a = gv->item;
        (*head)->next = (*head)->next->next;
        delete gv; gv = nullptr;
    }
    else {
        if (c == 1)
            pred = find(head, index - 1);
        else if (c == 3)
            pred = find(head, index);
        else
            pred = find(head, index - 2);
        Node* gv = new Node;
        gv = pred->next;
        a = gv->item;
        pred->next = pred->next->next;
        delete gv; gv = nullptr;
    }
    (*head)->item--;
    cout << "\nЭлемент " << a << " удален.\n";
}

void clean(Node** head) {
    while ((*head)->item != 0) {
        Node* gv = new Node;
        gv = (*head)->next;
        (*head)->next = (*head)->next->next;
        delete gv; gv = nullptr;
        (*head)->item--;
    }
    cout << "\nСписок очищен.\n";
}

void search(Node** head) {
    int choice1, index, value;
    cout << "\n1) По значению\n2) По ключу\n";
    bool b = 0;
    while (!b) {
        cin >> choice1;
        if ((!cin) || (choice1 < 1) || (choice1 > 2)) {
            cin.clear();
            cin.ignore();
            cout << "\nИзмените ввод!\n";
        }
        else b = 1;
    }
    b = 0;
    if (choice1 == 1) {
        cout << "\nВведите значение поиска: ";
        while (!b) {
            cin >> value;
            if (!cin) {
                cin.clear();
                cin.ignore();
                cout << "\nИзмените ввод!\n";
            }
            else b = 1;
        }
        int k = 0; b = 0;
        Node* pv = new Node;
        pv = (*head)->next;
        do {
            k++;
            if (pv->item == value) {
                cout << "\nПозиция: " << k << endl;
                b = 1;
            }
            pv = pv->next;
        } while (pv);
        if (!b) cout << "\nТакого элемента нет!\n";
    }
    else {
        b = 0;
        cout << "\nВведите ключ поиска: ";
        while (!b) {
            cin >> index;
            if (!cin) {
                cin.clear();
                cin.ignore();
                cout << "\nИзмените ввод!\n";
            }
            else b = 1;
        }
        Node* pv = new Node;
        pv = find(head, index);
        cout << "\nНа позиции " << index << " элемент:" << pv->item << endl;
    }
}

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