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

UptoLike

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

Инициализировать непустой список во время компиляции трудно, поэтому спи-
ски создаются динамически, аналогично динамическим массивам, рассмотренным
ранее. Для начала необходимо создать первый элемент. Наиболее простой подход -
выделить под него память. Для этого создадим новую функцию FirstElement(), кото-
рая создает первый элемент, получая его значение A в качестве параметра и выделяя
под него память:
X *FirstElement(int A)
{
X *FirstX;
FirstX = (X *)malloc(sizeof(X));
FirstX->Value = A;
FirstX->Next = 0;
FirstX->Prev = 0;
return FirstX;
}
Простейший и самый быстрый способ собрать список - это добавлять новые эле-
менты в его начало, но это приводит к определенным неудобствам, поскольку список
получается собранным наоборот, первым является последний добавленный элемент. Но
в нашем случае, поскольку кроме указателя на начало, имеется указатель на конец спи-
ска, нет больших сложностей в добавлении элемента в конец списка. Продемонстрируем
эту возможность функцией AddElement(), которая вставляет элемент A в список (в дан-
ном примере *EndX - указатель на конец списка):
void AddElement(X **EndX, int A)
{
X *NewX;
NewX = (X *)malloc(sizeof(X)); //Выделяем память
NewX->Value = A;
NewX->Next = 0; //Корректируем указатель на конец списка
NewX->Prev = *EndX;
(*EndX)->Next = NewX;
*EndX = NewX;
}
Поиск элемента с заданным ключом (значением) осуществляется достаточно про-
сто, перебирается весь список от начала до конца на предмет поиска определенного зна-
чения. Это демонстрируется в функции FindElement(), где ключом является значение пе-
ременной A (в данном примере *BeginX - указатель на начало списка):
X * FindElement(X * const BeginX, int A)
{ //начинаем с указателя на начало списка
X *Element = BeginX;
while (Element)
{
if(Element->Value == A)
break;
Element = Element->Next;
}
return Element;
}
64
     Инициализировать непустой список во время компиляции трудно, поэтому спи-
ски создаются динамически, аналогично динамическим массивам, рассмотренным
ранее. Для начала необходимо создать первый элемент. Наиболее простой подход -
выделить под него память. Для этого создадим новую функцию FirstElement(), кото-
рая создает первый элемент, получая его значение A в качестве параметра и выделяя
под него память:

X *FirstElement(int A)
{
       X *FirstX;
       FirstX = (X *)malloc(sizeof(X));
       FirstX->Value = A;
       FirstX->Next = 0;
       FirstX->Prev = 0;
       return FirstX;
}

      Простейший и самый быстрый способ собрать список - это добавлять новые эле-
менты в его начало, но это приводит к определенным неудобствам, поскольку список
получается собранным наоборот, первым является последний добавленный элемент. Но
в нашем случае, поскольку кроме указателя на начало, имеется указатель на конец спи-
ска, нет больших сложностей в добавлении элемента в конец списка. Продемонстрируем
эту возможность функцией AddElement(), которая вставляет элемент A в список (в дан-
ном примере *EndX - указатель на конец списка):

void AddElement(X **EndX, int A)
{
      X *NewX;
      NewX = (X *)malloc(sizeof(X)); //Выделяем память
      NewX->Value = A;
      NewX->Next = 0; //Корректируем указатель на конец списка
      NewX->Prev = *EndX;
      (*EndX)->Next = NewX;
      *EndX = NewX;
}

      Поиск элемента с заданным ключом (значением) осуществляется достаточно про-
сто, перебирается весь список от начала до конца на предмет поиска определенного зна-
чения. Это демонстрируется в функции FindElement(), где ключом является значение пе-
ременной A (в данном примере *BeginX - указатель на начало списка):

X * FindElement(X * const BeginX, int A)
{ //начинаем с указателя на начало списка
       X *Element = BeginX;
       while (Element)
       {
               if(Element->Value == A)
                      break;
               Element = Element->Next;
       }
       return Element;
}

                                            64