Программирование на языке высокого уровня. Марапулец Ю.В. - 65 стр.

UptoLike

Составители: 

Более сложно решается задача вставки элемента в заданное место списка (до или
после элемента с заданным ключом). После вставки в этом случае необходимо обновить
все связи между элементами в списке. Удобно для выполнения данной операции перво-
начально воспользоваться функцией поиска, представленной ранее. Рассмотрим алго-
ритм решения этой задачи на примере функции InsertElement(), которая вставляет эле-
мент A после заданного элемента Key:
X * InsertElement(X * const BeginX, X **EndX, int Key, int A)
{
if(X *KeyX = FindElement(BeginX, Key)) //Если Key найден
{
X *Element;
Element = (X *)malloc(sizeof(X)); //Выделяем память
Element->Value = A; //Присваиваем значение A
// Связываем новый элемент с последующим
Element->Next = KeyX->Next;
// Связываем новый элемент с предыдущим
Element->Prev = KeyX;
// Связываем предыдущий элемент с новым
KeyX->Next = Element;
// Связываем последующий элемент с новым
if( KeyX != *EndX)
(Element->Next)->Prev = Element;
// Или обновляем указатель на конец списка, если вставка в конец
else
*EndX = Element;
return Element;
}
return 0;
}
Задача удаления заданного элемента близка к задаче вставки. В этом случае так же
необходимо первоначально найти элемент, затем его удалить и обновить связи. Следует
учесть, что технология удаления зависит от местоположения элемента в списке. Исход-
ный код такой задачи демонстрируется функцией RemoveElement():
bool RemoveElement(X **BeginX, X **EndX, int Key)
{
if(X *KeyX = FindElement(*BeginX, Key)) //Если Key найден
{
if (KeyX == *BeginX)//Если элемент в начале списка
{ //то корректировка указателя на начало списка
*BeginX = (*BeginX)->Next;
(*BeginX)->Prev =0;
}
else if (KeyX == *EndX) //Если элемент в конце списка
{ //то корректировка указателя на конец списка
*EndX = (*EndX)->Prev;
(*EndX)->Next =0;
}
else
{ //Если элемент в середине списка
65
     Более сложно решается задача вставки элемента в заданное место списка (до или
после элемента с заданным ключом). После вставки в этом случае необходимо обновить
все связи между элементами в списке. Удобно для выполнения данной операции перво-
начально воспользоваться функцией поиска, представленной ранее. Рассмотрим алго-
ритм решения этой задачи на примере функции InsertElement(), которая вставляет эле-
мент A после заданного элемента Key:

X * InsertElement(X * const BeginX, X **EndX, int Key, int A)
{
       if(X *KeyX = FindElement(BeginX, Key)) //Если Key найден
       {
               X *Element;
               Element = (X *)malloc(sizeof(X)); //Выделяем память
               Element->Value = A; //Присваиваем значение A
// Связываем новый элемент с последующим
               Element->Next = KeyX->Next;
// Связываем новый элемент с предыдущим
               Element->Prev = KeyX;
// Связываем предыдущий элемент с новым
               KeyX->Next = Element;
// Связываем последующий элемент с новым
               if( KeyX != *EndX)
                       (Element->Next)->Prev = Element;
// Или обновляем указатель на конец списка, если вставка в конец
               else
                       *EndX = Element;
               return Element;
       }
       return 0;
}

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

bool RemoveElement(X **BeginX, X **EndX, int Key)
{
       if(X *KeyX = FindElement(*BeginX, Key)) //Если Key найден
       {
              if (KeyX == *BeginX)//Если элемент в начале списка
              { //то корректировка указателя на начало списка
                       *BeginX = (*BeginX)->Next;
                       (*BeginX)->Prev =0;
              }
              else if (KeyX == *EndX) //Если элемент в конце списка
              { //то корректировка указателя на конец списка
                       *EndX = (*EndX)->Prev;
                       (*EndX)->Next =0;
              }
              else
              { //Если элемент в середине списка

                                           65