Разработка приложения для создания двусвязных кольцевых списков

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 04.05.2014
Размер файла 1,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

ВВЕДЕНИЕ

1. Состав проекта

1.1 Формы

1.2 Модули

2. Статические данные и структуры

3. Логическая структура данных

4. Логические схемы операций

5. Алгоритмы обработки основных структур

5.1 Добавление нового элемента

5.2 Удаление элемента

6. Руководство пользователя

ЗАКЛЮЧЕНИЕ

ПРИЛОЖЕНИЕ

ВВЕДЕНИЕ

Любая программа представляет собой не только набор операторов и ключевых слов, но также совокупность информационных объектов, действия над которыми записаны в этих операторах. В любом операторе фигурируют объекты называемые данными. Значение данного, относящегося к любому из таких типов логически неразделимо. Поэтому такие данные называются неструктурированными. Из них формируются структуры данных.

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

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

Связный список - структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка. Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями.

1. Состав Delphi проекта

1.1 Формы

При запуске программы на экране появляется главная форма (Рисунок 1).

Рисунок 1 - Главная форма программы

1.2 Модули

двусвязный кольцевой список приложение

Программа представлена в виде трех модулей:

- UnitFourthPlex.pas

- UnitMainForm.pas

- UnitFuncs.pas

В модуле UnitFourthPlex.pas содержится класс TPlex, который позволяет работать с данными плекса. Он содержит 4 указателя на головы соответствующих списков и все необходимые методы для работы с плексом. Также в данном модуле описана запись TMember, которая представляет собой данные, которые хранятся в узлах списка, и запись TNode, которая определяет узел списка.

В модуле UnitMainForm.pas содержится описание формы для работы с пользователем.

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

2. Статические данные и структуры

Расположение элементов списка в памяти имеет следующий вид:

а) Обход списка по первым указателям (Рисунок 2);

б) Обход списка по вторым указателям (Рисунок 3);

в) Обход списка по третьим указателям (Рисунок 4);

г) Обход списка по четвертым указателям (Рисунок 5);

Рисунок 2 - Обход списка по первым указателям

Рисунок 3 - Обход списка по вторым указателям

Рисунок 4 - Обход списка по третьим указателям

Рисунок 5 - Обход списка по четвертым указателям

Ниже представлена информация о полях структуры TMember (Рисунок 6)

Рисунок 6 - Объект записи Tmember

3. Логическая структура данных

Логическая структура двусвязного кольцевого списка имеет вид, представленный на рисунке 6.

Рисунок 6 - Структура списка

Каждый элемент имеет указатели на следующий элемент соответствующего списка.

4 Логические схемы операций

Наиболее важные операции со списками:

1) Добавление элемента в конец списка (Рисунок 7, 8).

2) Исключение элемента (Рисунок 9, 10).

Рисунок 7 - Перед добавлением элемента в конец списка

Рисунок 8 - После добавления элемента в конец списка

Рисунок 9 - До исключения элемента из списка

Рисунок 10 - После исключения элемента из списка

При сортировке списка методом Шейкера нужно переставлять соседние элементы. Схема перестановки элементов представлена на рисунках 11, 12.

Рисунок 11 - Нахождение элементов, подлежащих перестановке

Рисунок 12 - Список после перестановки элементов

5 Алгоритмы обработки основных структур

5.1 Добавление нового элемента

Алгоритм добавления нового элемента приведен на рисунок 13.

Рисунок 13 - Добавление нового элемента

5.2 Удаление элемента

Алгоритм добавления нового элемента приведен на рисунке 14.

Рисунок 14 - Удаление элемента

6/ Руководство пользователя

При запуске программы появляется главное окно (Рисунок 15).

Рисунок 15 - Начало работы

На форме содержится 5 таблиц с исходными данными, которые пользователь может редактировать. По нажатию кнопки «Добавить …», расположенной перед каждой таблицей, пользователю предоставляется пустая строка для добавления новой информации (Рисунок 16).

Рисунок 16 - Добавление информации в таблицы с данными

Для отображения списка жильцов по определенному атрибуту на форме имеется кнопка «Заполнить список» и таблица для отображения информации. Если выбрать нужный атрибут и нажать на данную кнопку, таблица заполнится нужной информацией (Рисунок 17).

Рисунок 17 - Вывод полученного списка

ЗАКЛЮЧЕНИЕ

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

Как оказалось, связанные списки - это наиболее подходящая структура для динамических данных, т.к. они могут иметь переменное количество элементов. Затраты производительности при работе со списками незначительны по сравнению с той экономией памяти и гибкостью, которые они предоставляют.

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

ПРИЛОЖЕНИЕ

// UnitFourthPlex.pas //

unit UnitFourthPlex;

interface

uses Grids;

type

TMember = record

Surname: string[32];

DCode: string[32];

SignXD: string[32];

City: string[32];

end;

TNodePtr = ^TNode;

TNode = record

Value: TMember;

NextFirst: TNodePtr;

NextSecond: TNodePtr;

NextThird: TNodePtr;

NextFourth: TNodePtr;

end;

TPlex = class

private

fFirstHead: TNodePtr;

fSecondHead: TNodePtr;

fThirdHead: TNodePtr;

fFourthHead: TNodePtr;

fCount: integer;

fNumberPointer: integer;

procedure SwapLinks(left, right: integer);

procedure AddToSecondList(newNode: TNodePtr);

procedure AddToThirdList(newNode: TNodePtr);

procedure AddToFourthList(newNode: TNodePtr);

procedure RemoveFromSecondList(node: TNodePtr);

procedure RemoveFromThirdList(node: TNodePtr);

procedure RemoveFromFourthList(node: TNodePtr);

public

function Get_pointer(Node: TNodePtr): TNodePtr;

function Get_head: TNodePtr;

procedure Set_return_pointer(attribute: integer);

procedure Print_to_Grid(Grid: TStringGrid);

function GetI(index: integer): TNodePtr;

procedure Add(value: TMember);

procedure AddToIndex(Value: TMember; Index: integer);

procedure Del(index: integer);

procedure Sort(attribute: integer);

procedure Clear;

property Count: integer read fCount;

end;

implementation

uses SysUtils;

function TPlex.Get_pointer(node: TNodePtr): TNodePtr;

begin

case fNumberPointer of

0: result := Node.NextFirst;

1: result := Node.NextSecond;

2: result := Node.NextThird;

3: result := Node.NextFourth;

end;

end;

function TPlex.Get_head: TNodePtr;

begin

case fNumberPointer of

0: result := fFirstHead;

1: result := fSecondHead;

2: result := fThirdHead;

3: result := fFourthHead;

end;

end;

procedure TPlex.Set_return_pointer(attribute: integer);

begin

fNumberPointer := attribute;

end;

procedure TPlex.Print_to_Grid(Grid: TStringGrid);

var curNode: TNodePtr;

begin

if fCount = 0 then

begin

Grid.FixedRows := 0;

Grid.RowCount := 1;

exit;

end;

Grid.RowCount := 2;

Grid.FixedRows := 1;

curNode := Get_head;

with Grid do

begin

while curNode <> nil do

begin

with curNode.Value do

begin

Cells[0,RowCount - 1] := Surname;

Cells[1,RowCount - 1] := XDCode;

Cells[2,RowCount - 1] := SignXD;

Cells[3,RowCount - 1] := City;

RowCount := RowCount + 1;

end;

curNode := Get_pointer(curNode);

end;

RowCount := RowCount - 1;

end;

end;

procedure TPlex.Add(value: TMember);

var newNode: TNodePtr;

curNode: TNodePtr;

begin

fCount := fCount + 1;

new(newNode);

newNode.Value := value;

newNode.NextFirst := nil;

newNode.NextSecond := nil;

newNode.NextThird := nil;

newNode.NextFourth := nil;

if fFirstHead = nil then

begin

fFirstHead := newNode;

fSecondHead := newNode;

fThirdHead := newNode;

fFourthHead := newNode;

exit;

end;

curNode := fFirstHead;

while curNode.NextFirst <> nil do

begin

curNode := curNode.NextFirst;

end;

curNode.NextFirst := newNode;

AddToSecondList(newNode);

AddToThirdList(newNode);

AddToFourthList(newNode);

end;

procedure TPlex.AddToSecondList(newNode: TNodePtr);

var

curNode: TNodePtr;

begin

if(fSecondHead.Value.XDCode > newNode.Value.XDCode) then

begin

newNode.NextSecond := fSecondHead;

fSecondHead := newNode;

exit;

end;

curNode := fSecondHead;

while (curNode.NextSecond <> nil) and

(curNode.NextSecond.Value.XDCode < newNode.Value.XDCode) do

begin

curNode := curNode.NextSecond;

end;

newNode.NextSecond := curNode.NextSecond;

curNode.NextSecond := newNode;

end;

procedure TPlex.AddToThirdList(newNode: TNodePtr);

var

curNode: TNodePtr;

begin

if(fThirdHead.Value.SignXD > newNode.Value.SignXD) then

begin

newNode.NextThird := fThirdHead;

fThirdHead := newNode;

exit;

end;

curNode := fThirdHead;

while (curNode.NextThird <> nil) and

(curNode.NextThird.Value.SignXD < newNode.Value.SignXD) do

begin

curNode := curNode.NextThird;

end;

newNode.NextThird := curNode.NextThird;

curNode.NextThird := newNode;

end;

procedure TPlex.AddToFourthList(newNode: TNodePtr);

var

curNode: TNodePtr;

begin

if(fFourthHead.Value.City > newNode.Value.City) then

begin

newNode.NextFourth := fFourthHead;

fFourthHead := newNode;

exit;

end;

curNode := fFourthHead;

while (curNode.NextFourth <> nil) and

(curNode.NextFourth.Value.City < newNode.Value.City) do

begin

curNode := curNode.NextFourth;

end;

newNode.NextFourth := curNode.NextFourth;

curNode.NextFourth := newNode;

end;

procedure TPlex.Del(index: integer);

var i: integer;

curNode: TNodePtr;

begin

if(index >= fCount) then

exit;

if index = 0 then

begin

RemoveFromSecondList(fFirstHead);

fFirstHead := fFirstHead.NextFirst;

exit;

end

else

begin

curNode := fFirstHead;

for i := index - 2 downto 0 do

curNode := curNode.NextFirst;

RemoveFromSecondList(curNode.NextFirst);

RemoveFromThirdList(curNode.NextFirst);

RemoveFromFourthList(curNode.NextFirst);

curNode.NextFirst := curNode.NextFirst.NextFirst;

end;

end;

procedure TPlex.RemoveFromSecondList(node: TNodePtr);

var

curNode: TNodePtr;

begin

if fSecondHead = node then

begin

fSecondHead := fSecondHead.NextSecond;

exit;

end;

curNode := fSecondHead;

while curNode.NextSecond <> node do

curNode := curNode.NextSecond;

curNode.NextSecond := curNode.NextSecond.NextSecond;

end;

procedure TPlex.RemoveFromThirdList(node: TNodePtr);

var

curNode: TNodePtr;

begin

if fThirdHead = node then

begin

fThirdHead := fThirdHead.NextThird;

exit;

end;

curNode := fThirdHead;

while curNode.NextThird <> node do

curNode := curNode.NextThird;

curNode.NextThird := curNode.NextThird.NextThird;

end;

procedure TPlex.RemoveFromFourthList(node: TNodePtr);

var

curNode: TNodePtr;

begin

if fFourthHead = node then

begin

fFourthHead := fFourthHead.NextFourth;

exit;

end;

curNode := fFourthHead;

while curNode.NextFourth <> node do

curNode := curNode.NextFourth;

curNode.NextFourth := curNode.NextFourth.NextFourth;

end;

procedure TPlex.Sort(attribute: integer );

var i: integer;

swap: boolean;

begin

if Count < 2 then

exit;

swap := true;

while swap do

begin

swap := false;

for i := 0 to Count - 2 do

if GetI(i).Value.Surname > GetI(i + 1).Value.Surname then

begin

swap := true;

SwapLinks(i, i + 1);

end;

for i := Count - 1 to 1 do

if GetI(i).Value.Surname < GetI(i - 1).Value.Surname then

begin

swap := true;

SwapLinks(i - 1, i);

end;

end;

end;

function TPlex.GetI(index: integer): TNodePtr;

var curNode: TNodePtr;

I: Integer;

begin

if(index >= Count) or (index < 0) then

exit;

curNode := fFirsthead;

for I := 0 to index - 1 do

begin

curNode := curNode.NextFirst;

end;

result := curNode;

end;

procedure TPlex.SwapLinks(left, right: integer);

var leftNode, rightNode : TNodePtr;

begin

leftNode := GetI(left);

rightNode := GetI(right);

if (left = 0) then

begin

leftNode.NextFirst := rightNode.NextFirst;

rightNode.NextFirst := leftNode;

fFirstHead := rightNode;

end

else

begin

leftNode.NextFirst := rightNode.NextFirst;

rightNode.NextFirst := leftNode;

GetI(left - 1).NextFirst := rightNode;

end;

end;

procedure TPlex.Clear;

begin

fCount := 0;

fFirstHead := nil;

fSecondHead := nil;

fThirdHead := nil;

fFourthHead := nil;

end;

procedure TPlex.AddToIndex(Value: TMember; Index: integer);

var current, NewNode: TNodePtr;

begin

if (index > fCount) then

exit;

current := fFirstHead;

new(NewNode);

NewNode.Value := Value;

if (index = 1) then

begin

NewNode.NextFirst := fFirstHead;

fFirstHead := NewNode;

AddToSecondList(NewNode);

exit;

end;

while (index > 2) do

begin

current := current.NextFirst;

dec(index);

end;

NewNode.NextFirst := current.NextFirst;

current.NextFirst := NewNode;

AddToSecondList(NewNode);

AddToThirdList(NewNode);

AddToFourthList(NewNode);

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Расположение элементов списка в памяти. Информация о полях структуры TMember. Логическая структура двусвязного кольцевого списка. Логические схемы наиболее важных операций со списками. Алгоритмы обработки основных структур. Руководство пользователя.

    курсовая работа [2,3 M], добавлен 27.08.2012

  • Разработка приложения, позволяющего автоматизировать документооборот предприятия по списанию основных средств. Мероприятия по защите и обеспечению целостности базы данных. Разработка клиентского приложения. Запросы к базе данных, руководство пользователя.

    курсовая работа [700,0 K], добавлен 14.01.2015

  • Использование основных свойств объектно-ориентированного языка программирования C ++ при написании программы по реализации списка футболистов разных амплуа. Руководство пользователя и руководство программиста. Работа со списком, программный интерфейс.

    курсовая работа [516,5 K], добавлен 20.07.2014

  • Сущность понятий: "куча" (пул памяти), связный список, синхронизация потоков; разработка программы, исключающей возможность перекрытия потоков друг другом. Организация связных списков и использование функций API для работы с пулом памяти в ОС Windows.

    курсовая работа [145,3 K], добавлен 11.05.2012

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

    лабораторная работа [788,2 K], добавлен 14.06.2009

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

    курсовая работа [2,2 M], добавлен 14.04.2019

  • Понятия и методика создания списков и баз данных в Microsoft Excel. Фильтрация списков, виды сортировки данных и структурирования листа. Сортировка с помощью списка автозаполнения и "слева направо". Создание сводки о реализации товара за один день.

    курсовая работа [618,3 K], добавлен 25.04.2013

  • Разработка приложения, которое содержит данные об экспонатах и выставках. Создание базы данных и добавление элемента с информацией в любую позицию списков. Добавление и удаление экспонатов с выставки. Сохранение всех списков в файлы, составление отчета.

    курсовая работа [1,2 M], добавлен 02.07.2014

  • Осуществление идентификации элемента внутри массива с помощью индекса (ключа). Понятие и свойства массивов, механизм их инициализации и создания. Недостатки непрерывных списков. Структура связного списка, удаление записи из него и добавление нового имени.

    презентация [868,4 K], добавлен 14.10.2013

  • Автоматизация системы снятия показаний счетчиков энергии. Разработка базы данных и клиентского приложения для структур жилищно-коммунального хозяйства, занимающихся составлением квитанций. Описание предметной области. Тестирование клиентского приложения.

    курсовая работа [953,3 K], добавлен 01.09.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.