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

Функция просмотра существующего либо загруженного списка (view) также является одной из основных функций программы, без которой создание списка не имело бы смысла.

Просмотр списка становится доступным только после создания или загрузки существующего списка из файла. Для этого в функцию включена возможность проверки существования списка в памяти. Если список не обнаружен, программа информирует пользователя об отсутствии активного списка и предлагает создать либо загрузить его.

Вывод списка на экран основан на цикле WHILE, который выполняется до тех пор, пока не будет достигнут конец списка NULL. Помимо вывода на экран в цикле присутствует функция подсчета выведенных записей основанная на переменной i типа integer равной 1. После каждого «витка» цикла значение переменной увеличивается на 1.

Вывод на экран отформатирован с использованием знаков табуляции для выравнивания элементов записей, что позволяет представить список графически в виде таблицы разделенной полями.

После вывода на экран всех записей выводится значение переменной i соответствующей количеству выведенных записей.

Переход в главное меню осуществляется путем нажатия на любую клавишу.

Исходный код функции

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();

  }

}

//Заголовок функции

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

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

//Переход к выводу списка

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

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

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

//name- наименование товара

//prc – цена товара

//col - количество

//i – нумерация строки

//Счетчик выведенных строк

//Вывод итоговой строки с записей наименований товаров в списке

Функция добавления записей в список (add) также становиться доступной лишь при наличии активного списка. Проверка наличия активного списка реализована по аналогии с функцией вывода на экран. В данном случае проверка исключает возможность добавления записи в несуществующий список. Внутреннее строение функции во многом схоже с функцией создания нового списка. Основным элементом является последовательность операторов вывода наименований записей для заполнения и операторов считывания.

Новые записи добавляются в конец списка без сортировки. Выход в главное меню возможен лишь после заполнения всех «полей» новой записи.

Исходный код функции

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

  }

}

//Заголовок функции

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

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

//Переход к добавлению записей в список

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

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

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

//name- наименование товара

//prc – цена товара

//col - количество

//Связывание созданной записи с предыдущей и последующей

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

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

Функция удаления заданной записи из списка (erase) основана на поиске записи по наименованию товара с последующим удалением найденной записи.

После вызова функции происходит стандартная проверка наличия активного списка, после чего происходит переход непосредственно к выполнению операции удаления, которая начинается с запроса наименования удаляемого товара.

Исходный код функции

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;

    }

  }

}

//Заголовок функции

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

//mas –временный массив символов

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

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

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

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

//Если запись найдена

//Переход к удалению записи в зависимости от её положения в списке

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

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

//Удаление любой позиции в списке