Добрый день,
Помогите, пожалуйста, с реализацией односвязного списка. Мне нужно поменять местами первый и последний член ОС. Все методы, кроме change, работают. В Add я записываю в файл ОС, в Show я его считываю с файла. После этого мне нужно поменять местами последний и первый член, с этим и возникают трудности. Я много что перепробовал, но нечего не помогло. Я понял, что нужно создать временную переменную, но не знаю, как это реализовать. В коде могут присутствовать неясности, так как я пробовал экспериментировать
Код:
#include <conio.h>
#include <iostream>
#include<fstream>
using namespace std;
typedef double TE;
struct element //Структура с инфополями и адресным полем
{
TE x ; //Инфополе. значения из x будут передаваться в список
element* Next; //Адресное поле
};
struct List {
element* Head; //Указатель на последний активный элемент или просто голова списка
public:
List() { Head = NULL; } //Конструктор и инициализация указателя пустым значением
~List(); //Прототип деструктора. Сам деструктор вынесен за класс
void Add(TE x, int N); //Прототип функции добавления значений в список
void Show(TE &x); //Прототип функцииотображения списка на экране
void check(int &count);
void change(TE &x, TE& x1);
};
List::~List() //Деструктор вынесен за класс
{
while (Head != NULL) //Пока по адресу не пусто
{
element* temp = Head->Next; //Временная переменная для хранения адреса следующего элемента
delete Head; //Освобождаем адрес обозначающий начало
Head = temp; //Меняем адрес на следующий
}
}
void List::Add(TE x, int N ) //Функция добавления элементов в список
{
cout << "Write the name of your file " << endl;
string path;
cin >> path;
fstream file;
file.open(path, fstream::in | fstream::out | fstream::app);
List lst; //Переменная, тип которой список
cout << "N = ";
cin >> N;
for (int i = 0; i < N; i++)
{
element* temp = new element; //При каждом вызове выделяется память
temp->x = x; //Записываем x в элемент структуры element (в x структуры element) //Указываем, что след. элемент это объект по адресу Head
Head = temp;
cout << i + 1 << ". x = ";
cin >> x;
file << x;
file << " ";
}
file.clear();
file.seekg(0, ios_base::beg);
}
void List::check(int &count)
{
cout << "Write the name of your file " << endl;
string path;
cin >> path;
fstream file;
file.open(path, fstream::in | fstream::out | fstream::app);
file.clear();
file.seekg(0, ios_base::beg);
List lst; //Переменная, тип которой список
element* temp = Head;
int num;
count = -1;
while (!file.eof())
{
file >> num;
count++;;
}
if (count == 0)
{
cout << " your linked list have no numbers " << endl;
}
else if (count > 0)
{
cout << "The amount of numbers in the linked list is " << count << endl;
}
}
void List::Show(TE& x) //Функция отображения списка на экране
{
cout << "Write the name of your file " << endl;
string path;
cin >> path;
fstream file;
file.open(path, fstream::in | fstream::out | fstream::app);
file.clear();
file.seekg(0, ios_base::beg);
List lst; //Переменная, тип которой список
element* temp = Head;
int num;
int count = -1;
while (!file.eof())
{
file >> num;
count++;;
}
if (count == 0)
{
cout << " your linked list have no numbers " << endl;
}
else if (count > 0)
{
cout << " yor linked list: ";
file.clear();
file.seekg(0, ios_base::beg);
element* temp = new element;
for (int i = 0; i < count; i++)
{
file >> x;
temp->x = x;
temp->Next = Head;
cout << temp->x << " ";
}
file.clear();
file.seekg(0, ios_base::beg);
}
}
void List::change(TE& x, TE& x1)
{
element* temp = Head;
element* first = Head;
element* last = NULL;
last->x = x1;
while (temp != NULL)
{
temp->x = x;
temp->Next = Head;
cout << temp->x << " ";
}
temp->Next = NULL;
temp->x = x1;
cout << temp->x << endl;
}
void main()
{
TE x = 0;
TE x1 = 0;
int b = 0;
cin >> b;
int N = 0;
List lst;
if(b==1)
{
lst.Add(x, N);
}
else if (b == 2)
{
int count = -1;
lst.check(count);
}
else if (b == 3)
{
lst.Show(x);
}
else if (b == 4)
{
lst.Show(x);
lst.change(x, x1);
}
}