Организация и практическое применение двусвязных линейных списков. Вариант № 5, страница 6

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <string.h>

struct item

//Создание структуры

{

  char name[20];

//переменная наименования товара

  int prc;

//переменная цены товара

  int col;

//переменная кол-во товара

  struct item *prev;

//указатель на пред.структуру

  struct item *next;

//указатель на след.структуру

};

void build(void);

//прототип функции создания списка

void view(struct item*);

//прототип функции просмотра

void add(item*);

//прототип функции добавления

void erase(void);

//прототип функции удаления

void save(struct item*);

//прототип функции сохранения

void load(void);

//прототип функции загрузки

struct item *head,  *tail;

//структура хранения

main()

{

  int c;

//переменная выбора

  while (1)

  {

    clrscr();

//вывод главного меню

    puts("\n               НАШ СКЛАД\n         журнал учета товаров");

    puts("\n ===========Выберите действие============");

    puts(" |\t\t\t\t\t|");

    puts(" | 1 - Создание нового списка\t\t|");

    puts(" | 2 - Просмотр списка\t\t\t|");

    puts(" | 3 - Добавление новой записи\t\t|");

    puts(" | 4 - Удаление записи из списка\t|");

    puts(" | 5 - Сохранение в файл\t\t|");

    puts(" | 6 - Загрузка из файла\t\t|");

    puts(" | 0 - Выход\t\t\t\t|\n ----------------------------------------");

    c = getch();

//ожидание нажатия на клавишу

    switch (c)

//переход к выполнению действий

    {

      case '1': build(); break;

//переход к функции создания списка

      case '2': view(head); break;

//переход к функции просмотра списка

      case '3': add(tail); break;

//переход к функции добавления списка

      case '4': erase(); break;

//переход к функции удаление из списка

      case '5': save(head); break;

//переход к функции сохранения списка

      case '6': load(); break;

//переход к функции загрузки списка

      case '0': return 0;

//завершение работы программы

      default:

        puts("\n\nОшибка ввода");

    }

  }

}

void build(void)

//Функция создания нового списка

{

  item *p,  *pr;

//Инициализация указателей

  pr = NULL;

  do

//Операция заполнения списка

  {

    p = (item*)malloc(sizeof(item));

//выделение памяти для новой записи

    clrscr();

    printf("\nСоздание нового списка\n---------------------------------------------\n");

//Вывод названия операции

    printf("Наименование товара : ");

//заполнение элементов новой записи

    scanf("%s", &p->name);

//считывание наименования товара

    printf("\nЦена за ед. : ");

    scanf("%d", &p->prc);

//считывание цены товара

    printf("\nКоличество: ");

    scanf("%d", &p->col);

//считывание количества товара

    p->prev = pr;

//связывание с соседними записями

    if (pr != NULL)

      pr->next = p;

    else

      head = p;

    pr = p;

    printf("\n---------------------------------------------\n\nЗакончить ввод <esc>");

//запрос на завершение операции ввода

  }

  while (getch() != 27);

//выполнение цикла до нажатия клавиши <Esc>

  tail = p;

  tail->next = NULL;

}

void view(item *p)

//Функция просмотра списка

{

  int i = 1;

//переменная для подсчета выведенных строк

  if (tail == NULL)

//проверка на наличие активаного списка

  {

    printf("\n  Список товаров отсутствует нажмите <1>\n       чтобы создать новый список,\n     либо загрузите список из файла");

//Вывод сообщение об отсутсвии списка

    getch();

//ожидание нажатия на любую клавигу

  }

  else

//переход к выполнению операции просмотра

  {

    clrscr();

    printf("Просмотр списка\n\n");

//вывод названия операции

    printf("  №  |  Наименование\t|  Цена\t|  Кол-во");

//вывод заголовков таблицы

    if (p == head)

    while (p != NULL)

//выполнение операции до достижения конца списка

    {

      printf("\n-------------------------------------------\n| %-2d |  %-15s\t|%3d\t|%3d", i, p->name, p->prc, p->col);

//вывод записей в виде таблицы

      i++;

//подсчет выведенных записей

      p = p->next;

//перемещение указателя на следующий элемент

    }

    printf("\n-------------------------------------------\n\nВсего товаров:%2d",i-1);

//вывод информации о количестве записей

    getch();

  }

}

void add(item*)

//Функция добавления записей в список

{

//

  item *p;

//инициализация указателей

  if (tail == NULL)

//проверка на наличие активного списка

  {

    printf("\n  Список товаров отсутствует нажмите <1>\n       чтобы создать новый список,\n     либо загрузите список из файла");

//Вывод сообщение об отсутсвии списка

    getch();

  }

  else

//переход к выполнению операции добавления

  {

    do

    {

      clrscr();

      printf("\nДобавление товара в список\n---------------------------------------------\n");

//вывод названия операции

      p = (item*)malloc(sizeof(item));

//выделение памяти под новую запись

      printf("Наименование товара : ");

      scanf("%s", p->name);

//считывание наименования товара

      printf("\nЦена за ед. : ");

      scanf("%d", &p->prc);

//считывание цены товара

      printf("\nКоличество: ");

      scanf("%d", &p->col);

//считывание количества товара

      tail->next = p;

//связывание с соседними записями

      p->prev = tail;

      p->next = NULL;

      tail = p;

      printf("\n---------------------------------------------\n\nЗакончить ввод <esc>");

//запрос на завершение операции добавления

    }

    while (getch() != 27);

//выполнение цикла до нажатия клавиши <Esc>

  }

}

void save(item *p)

//Функция сохранения списка в файл

{

  FILE *in;

//инициализация переменных

  if (tail == NULL)

//проверка на наличие активного списка

  {

    printf("\n  Список товаров отсутствует нажмите <1>\n       чтобы создать новый список,\n     либо загрузите список из файла");

//Вывод сообщение об отсутсвии списка

    getch();

  }

  else

//переход к выполнению операции добавления

  {

    in = fopen("data.txt", "wb");

//создание файла для сохранения

    if (in != NULL)

    {

      while (p != NULL)

//запись структуры в файл

      {

        if (!fwrite(p, sizeof(item), 1, in))

//детекция возможных ошибок

        {

          perror("Error");

          getchar();

          fclose(in);

//закрытие файла

          return ;

        }

        p = p->next;

//перемещение указателя дальше

      }

      fclose(in);

//закрытие файла

      printf("\n Список успешно сохранен в файл!");

//вывод сообщения о завершении операции

      getch();

    }

    else

    {

      printf("Ошибка! Не удалось создать файл\n");

//вывод сообщения о ошибке создания файла

      printf("Нажмите любую клавишу...\n");

      getchar();

      return ;

    }

  }

}

void load(void)

//Функция загрузки списка из файла

{

  item *p,  *pr;

//инициализация указателей и переменных

  FILE *in;

  pr = NULL;

  p = head;

  while (p != NULL)

//процедура очистка памяти

  {

//

    item *pTemp;

    pTemp = p->next;

    free(p);

    p = pTemp;

  }

  in = fopen("data.txt", "rb");

//открытие файла для чтения данных

  do

  {

    p = (item*)malloc(sizeof(item));

//выделение памяти под считанную структуру

    fread(p, sizeof(item), 1, in);

//чтение из файла 1 структуры

    p->prev = NULL;

//обнуление невалидных указателей

    p->next = NULL;

    p->prev = pr;

//связывание с соседними структурами

    if (pr != NULL)

      pr->next = p;

    else

      head = p;

    pr = p;

  }

  while (!feof(in));

//повторение процедуры до нажатия клавиши <Esc>

  tail = p->prev;

  tail->next = NULL;

  p = tail;

  printf("\n Список успешно загружен из файла!");

//вывод сообщение о завершении операции

  getch();

}

void erase(void)

//Функция удаления заданной записи

{

  item *p,  *temp;

//инициализация переменных

  char mas[20];

//временный массив структур

  if (tail == NULL)

//проверка на наличие активного списка

  {

    printf("\n  Список товаров отсутствует нажмите <1>\n       чтобы создать новый список,\n     либо загрузите список из файла");

//Вывод сообщение об отсутсвии списка

    getch();

  }

  else

//переход к выполнению операции добавления

  {

    clrscr();

    printf("\nУдаление товара из списка\n---------------------------------------------\n");

//вывод названия операции

    printf("\nВведите наименовение товара : ");

//запрос на ввод удаляемого товара

    gets(mas);

    p = head;

    while (p != NULL)

    {

      if (strcmp((p->name), mas) == 0)

//поиск заданного товара в списке

      {

        if (p == head)

//удаление записи из начала списка

        {

          head = p->next;

          head->prev = NULL;

          free(p);

          p = head;

        }

        else if (p == tail)

//удаление записи из конца списка

        {

          tail = p->prev;

          tail->next = NULL;

          free(p);

          p = tail;

        }

        else

        {

          p->next->prev=p->prev;

//удаление из любой другой позиции

          p->prev->next=p->next;

          temp = p;

          p = p->next;

          free(temp);

        }

        }

        else

          p = p->next;

//передвижение по списку

    }

  }

}