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

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

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

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

            p=tail; //переход в конец списка

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

            pn->next=NULL;

            p->next=pn;

            tail=pn; //новый конец списка

}

void sortt(void) //Сортировка списка

{

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

            int j,x,y; //вспомогательные переменные

            char d[20];

            do

            {

                        j=1;

                        p=head; //переходим в начало списка

                        pn=p;

                        p=p->next;

                        while (p!=NULL) //пока p!=NULL

                        {

                                    if (strcmp(pn->name,p->name)>0) //Если pn>p, сортировка

                        {

                                    j=0;

                                    strcpy(d,pn->name); //d=p->name нуль-терминированной строки

                                    x=pn->type;

                                    y=pn->cena;

                                    strcpy(pn->name,p->name); //pn=p->name нуль-терминированной строки

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

                                    pn->cena=p->cena;

                                            strcpy( p->name,d);

                                    p->type=x;

                                   p->cena=y;

                        }

                        pn=p; //переход к следующему элементу списка

                        p=p->next;

                        }

            }while (j==0);

}

void addkorr(void) //Коррекция списка. Вставка новой структуры в список по алфавиту

{

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

            clrscr();

            sortt(); //вызов сортировки списка

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

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

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

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

            int j, ei; //вспомогательные переменные

            j=0; ei=0; //установка нулевых значений.

            p=head;

            do

            {

                if (strcmp(pn->name,p->name)<=0 && p->prev==NULL && ei==0)

                        //Если pn<p, это начало списка и ei=0 

                {

                        j=1; //Выход с цикла

                        p->prev=pn;

                        pn->prev=NULL;

                        pn->next=p;

                        head=pn;

                        ei=1;

                }

            if (strcmp(pn->name,p->name)<=0 && ei==0)

                        //Если pn<p, это не начало списка и ei=0

            {

                        j=1; //Выход с цикла

                                    pn->prev=NULL;

                                    pn->next=NULL;

                                    p->prev->next=pn;

                                    pn->prev=p->prev;

                                    pn->next=p;

                                    p->prev=pn;

                        ei=1;

            }

                if (p->next==NULL && ei==0)

                {

                        j=1; //Выход с цикла

                        pn->prev=NULL;

                        pn->next=NULL;

                        p->next=pn;

                        pn->prev=p;

                        ei=1;

                }

            p=p->next;

            }while (j==0);

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

            getch();

}


5. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ВЫПОЛНЕНИЯ ЗАДАНИЯ

Для тестирования программы, будет создан список из следующих записей:

-  Газета «Pravda», стоимостью 10 руб;

-  Журнал «Murzilka», стоимостью 20 руб;

-  Газета «Mos.komsomolec», стоимостью 12 руб;

-  Журнал «IT-Spec», стоимостью 100 руб;

-  Журнал «ComputerBILD», стоимостью 90 руб;

-  Газета «Kurs», стоимостью 6 руб.

Рис 4 – Меню программы

Рис 5 – Ввод данных в список

Рис 6 – Просмотр списка

Рис 7 – добавить новую запись в конец списка

Рис 8 – Просмотр не сортированного списка

Рис 9 – Корректировка, добавление нового издания

Рис 10. Посмотреть список

На рисунках видно, что при использовании пункта 4 – Корректировка, новое издание вставляется в список по алфавиту. При каждом использовании пункта 4, список будет предварительно сортироваться.


Заключение

Выполнив курсовую работу, я изучил динамические структуры, которые   представляют собой удобное хранилище данных, количество которых может быть заранее неизвестно.

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

Однако, следует отметить, что понять работу динамических списков на первый взгляд очень сложно, а также достаточно сложны алгоритмы работы с структурами. Самым важным моментом при работе с динамическими структурами, являются указатели. Потеряв или ошибочно сделав связь, можно потерять часть списка.


Литература

1.  Пахомов Б.И. C/C++ и Borland С++ Builder для начинающих. – СПб.: БХВ-Петергбург, 2007.

2.  Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих / Пер. с англ. – М.: Мир, 1988. – 512 с.

3.  Подбельский В. В. Практикум по программированию на языке Си. – М.:ЗАО Издательство БИНОМ, 2004, 576с.

4.  http://ru.wikipedia.org/ - электронная энциклопедия

5.  http://devoid.com.ua/functions-about/c-functions.html - все для программиста, описание функций.