Алгоритм вставки элемента в список после элемента с указанным ключом

      Комментарии к записи Алгоритм вставки элемента в список после элемента с указанным ключом отключены

Вставить в список элемент после элемента, значение информационной части (ключ) которого совпадает со значением, введенным с клавиатуры.

Решение данной задачи проводится в два этапа – поиск и вставка.

Первый этап аналогичен рассмотренному в алгоритме удаления, а второй проводится только при условии, что искомый элемент найден, т.е. указатель на него key не равен NULL.

Этап второй – вставка

1. Захватываем память под новый элемент

t = (Spis*) malloc(sizeof(Spis));

2. Формируем информационную часть:

scanf(“%d”, t — info);

3. Связываем новый элемент с предыдущим

t — Prev = key;

4. Связываем новый элемент со следующим

t — Next = key — Next;

5. Связываем предыдущий элемент с новым

key — Next = t;

6. Если элемент добавляется не в конец списка (как показано на схеме ниже), т.е. key != end, то

( t — Next ) — Prev = t;

7. Иначе, если key = end, то указатель key-Next равен NULL (в п. 4 установлено окончание списка) и новым последним становится t

end = t;

Общая схема вставки элемента:

Алгоритм освобождения памяти, занятой списком,аналогичен рассмотренному алгоритму для стека (см. разд. 15.2).

Нелинейные структуры данных

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

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

Такая конструкция данных получила название «дерево».

Дерево состоит из элементов, называемых узлами (вершинами). Узлы соединены между собой направленными дугами. В случае X®Y вершина X называется родителем, а Y – сыном (дочерью).

Дерево имеет единственный узел, не имеющий родителей (ссылок на этот узел), который называется корнем. Любой другой узел имеет ровно одного родителя, т.е. на каждый узел дерева имеется ровно одна ссылка.

Узел, не имеющий сыновей, называется листом.

Внутренний узел – это узел, не являющийся ни листом, ни корнем. Порядок узла равен количеству его узлов-сыновей. Степень дерева – максимальный порядок его узлов. Высота (глубина) узла равна числу его родителей плюс один. Высота дерева – это наибольшая высота его узлов.

Бинарные деревья

Бинарное дерево – это динамическая структура данных, в которой каждый узел-родитель содержит, кроме данных, не более двух сыновей (левый и правый).

На рисунке приведен пример бинарного дерева (корень обычно изображается сверху, хотя изображение можно и перевернуть).

Такая структура данных организуется следующим образом (N – NULL):

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

Если дерево организовано таким образом, что для каждого узла все ключи его левого поддерева меньше ключа этого узла, а все ключи его правого поддерева – больше, оно называется деревом поиска. Одинаковые ключи здесь не допускаются.

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

Сбалансированными, или AVL-деревьями, называются деревья, для каждого узла которых высoты его поддеревьев различаются не более чем на 1. Причем этот критерий обычно называют AVL-сбалансированностью в отличие от идеальной сбалансированности, когда для каждого узла дерева количество узлов в его левом и правом поддеревьях различаются не более чем на единицу [44].

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

Статьи к прочтению:

HashMap 2 Java собеседование


Похожие статьи:

  • Список переменного размера

    Министерство общего и профессионального образования Российской Федерации Самарский государственный университет Кафедра БЕЗОПАСНОСТИ ИНФОРМАЦИОННЫХ СИСТЕМ…

  • Линейные списки, стеки, очереди, бинарные деревья.

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