Проблема с добавлением элемента в кольцевой список на 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;
}
}