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;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.