Нужно обратить связный список с элемента n по элемент m. Есть вот такая работающая программа:
#include <iostream>
#include <utility>
using namespace std;
struct Node
{
Node() : Next(NULL), Prev(NULL){}
int x;
Node *Next, *Prev;
};
class List
{
Node *Head, *Tail;
public:
List() :Head(NULL), Tail(NULL) {};
~List();
void Show();
Node* Add(int x);
void Sort();
void Reverse(Node* first, Node* last);
};
List::~List()
{
while (Head)
{
Tail = Head->Next;
delete Head;
Head = Tail;
}
}
Node* List::Add(int x)
{
Node *temp = new Node;
temp->x = x;
if (Head != NULL)
{
temp->Prev = Tail;
Tail->Next = temp;
Tail = temp;
}
else
{
Head = Tail = temp;
}
return temp;
}
void List::Show()
{
Node *temp = Head;
while (temp != NULL)
{
cout << temp->x << " ";
temp = temp->Next;
}
cout << "\n";
}
void List::Sort()
{
Node * list = Head;
Node * node, *node2;
for (node = list; node; node = node->Next)
for (node2 = list; node2; node2 = node2->Next)
if (node->x > node2->x) {
int i = node->x;
node->x = node2->x;
node2->x = i;
}
std::cout << "\n";
}
void List::Reverse(Node* first, Node* last)
{
if (first && last)
{
while (first != last)
{
std::swap(first->x, last->x);
first = first->Next;
if (first != last)
{
last = last->Prev;
}
}
}
}
int main()
{
system("CLS");
List lst;
lst.Add(1);
Node* first = lst.Add(2);
lst.Add(3);
lst.Add(4);
Node* last = lst.Add(5);
lst.Add(6);
lst.Show();
lst.Reverse(first, last);
lst.Show();
system("PAUSE");
}
Но нужно сделать так, чтобы элементы n и m вводились с клавиатуры. Я вроде пытался вот так:
int i,n,m;
cin >> n >> m;
for (i = 0; i < 6; i++)
{
if (i+1==n)
Node* first = lst.Add(1+i);
else
if (i+1==m)
Node* last = lst.Add(1+i);
else
lst.Add(1+i);
}
lst.Show();
lst.Reverse(first, last);
lst.Show();
Но программа ругается, что идентификатор first
и last
не определён. Хотя список он вроде составляет и если делать пошаговую отладку, то по строчкам Node* first = lst.Add(1+i);
тоже проходит
Node* last;//Область видимости: функция
Node* first;//И здесь тоже
int i,n,m;
cin >> n >> m;
for (i = 0; i < 6; i++)
{
if (i+1==n)
{
//Node* first = lst.Add(1+i);//Область видимости: оператор if;
first = lst.Add(1+i);
}
else
if (i+1==m)
last = lst.Add(1+i);
else
lst.Add(1+i);
}
lst.Show();
lst.Reverse(first, last);
lst.Show();
UPD Вообще нужно сделать примерно так:
1) Добавить метод в класс:
Node* get(int i)//Указатель на i-ый элемент
{
Node* elem = Head;
for(int j = 0; j < i)
elem = elem->Next;
return elem;
}
2) Использовать так:
lst.Show();
Node* first = lst.get(n);
Node* last = lst.get(m);
lst.Reverse(first, last);
lst.Show();
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Как написать программу на java, которая бы шифровала введенную букву/набор букв согласно таблице? Пример: PRIVET = |>|2|/37