Листинг кода
#include <stdio.h>
#include <iostream>
using namespace std;
struct queue {
char* str;
queue* next;
queue* prev;
};
queue* create_queue () { //функция создания очереди
queue *qu = new queue; // выделение памяти под контейнер
qu->str = new char;
qu->str = "0";
system("cls");
printf( " \nСоздание контейнера успешно\n");
qu->next = NULL;
qu->prev = NULL;
return qu;
}
queue* intake_file (queue* first) // функция считывание очереди из файла
{
char* f_name = new char[30]; //переменная под имя файла
system("cls");
printf( "\n\n Введите имя файла: ");
scanf("%s",f_name);
FILE* f = fopen (f_name, "r+"); //открытие файла для чтения
if (f) //если файл открыт без ошибок
{
queue* qu = new queue;
qu->str = new char;
fgets (qu->str, 256, f);
if (qu->str[strlen(qu->str)-1] == '\n')
qu->str[strlen(qu->str)-1] = '\0';
queue* p = qu;
qu->next = new queue;
qu = qu->next;
p->next = qu;
qu->prev = p;
p->prev = NULL;
while (!feof(f)) //пока не кончится файл
{
qu->str = new char;
fgets (qu->str, 256, f); //считываем данные из файла в контейнеры
if (qu->str[strlen(qu->str)-1] == '\n')
qu->str[strlen(qu->str)-1] = '\0';
qu->next = new queue;
qu->next->prev = qu;
qu = qu->next;
}
qu = qu->prev;
qu->next = NULL;
printf( "\n\n Чтение из файла ");printf(f_name);printf(" выполнено\n\n ");
return p;
}
else
printf( "\n\n ошибка: Файл не найден \n\n"); //сообщение, если файл не удалось открыть/найти
}
void msg_clr_queue() // функция вывода сообщение, если очередь пуста
{
system("cls");
printf(" --- --- --- \n\n Действие не возможно. Очередь пуста. \n\n *** *** ***\n\n");
}
void error_msg () //функция вывода сообщения об ошибке ввода
{
system("cls");
printf(" \n\n Неверные данные \n\n \n\n Press any key \n\n");
}
queue* delete_all (queue* first) //функция удаления всей очереди и освобождения места
{
queue* qu;
queue* p;
for (qu=first; qu->next; ) //проход по очереди
{
p = qu;
qu = qu->next;
delete p; //освобождение памяти
}
first = NULL; //обрыв связи со след элементом
system("cls");
printf( "\n\n Удаление всех элементов успешно \n\n *** *** ***");
return first;
}
queue* exit_menu (queue* first) //функция выхода из меню созданной очереди
{
delete_all(first);
return NULL;
}
void add_container (queue* first) //функция добавления элемента в конец очереди
{
if (first->str == "0") // проверка пустая ли очередь
{
system("cls");
printf("\n Введите новый элемент: ");
first->str = new char;
scanf("%s",first->str);
system("cls");
printf( "\n Добовление в очередь успешно \n");
}
else
{
queue* qu = new queue;
qu = first;
while (qu->next) //проход до конца списка
qu=qu->next;
queue* p = new queue;
p = qu;
qu->next = new queue; //выделение памяти под новый элемент
qu = qu->next;
qu->str = new char ; //выделение памяти под строку в новом элементе
system("cls");
printf("\n Введите новый элемент: ");
scanf("%s",qu->str); //ввод строки в новый элемент
qu->prev = p;
qu->next = NULL;
system("cls");
printf( "\n Добовление в очередь успешно \n");
}
}
bool search_container (queue*& first) //функция поиска элемента по критерию
{
if (first->str != "0")
{
char* ss = new char; //поле под критерий поиска
system("cls");
printf( "\n\n \n Введите критерий поиска: ");
scanf("%s",ss); //ввод критерия поиска
//cin>>ss;
queue* qu;
qu = first;
while (qu) //проход по очереди
{
if (!strcmp(qu->str, ss)) //сравнение полей элементов очереди с критерием поиска
{
system("cls");
printf( "\n\n Элемент найден\n");
int x;
printf( "\n \n 1 - Изменить значение\n 2 - Извлечение элемента\n 0 - Выход\n\n");
printf( "Ваш выбор: ");
scanf("%d",&x);
switch (x)
{
case 1: // изменение значения найденного элемента
printf("\n\n \n Введите новое значение элемента: ");
cin>>qu->str;return true;
case 2: { // извлечение найденного элемента
if (!qu->prev)
{
qu = qu->next;
qu->prev = NULL;
delete first;
first = qu;
return true;
}
if (!qu->next)
{
qu->prev->next = NULL;
delete qu;
return true;
}
else
{
qu->next->prev = qu->next;
qu->prev->next = qu->next;
delete qu;
return true;
}
}
case 0: return false;
default: error_msg();break; //сообщение об ошибке ввода
}
}
qu = qu->next;
}
system("cls");
printf( " \n\n Не найдено соответствующих элементов\n"); //сообщение если элемент не найден
}
if (first->str == "0")
msg_clr_queue();
}
void lead_all (queue* first) //функция прохода по очереди
{
if (first->str != "0")
{
int n = 1;
char c = ' ';
system("cls");
printf( "В каком направлении пройти очередь?\n"); //запрос вариантов обхода
printf( " 1 - прямой\n 2 - обратный\n 0 - выход\n\n");
printf( "Ваш выбор: ");
//gets(&c);
//scanf("%c",&c);
cin>>c;
queue* qu;
qu = first;
if (c=='1') //прямой обход
{
printf( " \n Содержание: \n");
while (qu)
{
printf( "\n элемент ");printf("%d",n);printf(": ");printf(qu->str,"\n");
qu = qu->next;
n++;
}
printf( "\n *** *** ***\n");
}
if (c=='2') //обратный
{
while (qu->next)
{
n++;
qu = qu->next;
}
printf( " \n Содержание: \n");
while (qu)
{
printf( "\n элемент ");printf("%d",n);printf(": ");printf(qu->str);
qu = qu->prev;
n--;
}
printf( "\n \n");
}
}
if (first->str == "0")
msg_clr_queue();
}
void amount (queue* first) { //функция подсчёта количества элементов в очереди
if (first->str != "0")
{
queue* qu;
int amt=0; //переменная для подсчёта
for (qu=first; qu ;qu=qu->next) //проход по списку
amt++; //инкремент переменной для подсчёта
system("cls");
printf(" \n\n Количество элементов: ");printf("%d",amt);printf("\n"); //вывод рез-та на экран
}
if (first->str == "0")
msg_clr_queue();
}
void reverse (queue* first) //функция реверса
{
if (first->str != "0")
{
int amt = 0;
char* str = new char [];
queue* qu;
queue* last = new queue;
for (last=first->next; last->next; last=last->next) //считаем количество элементов в очереди
amt++;
amt++;
qu = first;
for (amt/=2, amt++; amt; amt--) //начиная с концов очереди, пока не дойдём до середины
{
strcpy (str, qu->str); //меняем
strcpy (qu->str, last->str); //элементы
strcpy (last->str, str); //местами
qu = qu->next;
last = last->prev;
}
system("cls");
printf( " \n\n Разворот очереди выполнен.\n\n ");
}
if (first->str == "0")
msg_clr_queue();
}
void save_file (queue* first) //функция записи данных в файл
{
if (first->str != "0")
{
char* f_name = new char[30]; //переменная для имени файла
system("cls");
cout<< "\n\n *** *** *** \n Введите имя файла: ";
cin>>f_name; //указыаем название файла
FILE* f = fopen (f_name, "w+"); //открываем файл для записи
queue* qu;
for (qu=first; qu; qu=qu->next){ //проходим по очереди
if (!qu->next)
{
//fputs (qu->str, f);
fprintf(f,"%s",qu->str); //записываем значение поля в файл построчно
fputc ('\0', f);
}
else
{
//fputs (qu->str, f);
fprintf(f,"%s",qu->str); //записываем значение поля в файл построчно
fputc ('\n', f);
}
}
fclose(f);
printf( " \n\n Запись в файл ");printf("%s",f_name);printf("' выполнена\n\n ");
if (first->str == "0")
msg_clr_queue();
}
}
void remove_doubling (queue* first) //функция удаления дубликатов
{
if (first->str != "0")
{
queue* qu;
queue* p = first;
for (qu = first; qu->next; qu = qu->next) // при помощи двух указателей (один из которых опережает другой)
for (p = qu->next; p; p = p->next) // проходим по всей очереди и ищем совпадающие эл-ты
{
if (!strcmp(p->str,qu->str)) // если совпадают - удаляем
{
if (!p->next)
{
p->prev->next = NULL;
delete p;
break;
}
else
{
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
p = qu;
}
}
}
system("cls");
cout<<" *** *** ***\n\n Удаление дупликатов выполнено \n\n *** *** ***";
}
if (first->str == "0")
msg_clr_queue();
}
int main()
{
setlocale(LC_ALL,"Russian");
char action = ' ';
queue* first = new queue;
first = NULL;
while (action != '0')
{
if (!first)
{
printf("\n _____________\n 1- Новая очередь. \n 2- Открыть очередь из файла \n 0 - Выход \n \n");
//cin>>action;
//scanf("%c",&action);
action=getchar();
switch (action)
{
case '1': first = create_queue ();break;
case '2': first = intake_file (first);break;
default: error_msg ();break;
}
}
else
{
cout<< "\n --- --- --- \n 1 - Добавить элемент\n 2 - Поиск элемента\n 3 - Вывод на экран\n 4 - Удаление повторяющихся элементов\n 5 - Количество элементов\n 6 - Реверс\n 7 - Запись в файл\n 8 - Удаление очереди\n 0 - выход\n\n Ваш выбор: ";
//cin>>action;
//scanf("%c",&action);
action=getchar();
switch (action)
{
case '1': add_container (first);break;
case '2': search_container (first);break;
case '3': lead_all (first);break;
case '4': remove_doubling (first);break;
case '5': amount (first);break;
case '6': reverse (first);break;
case '7': save_file (first);break;
case '8': first = delete_all (first);break;
case '0': first = exit_menu (first);break;
default: error_msg();break;
}
}
}
return 0;
}