Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // v18t13.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <string>
- #include <iostream>
- #include <fstream>
- using namespace std;
- // описываем структуру элемента списка
- // next - указатель на следующий элемент
- // data - данные (фамилия)
- struct element {
- element *next;
- element *previous;
- string data;
- };
- // указатель на начало списка, с которым будем работать
- element *list_first;
- // указатель на последний элемент списка. для работы от конца к началу
- element *list_last;
- element *p_left;
- element *p_right;
- // функция добавления нового элемента к списку
- void add_to_list(string x) {
- element *p;
- // создаем новый элемент
- p = new element;
- // заполнили его фамилию
- p->data = x;
- if (list_first == NULL) {
- // если список был пуст, то просто добавляем элемент, у которого нет
- // ни следующего, ни предыдущего
- list_first = p;
- list_last = p;
- list_first->next = NULL;
- list_first->previous = NULL;
- }
- else {
- // первый элемент списка должен смотреть "назад" на наш элемент
- list_first->previous = p;
- // этот элемент будет "смотреть" на "старую" голову списка
- p->next = list_first;
- // новая голова списка там, куда смотрит p
- list_first = p;
- list_first->previous = NULL;
- }
- }
- void print_list() {
- element *p;
- // взяли первый элемент
- p = list_first;
- cout << "Список (в прямом порядке): " << endl;
- // пока список не закончен
- if (p == NULL) cout << "Список пуст!" << endl;
- while (p != NULL) {
- cout << p->data << endl;
- // переход к следующему элементу
- p = p->next;
- }
- cout << "Конец списка" << endl;
- }
- void print_list_back() {
- element *p;
- // взяли первый элемент
- p = list_last;
- cout << "Список (в обратном порядке): " << endl;
- // пока список не закончен
- if (p == NULL) cout << "Список пуст!" << endl;
- while (p != NULL) {
- cout << p->data << endl;
- // переход к следующему элементу
- p = p->previous;
- }
- cout << "Конец списка" << endl;
- }
- int main()
- {
- int command;
- setlocale(LC_ALL, "Russian");
- // в начале список пуст, голова списка не показывает никуда
- list_first = NULL;
- list_last = NULL;
- string s;
- int n;
- /*
- Будем считать, что исходные данных находятся в файле, в первой строке которого
- написано количество фамилий, а дальше по 1 фамилии в строке.
- */
- ifstream f;
- // открыли файл на чтение
- f.open("g:\\names.txt");
- while (!f.eof()) {
- getline(f, s);
- add_to_list(s);
- }
- cout << "Список прочитан из файла" << endl;
- do {
- cout << "Выберите действие:" << endl;
- cout << "1: Вывод списка (в прямом порядке)" << endl;
- cout << "2: Вывод списка (в обратном порядке)" << endl;
- cout << "3: Удаление самой длинной фамилии" << endl;
- cout << "0: Выход из программы" << endl;
- cin >> command;
- if (command == 1) {
- print_list();
- }
- if (command == 2) {
- print_list_back();
- }
- if (command == 3) {
- // поиск наиболее длинной фамилии
- // нам нужно не только саму фамилию, но и указатель на ее элемент
- int max_size = 0;
- element *max_element = NULL;
- element *p = list_first;
- while (p != NULL) {
- if (p->data.size() > max_size) {
- max_size = p->data.size();
- max_element = p;
- }
- // переходим на следующий элемент
- p = p->next;
- }
- // "формальная" проверка на пустой список
- if (max_element == NULL) {
- cout << "Список был пуст" << endl;
- }
- else {// когда список не пустой
- if (max_element->previous == NULL) {
- // если это первый элемент
- if (max_element->next == NULL) {
- // хуже того, он первый и единственный
- list_first = NULL;
- list_last = NULL;
- delete max_element;
- }
- else {
- // или это первый элемент, за которым что-то есть
- p_right = max_element->next;
- // взяли элемент справа
- list_first = p_right;
- // теперь список начинается со второго элемента
- p_right->previous = NULL;
- // у второго элемента больше нет предыдущего
- delete max_element;
- }
- }
- else {
- // если это не первый элемент
- if (max_element->next == NULL) {
- // но это последний элемент (крайний справа)
- p_left = max_element->previous;
- p_left->next = NULL;
- list_last = p;
- // отрезаем последний элемент
- delete max_element;
- }
- else {
- // это элемент из середины списка
- p_right = max_element->next;
- p_left = max_element->previous;
- // и передвинули указатели "прыгнув" через удаляемый элемент
- p_left->next = p_right;
- p_right->previous = p_left;
- delete max_element;
- }
- }
- }
- cout << "Удаление выполнено." << endl;
- }
- } while (command != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement