Разработка программы для создания и работы с двусвязным списком, состоящим из структур (Структура содержит название издания, газета или журнал, цена экземпляра), страница 2

-  ei – переменная типа int, для обнаружения выполненных операций над списком в функции addkorr();

-  d – 20 переменных типа char, для временного хранения при сортировки списка.

3.2 Функции программы

3.2.1 Главная функция программы

Главной функцией программы является main(). В ней реализовано меню.

Для создания меню, используются стандартные функции и операторы:

-  while;

-  switch;

-  case;

-  break;

-  free.

В main() также описаны прототипы функций:

void create(void); – Прототип функции создать;

void list(spis *) – Прототип функции просмотр;

void add(void) – Прототип функции добавить;

void sortt(void) – Прототип функции сортировка; 

void addkorr(void) – Прототип функции корректировки.

spis *head,*tail – указатели на начало и конец списка.

с – переменная типа char, для анализа действий пользователя в меню.

3.2.2 Функция создания списка

void create (void) – функция для ввода списка в структуру данных.

spis *p,*head – указатели на структуру spis. Несет полную информацию о списке.

malloc() – выделение памяти для записи.

getch() – ожидание нажатия клавиши с клавиатуры.

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

void list (void) – функция просмотра введенного списка.

spis *p – указатель на структуру spis. Несет полную информацию о списке.

3.2.4 Функция добавления новой структуры в конец списка

void add (void) – функция для добавления в список новой структуры.

spis *p, *pn – указатели на структуру spis. Несет полную информацию о  списке.

3.2.5 Функция корректировки

void addback(void) – функция для редактирования и сортировки списка.

spis *p, *pn – указатели на структуру spis. Несет полную информацию о  списке.

sort() – функция сортировки

3.2.6. Функция сортировки данных

void sort() – функция сортировки

spis *p, *pn – указатели на структуру spis. Несет полную информацию о  списке.

strcpy() – функция копирования нуль-терминированной строки.

3.3 Работа программы

После запуска программы, на экране отображается меню пользователя.

Рис 1 – главное окно программы

Варианты выбора от 1 до 5. Любой неверный ввод возвращает меню без предварительного предупреждения пользователя.

Создание нового списка начинается сразу после нажатия клавиши 1:

Пользователю предлагается вводить издания. Для выхода в конце ввода используется клавиша <esc>.

Рис 2 - функция добавления записей

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

Функция просмотра списка вызывается клавишей 2.

Рис 3 – функция просмотра списка


4. Исходный модуль программы

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <string.h>

struct spis      //Описываем структуру

{

            char name[20];

            int type;

            int cena;

            struct spis *prev; //Ссылка на предыдущую структуру

            struct spis *next; //Ссылка на следующую структуру

};

void create(void);      //Описание функций

void list(spis *);

void add(void);

void sortt(void);

void addkorr(void);

struct spis *head,*tail;

main() //Главная функция

{

            char c; //Переменная выбора пункта меню

            while (1)

            {

                        clrscr();

                        puts(" 1 - Создать список");

                        puts(" 2 - Просмотреть список");

                        puts(" 3 - Добавить в конец списка новую структуру");

                        puts(" 4 - Коррекция списка с добавлением новой структуры");

                        puts(" 5 - Выход из программы");

                        c=getch();

                        switch(c)

                        {

                                    case '1':create();break;

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

                                    case '3':add();break;

                                    case '4':addkorr();break;

                                    case '5':return 0;

                                    default : puts("Ошибка ввода. Используйте клавиши 1-5");

                        }

            }

            free(head); // Освобождение памяти

}

void create(void) //Функция создания списка

{

            clrscr();

//Очистка экрана, описание указателей на структуру

            spis *p,*pred;

            pred=NULL;

            do //цикл создания списка

            {

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

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

                        printf("\n\nВведите название издания: "); scanf("%s",&p->name);

                        printf("Введите 0, если это журнал и 1, если газета: "); scanf("%d",&p->type);

                        printf("Укажите цену издания: "); scanf("%d",&p->cena);

                        p->prev=pred; //установка связей

                        if (pred != NULL)

                                    pred->next=p;

                        else

                                    head=p;

                                    pred=p;

                        printf("\n Для выхода нажмите <esc>");

            }while (getch()!=27);

            tail=p; //ссылка на конец списка

            tail->next=NULL;

}

void list(spis *p)  // Просмотр списка

{

            clrscr();

            printf(" -------------------------------------------------------\n");

            printf("|  Название издания  | Журнал=0 Газета=1 | Цена издания |\n");

            printf(" -------------------------------------------------------\n");

            p=head;

            while (p != NULL) //вывод списка, пока p!=NULL

            {

                        printf("\n%20s %8d %18d ",p->name,p->type,p->cena);

                        p=p->next;

            }

            printf("\n\nНажмите любую клавишу для выхода в главное меню...");

            getch();

}

void add(void) //Добавление нового списка в конец структуры

{

            spis *p,*pn; //указатели на структуру, очистка экрана

            clrscr();

            pn=(spis *)malloc(sizeof(spis)); //выделение памяти для списка, ввод данных