Главная  Полное построение алгоритма 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [ 18 ] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

в массивах. В эту обработку входит инициализация, поиск, хранение и модификация.

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

esioo

исключить 3

ИСКЛЮЧИТЬ 8 9 10

ADAMS

BUCHANAN

GRANT

HARRISON

JACKSON

KENNEDY

LINCOLN

ROOSEVELT

TRUMAN

WASHINGTON

1 2 3

ДОБАВИТЬ Б 6 7 8 S

CS100

ADAMS

BUCHANAN

HARRISON

JACKSON

JEFFERSON

KENNEDY

LINCOLN

TRUMAN

WASHINGTON

Рис. 2.3.1. Переорганизация линейного списка.

Рассмотрим, например, Л-элементный массив CSIOO(A), в котором содержатся лексикографически упорядоченные имена студентов, слушающих в данный момент курс программирования CS100 (рис. 2.3.1, а). Если студенты ГРАНТ и РУЗВЕЛЬТ перестают посещать курс, а новый студент ДЖЕФФЕРСОН добавляется, то нам бы хотелось получить новый список слушателей, приведенный на рис. 2.3.1, б. Подумайте о трудности и стоимости написания и выполнения программы, которая смогла бы перестроить массив CS100 в соответствии с этими изменениями. С другой стороны, связанный список представляет собой структуру данных, которая требует дополнительной памяти, но позволяет легко вносить такие изменения.

Связанные списки

На рис. 2.3.2, а массив CS100 преобразован из одномерного в двумерный массив CS100L. В столбце 1 массива CS100L по-прежнему содержатся фамилии студентов, зачисленных на курс CS100, хотя, как



явствует из рис 2 3.2, б, теперь уже не требуется, чтобы зги фамилии были упорядочены по алфавиту. В столбце 2 массива CS100L содержатся неотрицательные целые числа, называемые связями или указателями, значениями которых являются номера строк массива, содержащих фамилию следующего студента (в алфавитном порядке) в текущем

CS100L

ИНФО

СВЯЗЬ 2

ADAMS

BUCHANAN

ИСКЛЮЧИТЬ 3

GRANT

HARRISON

JACKSON

KENNEDY

LINCOLN

ИСКЛЮЧИТЬ S

ROOSEVELT

TRUMAN

WASHINGTON

CSlOOt


Рис. 2.3.2. Переорганизация связанного списка.

списке. Звездочкой (*) мы отметили те указатели, значения которых изменились в связи с удалением фамилий GRANT и ROOSEVELT и добавлением JEFFERSON. Заметим, что на рис. 2.3.2, б:

ADAMS указывает на BUCHANAN [CS100L (1, 2)=2 и CS100L(2, 1)=BUCHANAN].

BUCHANAN указывает на HARRISON [CS100L(2, 2)=4 и CS100L(4, 1)=HARRIS0N]. JACKSON указывает на JEFFERSON. JEFFERSON указывает на KENNEDY и т. д.

Массив CS100L(/, J) размера Nx2 работает как линейный связанный список. Линейный связанный список - это конечный набор пар, каждая из которых состоит из информационной части INFO (ИНФО) и указующей части LINK (СВЯЗЬ). Каждая пара называется ячейкой. Если мы хотим расположить ячейки в порядке сц, сц, . . . . . . , Ci„, то СВЯЗЬ ({j)=tj+i для /=1, . . . , я-1, а СВЯЗЬ(1"„)=0 и указывает на конец списка.

На рис. 2.3.3, а приведена стандартная диаграмма линейного связанного списка; на рис. 2.3.3, б приведена диаграмма связанного списка с рис. 2.3.2, б. Заметим, что GRANT и ROOSEVELT отсутствуют в списке на рис. 2.3.3, б, хотя они присутствуют на рис. 2.3.2, б как



заштрихованные элементы. При реализации связанных списков участвует переменная FIRST (ПЕРВЫЙ) или HEAD (ГОЛОВА), значение которой есть адрес первой ячейки списка (рис. 2.3.3, а).

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

Cn-I

ПЕРВЫЙ инФо связь тФо связь инФо связь инФО связь тФо связь

1 ADAMS

BUCHANAN

HARRISON

ряа 1

Ряй 2

ряй4

JACKSON

РяВ 5

JEFFERSON

РяЭ 11

KENNEDY

РяО 6

LINCOLN

TRUMAN

РяЭ?

РяЭЭ

WASHINGTON

Ряв 10

Рис. 2.3.3. Диаграммы линейных связанных списков.

Первый алгоритм будет удалять заданный элемент из связанного списка. Этот процесс иллюстрируется на рис. 2.3.4, где мы ищем ячейку сь у которой ИНФ0(1)=ТРИ, передвигая указатели PREV и PTR до тех пор, пока такая ячейка не найдена. Затем мы заменяем значение СВЯЗЬ в ячейке, на которую указывает PREV, на значение СВЯЗЬ в ячейке, на которую указывает PTR. Далее следуют блок-схема (рис. 2.3.5), формальное описание и реализация (рис. 2.3.6) этого алгоритма.

Algorithm DELETE (УДАЛЕНИЕ). Удаляется ячейка Си у которой INFO(t)=VALUE из связанного списка, первая ячейка которого задается переменной FIRST.

Шаг 1. [Выбор первой ячейки] Set PTR FIRST; PREV х- 0. Шаг 2. [Ячейка пуста?] While PTR=70 do шаг 3 od. Шаг 3. [Это она?] If INFO (PTR)=VALUE then [Это первая ячейка?]

if PREV=0 then [удалить спереди]

set FIRSTS LINK(PRT); and STOP



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [ 18 ] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

0.0018