Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <cstring>
- #include <iostream>
- using namespace std;
- struct Node { //Узел двунаправленного списка.
- string value; // Данные.
- Node* next, * prev; //Указатели на следующий и предыдущий элементы двунаправленного списка.
- };
- class MyList { //Двунаправленный список.
- // Голова, хвост.
- Node* Head, * Tail;
- // Количество элементов.
- int Count;
- public:
- // Конструктор.
- MyList();
- // Деструктор.
- ~MyList();
- // Получить количество.
- int GetCount();
- // Получить элемент списка.
- Node* GetNode(int pos);
- // Удалить весь список.
- void DelAll();
- // Удаление элемента, если параметр не указывается,
- // то функция его запрашивает.
- void Del(int pos = 0);
- // Вставка элемента, если параметр не указывается,
- // то функция его запрашивает.
- void Insert(int pos = 0);
- // Добавление в конец списка.
- void AddTail(string s);
- // Добавление в начало списка.
- void AddHead(string s);
- // Печать списка.
- void Print();
- // Печать списка в обратном порядке.
- void ReversePrint();
- // Печать определенного элемента.
- void Print(int pos);
- };
- MyList::MyList() {
- // Изначально список пуст.
- Head = Tail = NULL;
- Count = 0;
- }
- MyList::~MyList() {
- // Удаляем все элементы.
- DelAll();
- }
- //P.S. Данная функция не была использована в программе, но была в списке обязательных функций.
- void MyList::AddHead(string s) {
- // Новый элемент.
- Node* temp = new Node;
- // Предыдущего нет.
- temp->prev = 0;
- // Заполняем данные.
- temp->value = s;
- // Следующий - бывшая голова.
- temp->next = Head;
- // Если элементы есть?
- if (Head != 0)
- Head->prev = temp;
- // Если элемент первый, то он одновременно и голова и хвост.
- if (Count == 0)
- Head = Tail = temp;
- else
- // Иначе новый элемент - головной.
- Head = temp;
- Count++;
- }
- void MyList::AddTail(string s) {
- // Создаем новый элемент.
- Node* temp = new Node;
- // Следующего нет.
- temp->next = 0;
- // Заполняем данные.
- temp->value = s;
- // Предыдущий - бывший хвост.
- temp->prev = Tail;
- // Если элементы есть?
- if (Tail != 0)
- Tail->next = temp;
- // Если элемент первый, то он одновременно и голова и хвост.
- if (Count == 0)
- Head = Tail = temp;
- else
- // Иначе новый элемент - хвостовой.
- Tail = temp;
- Count++;
- }
- //P.S. Данная функция не была использована в программе, но была в списке обязательных функций.
- void MyList::Insert(int pos) {
- // Если параметр отсутствует или равен 0, то запрашиваем его.
- if (pos == 0) {
- cout << "Input position: ";
- cin >> pos;
- }
- // Позиция от 1 до Count?
- if (pos < 1 || pos > Count + 1) {
- // Неверная позиция.
- cout << "Incorrect position !!!\n";
- return;
- }
- // Если вставка в конец списка.
- if (pos == Count + 1) {
- // Вставляемые данные.
- string data;
- cout << "Input new string: ";
- cin >> data;
- // Добавление в конец списка.
- AddTail(data);
- return;
- }
- else if (pos == 1) {
- // Вставляемые данные.
- string data;
- cout << "Input new string: ";
- cin >> data;
- // Добавление в начало списка.
- AddHead(data);
- return;
- }
- // Счетчик.
- int i = 1;
- // Отсчитываем от головы n - 1 элементов.
- Node* Ins = Head;
- while (i < pos) {
- // Доходим до элемента,
- // перед которым вставляемся.
- Ins = Ins->next;
- i++;
- }
- // Доходим до элемента,
- // который предшествует.
- Node* PrevIns = Ins->prev;
- // Создаем новый элемент.
- Node* temp = new Node;
- // Вводим данные.
- cout << "Input new string: ";
- cin >> temp->value;
- // Настройка связей.
- //if (PrevIns != 0 && Count != 1)
- PrevIns->next = temp;
- temp->next = Ins;
- temp->prev = PrevIns;
- Ins->prev = temp;
- Count++;
- }
- void MyList::Del(int pos) {
- // Если параметр отсутствует или равен 0, то запрашиваем его.
- if (pos == 0) {
- cout << "Input position: ";
- cin >> pos;
- }
- // Позиция от 1 до Count?
- if (pos < 1 || pos > Count) {
- // Неверная позиция.
- cout << "Incorrect position !!!\n";
- return;
- }
- // Счетчик.
- int i = 1;
- Node* Del = Head;
- while (i < pos) {
- // Доходим до элемента,
- // который удаляется.
- Del = Del->next;
- i++;
- }
- // Доходим до элемента,
- // который предшествует удаляемому.
- Node* PrevDel = Del->prev;
- // Доходим до элемента, который следует за удаляемым.
- Node* AfterDel = Del->next;
- // Если удаляем не голову.
- if (PrevDel != 0 && Count != 1)
- PrevDel->next = AfterDel;
- // Если удаляем не хвост.
- if (AfterDel != 0 && Count != 1)
- AfterDel->prev = PrevDel;
- // Удаляются крайние?
- if (pos == 1)
- Head = AfterDel;
- if (pos == Count)
- Tail = PrevDel;
- // Удаление элемента.
- delete Del;
- Count--;
- }
- void MyList::Print(int pos) {
- // Позиция от 1 до Count?
- if (pos < 1 || pos > Count) {
- // Неверная позиция.
- cout << "Incorrect position !!!\n";
- return;
- }
- Node* temp;
- // Определяем с какой стороны
- // быстрее двигаться.
- if (pos <= Count / 2) {
- // Отсчет с головы.
- temp = Head;
- int i = 1;
- while (i < pos) {
- // Двигаемся до нужного элемента.
- temp = temp->next;
- i++;
- }
- }
- else {
- // Отсчет с хвоста.
- temp = Tail;
- int i = 1;
- while (i <= Count - pos) {
- // Двигаемся до нужного элемента.
- temp = temp->prev;
- i++;
- }
- }
- // Вывод элемента.
- cout << temp->value << endl;
- }
- void MyList::Print() {
- // Если в списке присутствуют элементы, то пробегаем по нему
- // и печатаем элементы, начиная с головного.
- if (Count != 0) {
- Node* temp = Head;
- cout << "( ";
- while (temp->next != 0) {
- cout << temp->value << ", ";
- temp = temp->next;
- }
- cout << temp->value << " )\n";
- }
- }
- void MyList::ReversePrint() {
- // Если в списке присутствуют элементы, то пробегаем по нему
- // и печатаем элементы, начиная с головного.
- if (Count != 0) {
- Node* temp = Tail;
- cout << "( ";
- while (temp->prev != 0) {
- cout << temp->value << ", ";
- temp = temp->prev;
- }
- cout << temp->value << " )\n";
- }
- }
- void MyList::DelAll() {
- // Пока остаются элементы, удаляем по одному с головы.
- while (Count != 0)
- Del(1);
- }
- int MyList::GetCount() {
- return Count;
- }
- Node* MyList::GetNode(int pos) {
- Node* temp = Head;
- // Позиция от 1 до Count?
- if (pos < 1 || pos > Count)
- {
- // Неверная позиция.
- cout << "Incorrect position !!!\n";
- return 0;
- }
- int i = 1;
- // Ищем нужный нам элемент.
- while (i < pos && temp != 0)
- {
- temp = temp->next;
- i++;
- }
- if (temp == 0)
- return 0;
- else
- return temp;
- }
- //ГЛАВНАЯ ФУНКЦИЯ.
- int main() {
- setlocale(LC_ALL, "rus");
- MyList listOfStrings; //Список с номерами поездов и кол-вами свободных мест в вагонах.
- string s;
- for (int i = 0; i < 5; i++) {
- cout << "\nAdd a string: ";
- cin >> s;
- listOfStrings.AddTail(s);
- }
- listOfStrings.Print();
- listOfStrings.Insert(3);
- listOfStrings.Insert(4);
- listOfStrings.Print();
- listOfStrings.Del(3);
- listOfStrings.Del(1);
- listOfStrings.Print();
- listOfStrings.ReversePrint();
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement