Поменять местами 2 элемента списка C++
Помогите пожалуйста, если можно, с комментариями, не понимаю, как менять совсем((
#include <iostream>
using namespace std;
struct element
{
int x;
element* Next;
};
class List
{
element* Head;
public:
List()
{
Head = NULL;
}
~List();
void Add(int x);
void Show();
List::~List()
{
while (Head != NULL)
{
element* temp = Head->Next;
delete Head;
Head = temp;
}
}
void List::Add(int x)
{
element* temp = new element;
temp->x = x;
temp->Next = Head;
Head = temp;
}
void List::Show()
{
element* temp = Head;
while (temp != NULL)
{
cout << temp->x << " ";
temp = temp->Next;
}
}
int main()
{
int N; //Число элементов в список
int x; //Элементы вводимые в список
List lst;
cout << "N = ";
cin >> N;
for (int i = 0; i < N; i++)
{
cout << i + 1 << ". x = ";
cin >> x;
lst.Add(x);
}
lst.Show();
cout << endl;
return 0;
}
Нашла вот этот код и не могу никак объединить
SingleList *a = ptr->Next;
SingleList *b = a->Next;
ptr->Next = b; // a -> b -> c
// ^
// ptr |
a->Next = b->Next; // a -> c
// ^
// ptr -> b |
b->Next = a; // ptr -> b -> a -> c
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
у вас однонаправленный список, т.е. элемент знает где находится следующий элемент, но не знает где находится предыдущий
чтобы поменять 2 элемента местами, надо поменять значения элементов местами (в данном случае значение переменной x)
Если у вас есть указатель на эти элементы, то все просто
element* first;
element* second;
const int tmp = second->x;
first->x = second->x;
second->x = tmp
Проблема только в том, что в указанном вами коде элементы списка приватные - к ним имеет доступ только класс, а снаружи до них не добраться
Поэтому самый простой вариант - добавить метод
void List::Swap(const int index1, const int index2) {
// найти элемент #1
element* element1 = Head;
for (int index = 0; index < index1; index++)
element1 = element1->Next;
// найти элемент #2
element* element2 = Head;
for (int index = 0; index < index2; index++)
element2 = element2->Next;
// поменять местами значения найденных элементов
const int tmp element2->x;
element1->x = element2->x;
element2->x = tmp;
}
P.S.
кстати раз уж вся начинка списка спрятана в приватные методы класса, то и структуру element тоже лучше спрятать внутрь класса и сделать приватной