Опубликован: 26.09.2006 | Уровень: специалист | Доступ: платный
Лекция 2:

Списки

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >

Рассмотрим основные отображения и операции на примере двустороннего списка, сформированного из узлов вида t: [\Info, \Next,
\Precede].

Будем считать, что дескриптор списка S имеет вид: [\first, \last]. Ниже условимся считать, что признак конца — \Next(\pos) = {\rm
nil}, а признак начала — \Precede(\pos) = {\rm nil}. Основные отображения определяются следующим образом:

\Info(\pos) = \pos\t{\^{}}.\info,

\Next(\pos) = \pos\t{\^{}}.{\rm next},

\Precede(\pos) = \pos\t{\^{}}.{\rm preced},

Создать пустой список S

\formula{
\t{procedure SetEmpty (S)};\\
\t{begin} \first := {\rm nil}\\
\t end
}

Удалить из списка S элемент, находящийся в позиции pos памяти

\formula{
\t{procedure Del(S, pos)};\\
\t{begin}\\
\mbox{}\q \t{t} := {\rm pos}\t{\^{}}.{\rm precede};\
\t{u}:= {\rm pos}\t{\^{}}.{\rm next};\ \t{t\^{}}.{\rm next}
:= \t{u};\ \t{u}\t{\^{}}.{\rm precede}
:= \t{t}\\
\t end;}

Замечание В теле процедуры \rm Del отсутствует параметр S. При ее использовании могут возникнуть проблемы, связанные с некорректным обращением, так как в процедуре не производится проверка, является ли позиция pos позицией какого-либо элемента списка S. Ответственность за некорректное обращение несет вызывающая программа. Проверка этого условия с помощью сканирования списка могла бы оказаться слишком дорогой и свела бы на нет преимущества использования связных списков. Еще одна проблема, связанная с выполнением этой операции, заключается в том, что узел {\rm pos}\t{\^{}} может оказаться недоступным при потере значения переменной pos, но память будет оставаться занятой. Если это нежелательно, следует, воспользовавшись системными средствами, освободить занимаемую узлом память. Замечания по поводу некорректного обращения будут справедливы и для некоторых следующих процедур, однако мы не будем каждый раз напоминать об этом.

Вставить в список S элемент e после элемента, находящегося в позиции \pos

\formula{
\t{procedure InsertAfter(S,
pos, e)};\\
\t{begin}\\
\mbox{}\q {\rm create}(\t{t}: [\t{e},\ \t{pos}\t{\^{}}.{\rm next}, \t{pos}]);\
\t{pos}\t{\^{}}.{\rm next}\t{\^{}}.{\rm preced} := \t{t};\
\t{pos}\t{\^{}}.{\rm next} := \t{t}\\
\t{end};
}

Следующие две операции рассмотрим на примере одностороннего циклического списка (см. рис. 2.4).

Добавить элемент e к концу списка S

\formula{
\t{procedure AddToEnd(e, S)};\\
\t{begin} {\rm create}
(\t{t}:\,[\t{e},\,\t{S.}{\rm last}\t{\^{}}.
{\rm next}]);\ \t{S}.{\rm last} := \t{t}\ \t{end};
}

Добавить элемент e к началу списка S

\formula{
\t{procedure AddToBegin (e,
S)};\\
\t{begin}\\
\mbox{}\q {\rm create}(\t{t}:\,[\t{e},\,\t{S}\t{\^{}}.{\rm
last}\t{\^{}}.{\rm next}]);\ \t{S}.{\rm last}\t{\^{}}.{\rm next} :=
\t{t}\\
\t end;
}

Следующие три процедуры рассмотрим на примере двустороннего циклического списка (см. рис. 2.6).

Удалить последний элемент списка S

\formula{
\t{procedure DelLast (S)};\\
\t{begin} \\
\mbox{} \q \t{t} := \t{S}.{\rm first}\t{\^{}}.{\rm precede}\t{\^{}}.
{\rm precede};\ \t{t\^{}}.{\rm next} := \t{S}.{\rm first};\ \t{S}.
{\rm first}\t{\^{}}.{\rm precede} := \t{t}\\
\t end;
}

Удалить первый элемент списка S

\formula{
\t{procedure DelFirst(S)};\\
\t{begin}\\
\mbox{}\q \t{t} := \t{S}.{\rm first}\t{\^{}}.{\rm next};\, \t{S}.
{\rm first}\t{\^{}}.{\rm precede}\t{\^{}}.{\rm next} := \t{t};\
\t{S}.{\rm first} := \t{t}\\
\t end;
}

Удалить из списка S элемент, находящийся в позиции \pos

\formula{
\t{procedure DelPosition (S,
pos)};\\
\t{begin} \\
\mbox{}\q \t{if}\ {\rm pos} =
\t{S}.{\rm first}\
\t{then} {\rm DelFirst}(\t{S})\
\t{else if}
{\rm pos} = \t{S}.{\rm last}\ \t{then}\ {\rm DelLast}(\t{S})\\
\mbox{}\q \t{else} \{\t{t\^{}}.{\rm
precede}\t{\^{}}.{\rm next}
:= \t{t\^{}}.{\rm next};\ \t{t\^{}}.{\rm next}\t{\^{}}.{\rm precede}
:= \t{t\^{}}.{\rm precede}\}\\
\t end;
}

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...
 

Дмитрий Степаненко
Дмитрий Степаненко
Россия
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ