Реферат: Двунаправленный динамический список

Написать программное изделие на двух языках программирования: C, Pascal.

Описание алгоритма программы со структурой данных

Взаимодействие программы с пользователем должно быть реализовано по следующему алгоритму:

Выбор из главного меню одной из следующих функций:

а) Добавить;

б) Удалить;

в) Просмотреть;

г) Сортировать;

д) Выход.

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

При выборе функции «Выход» работа программы завершается.

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

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

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

При выборе функции «Сортировать», происходит сортировка списка по фамилии. Если в списке встречаются две одинаковые фамилии, тогда сравниваются имена; при совпадении имён сравниваются отчества.

Описание программы

Для реализации динамического списка в программе применён тип указателей, указывающий на запись ”Inform”, содержащую фамилию ”fam”, имя ”name”, отчество ”fanem”, день рождения ”bethday”, знак зодиака ”zodiak” и указатели на следующий ”next” и предыдущий ”prev” элементы списка.

С помощью этого типа ”Ukazat” описаны переменные: “temp” – для хранения указателя на текущий элемент; “first” – для хранения указателя на первый элемент в списке; “cut” – для хранения на последний элемент в списке. Переменная “ch” используется для выбора процедуры; “s1”, “s2”, “n” – для вычисления знака зодиака; “m” – для проверки условия, при сортировке; “ffam”, “fname”, “ffanem” – для временного хранения фамилии, имени, отчества, при удалении элемента из списка.

Программа начинает выполняться с присвоения указателю на первый элемент (first) значения “nil”. После этого пользователю предлагается выбрать действие: «1-Добавить», «2-Удалить», «3-Просмотреть», «4-Сортировать», «0-Выход». В зависимости от того, какое действие выберет пользователь, начнёт выполняться та или иная процедура, или произойдёт выход из программы. Это реализовано с помощью операции выбора “case”.После выполнения некоторой процедуры пользователю вновь предлагается выбрать одно из вышеуказанных действий, пока не будет выбран выход из программы. Это реализовано с помощью цикла “repeat until”.

Процедура добавления “Dobav”.

Сначала выделяется память под текущий элемент (new(temp)), затем в этот элемент записывается фамилия, имя, отчество и дата рождения. По дате рождения вычисляется знак зодиака. Для этого в s2 записывается число рождения, а в s1 первые три буквы месяца рождения, затем, путём сравнения этих переменных с числами и частями слов находится соответствующий знак зодиака, и заносится в текущий элемент. После ввода информации, проверяется наличие элементов в списке. Если они отсутствуют, то в текущем элементе, указателям на следующий (next) и предыдущий (prev) элементы присваивается значение “nil”; а указатель на сам элемент (temp) присваивается указателям на первый (first) и последний (cut) элементы в списке. Если список не пустой, то в текущем элементе, указателю на следующий элемент (next) присваивается значение “nil”, а указателю на предыдущий элемент (prev) присваивается указатель на последний элемент (cut) в списке; а указателю на следующий элемент (next) последнего элемента в списке и указателю на последний элемент (cut) присваивается указатель на текущий элемент (temp). После чего процедура добавления завершается.

Процедура удаления “Udal”.

В этой процедуре сначала проверяется наличие элементов в списке. Если список пуст, то выводится сообщение: «Таблица пуста». Если же список содержит элементы, то пользователю предлагается ввести фамилию, имя и отчество удаляемого, записывая их в ffam, fname, ffanem соответственно. После происходит поиск удаляемого элемента в списке. Это реализовано с помощью цикла, который выполняется, пока элемент не найден или не просмотрен весь список. Если искомый элемент отсутствует, то выводится сообщение: «Такого нет». Если же искомый элемент найден, то текущий указатель (temp) показывает на него, и происходит его удаление.

Если указатели на первый (first) и последний (cut) элементы не равны, то происходит поиск местонахождения элемента в списке. Если внутри текущего элемента указатель на предыдущий элемент (prev) равен nil, тогда указателю на предыдущий элемент (prev) внутри следующего за текущим элементом присваивается указатель на предыдущий элемент внутри текущего, а указателю на первый элемент (first) в списке присваивается указатель на следующий элемент. Если внутри текущего элемента указатель на следующий элемент (next) равен nil, тогда указателю на следующий элемент (next) внутри предыдущего перед текущим элементом присваивается указатель на следующий элемент внутри текущего, а указателю на последний элемент (cut) в списке присваивается указатель на предыдущий элемент. Если текущий элемент оказался «внутри» списка, тогда указателю на следующий элемент (next) внутри предыдущего перед текущим элементом присваивается указатель на следующий элемент внутри текущего, а указателю на предыдущий элемент (prev) внутри следующего за текущим элементом присваивается указатель на предыдущий элемент внутри текущего.

Если же указатели на первый (first) и последний (cut) элементы равны, то указателю на первый элемент в списке (first) присваивается nil.

После некоторых преобразований внутри списка происходит освобождение памяти текущего элемента (dispose(temp)). На этом процедура удаления завершается.

Процедура просмотра “Prosm”.

Эта процедура выполняет вывод содержимого списка в виде таблицы.

Сначала на дисплей выводится шапка таблицы, содержащая: «Фамилия Имя Отчество», «Дата рождения» и «Знак зодиака». После вывода шапки проверяется наличие элементов в списке.

Если список содержит элементы, то происходит их построчный вывод. Это реализовано с помощью цикла, который выполняется, пока указатель на текущий элемент (temp) не переберёт все элементы списка. В цикле вычисляется длина фамилии, имени и отчества, после чего они выводятся на дисплей, а за ними выводятся дата рождения и знак зодиака; затем указателю на текущий элемент (temp) присваивается указатель на следующий за ним элемент.

К-во Просмотров: 478
Бесплатно скачать Реферат: Двунаправленный динамический список