Составители:
Рубрика:
Более сложно решается задача вставки элемента в заданное место списка (до или
после элемента с заданным ключом). После вставки в этом случае необходимо обновить
все связи между элементами в списке. Удобно для выполнения данной операции перво-
начально воспользоваться функцией поиска, представленной ранее. Рассмотрим алго-
ритм решения этой задачи на примере функции 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
Страницы
- « первая
- ‹ предыдущая
- …
- 63
- 64
- 65
- 66
- 67
- …
- следующая ›
- последняя »
