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

2. Блок-схема функционирования системы

Меню программы содержит следующие пункты, для удобства ключевые буквы выделяются цветом:

 P - на элемент назад

 N - на элемент вперёд

 E - ввод данных в поля элемента списка

 C - создать список (первый элемент)

 I - добавить элемент списка

 D - удалить текущий элемент списка

 Z - выполнить задание курсовой работы

 V - распечатать весь список

 Q - выйти из программы

          Для удобства пользования, если на данный момент пункт меню недоступен, его буква не выделяется цветом. 

Общая схема функционирования системы:

          Удаление текущего элемента списка.

          Рассмотрим варианты содержимого адресных полей и действия в каждой конкретной ситуации:

Поле P

Поле N

При удалении:

!NULL

!NULL

Элемент в середине списка,

в поле N предыдущего элемента пишем адрес следующего

в поле P следующего элемента пишем адрес предыдущего

освобождаем память текущего элемента

в курсор заносится адрес следующего элемента

NULL

!NULL

Элемент в начале списка

в поле P следующего элемента пишем NULL

освобождаем память текущего элемента

в курсор заносится адрес следующего элемента

!NULL

NULL

Элемент в конце списка

в поле N предыдущего элемента пишем NULL

освобождаем память текущего элемента

в курсор заносится адрес предыдущего элемента

NULL

NULL

Элемент единственный в списке

освобождаем память текущего элемента

в курсор заносится NULL

          Добавление элемента в конец списка.

1. Переходим к следующему элементу, пока не будет найдено поле N=NULL

2. Распределяем память под элемент

3. В поле N заносим новый адрес памяти

4. В поле N распределённой области заносим NULL

5. В поле P распределённой области заносим адрес текущего элемента

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

7. Присваиваем курсору адрес нового элемента


Вывод всего списка на экран:

1. Переходим к предыдущему элементу, пока не будет найдено поле P=NULL

2. Выводим на экран поля данных

3. Если поле N!=NULL переходим к следующему элементу, иначе выход

4. Переходим к п.2

          Корректировка списка

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

          Подсветка меню:

          На основании проверки

cur==NULL

Список не создан или удалён

Доступны только:

 C - создать список (первый элемент)

 Q - выйти из программы

cur!=NULL

cur->n==NULL

Нет следующего элемента

Доступны все, кроме

 P - на элемент назад

 N - на элемент вперёд

 E - ввод данных в поля элемента списка

 C - создать список (первый элемент)

cur!=NULL

cur->p==NULL

Нет предыдущего элемента

Доступны все, кроме:

 P - на элемент назад

 C - создать список (первый элемент)

cur!=NULL

cur->p!=NULL

cur->n!=NULL

Курсор не в начале и не в конце списка

Доступны все пункты, кроме

 C - создать список (первый элемент)

3. Проектный раздел

          В данной программе будут использоваться только две глобальные переменные: основная - cur и вспомогательная iid (для упрощения отладки).

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

          Для вывода на экран и получения кодов нажатых клавиш используются функции описанные в библиотеке conio.h, stdio.h

Для аварийного завершения программы используется функция описанная в библиотекеstdlib.h

создание списка - void init_list() - после распределения памяти и задания значения указателям предыдущей и следующей структур, для инициализации (чистки) полей вызывается функция void clear_cur()

добавление в конец списка новой структуры - void add_node() для инициализации (чистки) полей вызывается функция void clear_cur()

просмотр списка - void print_cur() вывод текущего элемента при перемещении по списку вперёд и назад, void print_list() для вывода на экран всего списка, void go_f() и void go_b() для перемещения по списку вперёд и назад

корректировка списка - void del_node() для удаления элемента из списка, void edit_i() для ввода данных в поля элемента списка

Приложение1: исходный текст программы

#include "stdio.h"

#include "stdlib.h"

#include "conio.h"

//Длина текстовых полей

#define charsz 64

struct items

{

   items *p;

   items *n;

   char naz[charsz];

   char avt[charsz];

   int god;

   int id;

};

items *cur=NULL;

int iid=0;

// очистить текущий элемент

void clear_cur()

{

   cur->god=0;

   for(int i=0;i<charsz;i++)

   {

       cur->naz[i]=0;

       cur->avt[i]=0;

   };

   cur->id=iid;

   iid++;

}

// создать список

void init_list()

{

   if(cur!=NULL)return;

   cur=new items;

   if(cur!=NULL)

   {

       cur->p=NULL;

       cur->n=NULL;

   }

   else

   {

        printf("can't init list!!!!\r\n");

        exit(1);

   };

   clear_cur();

};

// перевести курсор вперёд

void go_f()

{

   if(cur->n!=NULL)

     cur=cur->n;

};

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

void go_b()

{

   if(cur->p!=NULL)

     cur=cur->p;

}

// добавить элемент

void add_node()

{

   items *ni;

   while(cur->n!=NULL)go_f();

   ni=new items;

   if(ni==NULL)

   {

        printf("can't add item!!!!\r\n");

        exit(1);

   }

   ni->p=cur;

   cur->n=ni;

   ni->n=NULL;

   cur=ni;

   clear_cur();

};

// эдалить элемент под курсором

void del_node()

{

   items *ni;

   items *pi;

   if(cur==NULL) return;

   if(cur->p==NULL)

   {

      if(cur->n==NULL)

      {

      delete cur;

         cur=NULL;

      }

      else

      {

         ni=cur->n;

         delete cur;

         cur=ni;

           cur->p=NULL;

      };

   }

   else

   {

      if(cur->n==NULL)

      {

         ni=cur->p;

         delete cur;