Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба Богдик.doc
Скачиваний:
6
Добавлен:
11.06.2015
Размер:
137.73 Кб
Скачать

Листинг кода

#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;

}

14