Связный список C++

198
03 апреля 2018, 00:13

Нужно обратить связный список с элемента 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); тоже проходит

Answer 1
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();
READ ALSO
Как передавать данные между Activity? [дубликат]

Как передавать данные между Activity? [дубликат]

На данный вопрос уже ответили:

224
Как написать encode программу

Как написать encode программу

Как написать программу на java, которая бы шифровала введенную букву/набор букв согласно таблице? Пример: PRIVET = |>|2|/37

199
различие в вводе данных [дубликат]

различие в вводе данных [дубликат]

На данный вопрос уже ответили:

230
RSA разбиение текста на блоки

RSA разбиение текста на блоки

Здравствуйте, не подскажите, как в RSA идёт разбиение на блокиТ

219