Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Зачет по инфе.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
336.26 Кб
Скачать

11.2 Двусвязные списки

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

Главным преимуществом двусвязного списка перед односвязным является наличие ссылки на предыдущий узел. Недостаток двусвязного списка вытекает из его преимуществ – больший размер из-за хранения не одной, а двух ссылок.

Описание узла двусвязного списка, в целом, повторяет описание узла односвязного, но содержит ещё одну дополнительную ссылку – ссылку на предыдущий элемент.

typePdlNode = ^TdlNode;

TdlNode = record

next: PdlNode; //ссылка на следующий узел

prior: PdlNode; //ссылка на предыдущий узел

data: pointer; //ссылка да данные узла

end;

Движение в двусвязном списке возможно в обе стороны, например

CurNode:= CurNode^.next;

или

CurNode:= CurNode^.prev;

Создание двусвязного спискаДля описания двусвязного списка достаточно задать любой из узлов списка. Но удобнее описывать список первым узлом списка. Это упрощает дальнейшие манипуляции со списком.

var AList: PdlList = nil;

11.3 Кольцевые списки.

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

Вставка в кольцевой список происходит по следующей схеме.

Как можно заметить, для вставки узла A после узла B необходимо поменять местами указатели на следующий узел узлов A и B.

Теперь рассмотрим вставку одного кольцевого списка в другой (слияние списков).Вставим узел C после узла A с помощью функции slcInsertAfter.

Рассмотрим удаление из кольцевого списка. Вставим в список узел «E», принадлежащий списку, после узла «A», также принадлежащего списку. Меняем местами указатели на следующий узел для узлов «A» и «E», рисунок 13. Видно, что список распался на два кольцевых списка. Очевидно что удаление из кольцевого списка является частным случаем слияния списков. Учитывая это составим подпрограммы для удаления и вставки элементов в кольцевой односвязный список.

12. Отладка программ.

12.1 Виды программных ошибок.

Все ошибки делятся на синтаксические и логические. Наличие синтаксических ошибок (ошибок в написании операторов) проверяется на этапе компиляции программы. При наличие синтаксических ошибок компилятор останавливает компиляцию и выводит сообщение об ошибке. Подобные ошибки исправляются проще всего.

Логические ошибки – это ошибки, при которых программа работает, но неправильно, выдавая не те результаты, которые ожидает разработчик или пользователь. Другое наименование таких ошибок – ошибки времени выполнения (runtime errors). Логические ошибки исправить сложнее, чем синтаксические, иногда для этого приходится переписывать отдельные участки программы, а иногда перерабатывать весь алгоритм.

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

Вызвать окно сообщений компилятора можно через меню «Compile» или просто нажав F12.