Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 4

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 23.11.2024

Лабораторная работа №4.

Исследование динамических структур данных.

Односвязные и двухсвязные списки

Теоретическая часть.

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

Списком называется упорядоченное множество, состоящее из переменного числа элементов, к которым применимы операции включения, исключения. Список, отражающий отношения соседства между элементами, называется линейным.

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

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

Линейные связные списки являются простейшими динамическими структурами данных. Из всего многообразия связанных списков можно выделить следующие основные:

  •  однонаправленные (односвязные) списки;
  •  двунаправленные (двусвязные) списки;
  •  циклические (кольцевые) списки.

В основном они отличаются видом взаимосвязи элементов и/или допустимыми операциями.

Однонаправленные (односвязные) списки

Наиболее простой динамической структурой является однонаправленный список, элементами которого служат объекты структурного типа.

Однонаправленный (односвязный) список – это структура данных, представляющая собой последовательность элементов, в каждом из которых хранится значение и указатель на следующий элемент списка (рис. 29.1). В последнем элементе указатель на следующий элемент равен NULL.

Описание простейшего элемента такого списка выглядит следующим образом:

struct имя_типа { информационное поле; адресное поле; };

где информационное поле – это поле любого, ранее объявленного или стандартного, типа;

адресное поле – это указатель на объект того же типа, что и определяемая структура, в него записывается адрес следующего элемента списка.

Например:

struct Node{

 int key;//информационное поле

   Node*next;//адресное поле

};

Информационных полей может быть несколько.

Например:

struct point{

 char *name;//информационное поле

 int age;//информационное поле

 point *next;//адресное поле

};

Каждый элемент списка содержит ключ, который идентифицирует этот элемент. Ключ обычно бывает либо целым числом, либо строкой.

Основными операциями, осуществляемыми с однонаправленными списками, являются:

  •  создание списка;
  •  печать (просмотр) списка;
  •  вставка элемента в список;
  •  удаление элемента из списка;
  •  поиск элемента в списке
  •  проверка пустоты списка;
  •  удаление списка.

Особое внимание следует обратить на то, что при выполнении любых операций с линейным однонаправленным списком необходимо обеспечивать позиционирование какого-либо указателя на первый элемент. В противном случае часть или весь список будет недоступен.

Рассмотрим подробнее каждую из приведенных операций.

Для описания алгоритмов этих основных операций используется следующее объявление:

struct Single_List {//структура данных

  int Data; //информационное поле

  Single_List *Next; //адресное поле

};

. . . . . . . . . .

Single_List *Head; //указатель на первый элемент списка

Single_List *Current; //указатель на текущий элемент списка (при необходимости)

Создание однонаправленного списка

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

//создание однонаправленного списка (добавления в конец)

void Make_Single_List(int n, Single_List** Head){

 if (n > 0) {

   (*Head) = new Single_List();

   //выделяем память под новый элемент

   cout << "Введите значение ";

   cin >> (*Head)->Data;

   //вводим значение информационного поля

   (*Head)->Next=NULL;//обнуление адресного поля

    Make_Single_List(n-1,&((*Head)->Next));

 }

}

Печать (просмотр) однонаправленного списка

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

//печать однонаправленного списка

void Print_Single_List(Single_List* Head) {

 if (Head != NULL) {

   cout << Head->Data << "\t";

   Print_Single_List(Head->Next);

   //переход к следующему элементу

 }

 else cout << "\n";

}

Вставка элемента в однонаправленный список

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

/*вставка элемента с заданным номером в однонаправленный список*/

Single_List* Insert_Item_Single_List(Single_List* Head,

     int Number, int DataItem){

 Number--;

 Single_List *NewItem=new(Single_List);

 NewItem->Data=DataItem;

 NewItem->Next = NULL;

 if (Head == NULL) {//список пуст

   Head = NewItem;//создаем первый элемент списка

 }

 else {//список не пуст

   Single_List *Current=Head;

   for(int i=1; i < Number && Current->Next!=NULL; i++)

   Current=Current->Next;

   if (Number == 0){

   //вставляем новый элемент на первое место

     NewItem->Next = Head;

     Head = NewItem;

   }

   else {//вставляем новый элемент на непервое место

     if (Current->Next != NULL)

      NewItem->Next = Current->Next;

     Current->Next = NewItem;

   }

 }

 return Head;

}

Удаление элемента из однонаправленного списка

Из динамических структур можно удалять элементы, так как для этого достаточно изменить значения адресных полей. Операция удаления элемента однонаправленного списка осуществляет удаление элемента, на который установлен указатель текущего элемента. После удаления указатель текущего элемента устанавливается на предшествующий элемент списка или на новое начало списка, если удаляется первый.

Алгоритмы удаления первого и последующих элементов списка отличаются друг от друга. Поэтому в функции, реализующей данную операцию, осуществляется проверка, какой элемент удаляется. Далее реализуется соответствующий алгоритм удаления.

/*удаление элемента с заданным номером из однонаправленного списка*/

Single_List* Delete_Item_Single_List(Single_List* Head,

     int Number){

 Single_List *ptr;//вспомогательный указатель

 Single_List *Current = Head;

 for (int i = 1; i < Number && Current != NULL; i++)

   Current = Current->Next;

 if (Current != NULL){//проверка на корректность

   if (Current == Head){//удаляем первый элемент

     Head = Head->Next;

     delete(Current);

     Current = Head;

   }

   else {//удаляем непервый элемент

     ptr = Head;

     while (ptr->Next != Current)

       ptr = ptr->Next;

     ptr->Next = Current->Next;

     delete(Current);

     Current=ptr;

   }

 }

 return Head;

}

Поиск элемента в однонаправленном списке

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

//поиск элемента в однонаправленном списке

bool Find_Item_Single_List(Single_List* Head, int DataItem){

 Single_List *ptr; //вспомогательным указатель

 ptr = Head;

 while (ptr != NULL){//пока не конец списка

   if (DataItem == ptr->Data) return true;

   else ptr = ptr->Next;

 }

 return false;

}

Удаление однонаправленного списка

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

/*освобождение памяти, выделенной под однонаправленный список*/

void Delete_Single_List(Single_List* Head){

 if (Head != NULL){

   Delete_Single_List(Head->Next);

   delete Head;

 }

}

Таким образом, однонаправленный список имеет только один указатель в каждом элементе. Это позволяет минимизировать расход памяти на организацию такого списка. Одновременно это позволяет осуществлять переходы между элементами только в одном направлении, что зачастую увеличивает время, затрачиваемое на обработку списка. Например, для перехода к предыдущему элементу необходимо осуществить просмотр списка с начала до элемента, указатель которого установлен на текущий элемент.

Двунаправленные (двусвязные) списки

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

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

В таком списке каждый элемент (кроме первого и последнего) связан с предыдущим и следующим за ним элементами. Каждый элемент двунаправленного списка имеет два поля с указателями: одно поле содержит ссылку на следующий элемент, другое поле – ссылку на предыдущий элемент и третье поле – информационное. Наличие ссылок на следующее звено и на предыдущее позволяет двигаться по списку от каждого звена в любом направлении: от звена к концу списка или от звена к началу списка, поэтому такой список называют двунаправленным.

Описание простейшего элемента такого списка выглядит следующим образом:

struct имя_типа {

                информационное поле;

                адресное поле 1;

                адресное поле 2;

               };

где информационное поле – это поле любого, ранее объявленного или стандартного, типа;

адресное поле 1 – это указатель на объект того же типа, что и определяемая структура, в него записывается адрес следующего элемента списка ;

адресное поле 2 – это указатель на объект того же типа, что и определяемая структура, в него записывается адрес предыдущего элемента списка.

Например:

struct list {

  type elem ;

  list *next, *pred ;

}

list *headlist;

где type – тип информационного поля элемента списка;

*next, *pred – указатели на следующий и предыдущий элементы этой структуры соответственно.

Переменная-указатель headlist задает список как единый программный объект, ее значение – указатель на первый (или заглавный) элемент списка.

Основные операции, выполняемые над двунаправленным списком, те же, что и для однонаправленного списка. Так как двунаправленный список более гибкий, чем однонаправленный, то при включении элемента в список, нужно использовать указатель как на элемент, за которым происходит включение, так и указатель на элемент, перед которым происходит включение. При исключении элемента из списка нужно использовать как указатель на сам исключаемый элемент, так и указатели на предшествующий или следующий за исключаемым элементы. Но так как элемент двунаправленного списка имеет два указателя, то при выполнении операций включения/исключения элемента надо изменять больше связей, чем в однонаправленном списке.

Рассмотрим основные операции, осуществляемые с двунаправленными списками, такие как:

  •  создание списка;
  •  печать (просмотр) списка;
  •  вставка элемента в список;
  •  удаление элемента из списка;
  •  поиск элемента в списке;
  •  проверка пустоты списка;
  •  удаление списка.

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

Для описания алгоритмов этих основных операций используется следующее объявление:

struct Double_List { //структура данных

   int Data; //информационное поле

   Double_List *Next, //адресное поле

*Prior; //адресное поле

};

. . . . . . . . . .

Double_List *Head; //указатель на первый элемент списка

. . . . . . . . . .

Double_List *Current; //указатель на текущий элемент списка (при необходимости)

Создание двунаправленного списка

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

//создание двунаправленного списка (добавления в конец)

void Make_Double_List(int n,Double_List** Head,

        Double_List* Prior){

 if (n > 0) {

   (*Head) = new Double_List();

    //выделяем память под новый элемент

   cout << "Введите значение ";

   cin >> (*Head)->Data;

   //вводим значение информационного поля

   (*Head)->Prior = Prior;

   (*Head)->Next=NULL;//обнуление адресного поля

   Make_Double_List(n-1,&((*Head)->Next),(*Head));

 }

 else (*Head) = NULL;

}

Печать (просмотр) двунаправленного списка

Операция печати списка для двунаправленного списка реализуется абсолютно аналогично соответствующей функции для однонаправленного списка. Просматривать двунаправленный список можно в обоих направлениях.

//печать двунаправленного списка

void Print_Double_List(Double_List* Head) {

 if (Head != NULL) {

   cout << Head->Data << "\t";

   Print_Double_List(Head->Next);

   //переход к следующему элементу

 }

 else cout << "\n";

}

Вставка элемента в двунаправленный список

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


//вставка элемента с заданным номером в двунаправленный список

Double_List* Insert_Item_Double_List(Double_List* Head,

     int Number, int DataItem){

 Number--;

 Double_List *NewItem=new(Double_List);

 NewItem->Data=DataItem;

 NewItem->Prior=NULL;

 NewItem->Next = NULL;

 if (Head == NULL) {//список пуст

   Head = NewItem;

 }

 else {//список не пуст

   Double_List *Current=Head;

   for(int i=1; i < Number && Current->Next!=NULL; i++)

   Current=Current->Next;

   if (Number == 0){

   //вставляем новый элемент на первое место

     NewItem->Next = Head;

     Head->Prior = NewItem;

     Head = NewItem;

   }

   else {//вставляем новый элемент на непервое место

     if (Current->Next != NULL) Current->Next->Prior = NewItem;

     NewItem->Next = Current->Next;

     Current->Next = NewItem;

      NewItem->Prior = Current;

     Current = NewItem;

   }

 }

 return Head;

}

Удаление элемента из двунаправленного списка

Из динамических структур можно удалять элементы, так как для этого достаточно изменить значения адресных полей. Операция удаления элемента из двунаправленного списка осуществляется во многом аналогично удалению из однонаправленного списка.


/*удаление элемента с заданным номером из двунаправленного списка*/

Double_List* Delete_Item_Double_List(Double_List* Head,

     int Number){

 Double_List *ptr;//вспомогательный указатель

 Double_List *Current = Head;

 for (int i = 1; i < Number && Current != NULL; i++)

   Current = Current->Next;

 if (Current != NULL){//проверка на корректность

   if (Current->Prior == NULL){//удаляем первый элемент

     Head = Head->Next;

     delete(Current);

     Head->Prior = NULL;

     Current = Head;

   }

   else {//удаляем непервый элемент

     if (Current->Next == NULL) {

     //удаляем последний элемент

       Current->Prior->Next = NULL;

       delete(Current);

       Current = Head;

     }

     else {//удаляем непервый и непоследний элемент

       ptr = Current->Next;

       Current->Prior->Next =Current->Next;

       Current->Next->Prior =Current->Prior;

       delete(Current);

       Current = ptr;

     }

   }

 }

 return Head;

}


Поиск элемента в двунаправленном списке

Операция поиска элемента в двунаправленном списке реализуется абсолютно аналогично соответствующей функции для однонаправленного списка. Поиск элемента в двунаправленном списке можно вести:

а) просматривая элементы от начала к концу списка;

б) просматривая элементы от конца списка к началу;

в) просматривая список в обоих направлениях одновременно: от начала к середине списка и от конца к середине (учитывая, что элементов в списке может быть четное или нечетное количество).

//поиск элемента в двунаправленном списке

bool Find_Item_Double_List(Double_List* Head,

   int DataItem){

 Double_List *ptr; //вспомогательный указатель

 ptr = Head;

 while (ptr != NULL){//пока не конец списка

   if (DataItem == ptr->Data) return true;

   else ptr = ptr->Next;

   }

 return false;

}

Проверка пустоты двунаправленного списка

Операция проверки двунаправленного списка на пустоту осуществляется аналогично проверки однонаправленного списка.

//проверка пустоты двунаправленого списка

bool Empty_Double_List(Double_List* Head){

 if (Head!=NULL)  return false;

 else  return true;  

}

Удаление двунаправленного списка

Операция удаления двунаправленного списка реализуется аналогично удалению однонаправленного списка.

//освобождение памяти, выделенной под двунаправленный список

void Delete_Double_List(Double_List* Head){

 if (Head != NULL){

   Delete_Double_List(Head->Next);

   delete Head;

 }

}


Пример 1.  N натуральных чисел являются элементами двунаправленного списка L, вычислить: X1*Xn+X2*Xn-1+...+Xn*X1. Вывести на экран каждое произведение и итоговую сумму.

Алгоритм:

  1.  Создаём структуру.
  2.  Формируем список целых чисел.
  3.  Продвигаемся по списку: от начала к концу и от конца к началу в одном цикле, перемножаем данные, содержащиеся в соответствующих элементах списка.
  4.  Суммируем полученные результаты.
  5.  Выводим на печать

Создание структуры, формирование списка и вывод на печать рассмотрены ранее. Приведем функции для реализации продвижения по списку в обоих направлениях и нахождения итоговой суммы.

//поиск последнего элемента списка

Double_List* Find_End_Item_Double_List(Double_List* Head){

 Double_List *ptr; //дополнительный указатель

 ptr = Head;

 while (ptr->Next != NULL){

   ptr = ptr->Next;

 }

 return ptr;

}

//итоговая сумма произведений

void Total_Sum(Double_List* Head) {

 Double_List* lel = Head;

 Double_List* mel = Find_End_Item_Double_List(Head);

 int mltp,sum=0;

 while(lel != NULL) {

   mltp = (lel->Data)*(mel->Data);//умножение элементов

   printf("\n\n%d * %d = %d",lel->Data,mel->Data,mltp);

   sum = sum + mltp;//суммирование произведений

   lel = lel->Next;

   //идем по списку из первого элемента в последний

   mel = mel->Prior;

   //идем по списку из последнего элемента в первый

 }

 printf("\n\n Итоговая сумма равна %d",sum);

}

Ключевые термины

Двунаправленный (двусвязный) список – это структура данных, состоящая из последовательности элементов, каждый из которых содержит информационную часть и два указателя на соседние элементы.

Длина списка – это величина, равная числу элементов в списке.

Линейный список – это список, отражающий отношения соседства между элементами.

Однонаправленный (односвязный) список – это структура данных, представляющая собой последовательность элементов, в каждом из которых хранится значение и указатель на следующий элемент списка.

Пустой список – это список нулевой длины.

Связанный список – это структура, элементами которой служат записи одного формата, связанные друг с другом с помощью указателей, хранящихся в самих элементах.

Список – это упорядоченное множество, состоящее из переменного числа элементов, к которым применимы операции включения, исключения.

Указатель начала списка (голова списка) – это указатель на первый элемент списка.

Краткие итоги

  1.  Список является динамической структурой, для элементов которого определены операции включения, исключения.
  2.  В связанном списке элементы линейно упорядочены указателями, входящими в состав элементов списка.
  3.  Линейные связные списки являются простейшими динамическими структурами данных и в зависимости от организации связей делятся на однонаправленные и двунаправленные.
  4.  В однонаправленном (односвязном) списке каждый из элементов содержит информационную часть и указатель на следующий элемент списка. Адресное поле последнего элемента имеет значение NULL.
  5.  Каждый элемент списка содержит ключ, который идентифицирует этот элемент.
  6.  Основными операциями с однонаправленными списками, являются: создание списка; печать (просмотр) списка; вставка элемента в список; удаление элемента из списка; поиск элемента в списке; проверка пустоты списка; удаление списка.
  7.  В двунаправленном (двусвязном) списке каждый из элементов содержит информационную часть и два указателя на соседние элементы.
  8.  Основные операции, выполняемые над двунаправленным списком, те же, что и для однонаправленного списка.


Задания к лабораторной работе.

Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем. Порядок выполнения работы:

Проработать примеры, приведенные в лабораторной работе.

Составить программу с использованием обоих видов списков для решения задачи. Номер варианта определяется по формуле, где    - номер студента по списку преподавателя.

Индивидуальное задание. Вариант:

  1.  Ввести список из 10 элементов, найти наибольший элемент и  переставить его с первым элементом. Преобразованный список вывести.
  2.  Ввести список из 10 элементов, найти произведение положительных элементов и вывести его на экран.
  3.  Ввести список из 10 элементов, найти наименьший элемент и  переставить  его с последним элементом. Преобразованный список вывести.
  4.  Ввести список из 10 элементов, найти сумму отрицательных  элементов и вывести ее на экран.
  5.  Ввести список из  10  элементов, найти  сумму  элементов,  больших 3 и меньших 8 и вывести ее на экран.
  6.  Ввести список из  10  элементов, найти  разность положительных элементов,  и вывести ее на экран.
  7.  Ввести список из 10 элементов, найти произведение отрицательных  элементов и вывести его на экран.
  8.  В заданном списке подсчитать число нулевых элементов и вывести на экран их индексы.
  9.  Составить программу, выдающую индексы заданного элемента или сообщающую, что такого элемента в списке нет.
  10.  Ввести список из 10 элементов, найти произведение положительных элементов кратных 3, их количество и вывести результаты на экран.
  11.  Ввести список из 10 элементов, найти сумму отрицательных  элементов кратных 7, их количество и вывести результаты на экран.
  12.  Ввести список из  10  элементов, найти  сумму  элементов,  больших 2 и меньших 20 и кратных 8, их количество и вывести результаты на экран.
  13.  Ввести список из  10  элементов, найти  сумму  элементов,  меньших по модулю 3 и кратных 9, их количество и вывести результаты на экран.
  14.  Ввести список из 10  элементов, найти  разность положительных элементов кратных 11, их количество и вывести результаты на экран.
  15.  Ввести список из 10  элементов, найти  произведение элементов,  больших 8 и меньших 18 и кратных 10, их количество и вывести результаты на экран.
  16.  Ввести список из 10 элементов, найти  сумму  элементов кратных 2, их количество и вывести результаты на экран.
  17.  Ввести список из 10 элементов, найти квадраты элементов кратных 4 и их количество. Преобразованный список вывести.
  18.  Ввести список из 10 элементов, найти сумму положительных элементов кратных 5, их количество и вывести результаты на экран.
  19.  Ввести список из 10 элементов. Определить количество элементов, кратных 3 и индексы последнего такого элемента.
  20.  В списках U[7],  D[7],  V[7] содержатся значения утренней, дневной и вечерней температуры соответственно за каждый день недели. Подсчитать среднее значение дневной температуры за каждый день.
  21.  В списках А[n], G[n], F[n] содержатся оценки учащихся по алгебре, геометрии и физике соответственно. Определить, по какому предмету лучше успеваемость.
  22.  В списках U[7],  D[7],  V[7] содержатся значения утренней, дневной и вечерней температуры соответственно за каждый день недели. Сформировать список S[7], в котором будут содержаться значения среднедневной температуры. Определить среднее значение температуры а неделю.
  23.  В списках А[n], G[n], F[n] содержатся оценки учащихся по алгебре, геометрии и физике соответственно. Определить среднюю оценку по алгебре и количество учащихся, не имеющих ни одной «двойки».
  24.  Определить средний рост девочек и мальчиков одного класса. В классе учится n учеников. (n > 15).
  25.  В ЭВМ по очереди поступают результаты соревнований по плаванию на дистанции 200 м, в которых участвует n спортсменов (n > 10). Выдать на экран дисплея лучший результат.
  26.  Из списка целых чисел составить три других, в первый из которых записать числа, кратные 5, во второй - числа, кратные 7, а в третий - остальные числа.
  27.  Для заданного списка определить, каких элементов больше: положительных или отрицательных. Вывести на экран их количество.
  28.  В заданном одномерном списке все отрицательные элементы заменить нулями и подсчитать их количество.


Контрольные вопросы

  1.  Любой ли список является связным? Обоснуйте ответ.
  2.  В чем отличие первого элемента однонаправленного (двунаправленного) списка от остальных элементов этого же списка?
  3.  В чем отличие последнего элемента однонаправленного (двунаправленного) списка от остальных элементов этого же списка?
  4.  Почему при работе с однонаправленным списком необходимо позиционирование на первый элемент списка?
  5.  Почему при работе с двунаправленным списком не обязательно позиционирование на первый элемент списка?
  6.  В чем принципиальные отличия выполнения добавления (удаления) элемента на первую и любую другую позиции в однонаправленном списке?
  7.  В чем принципиальные отличия выполнения основных операций в однонаправленных и двунаправленных списках?
  8.  С какой целью в программах выполняется проверка на пустоту однонаправленного (двунаправленного) списка?
  9.  С какой целью в программах выполняется удаление однонаправленного (двунаправленного) списка по окончании работы с ним? Как изменится работа программы, если операцию удаления списка не выполнять?




1. Общая генетика
2. Процессуальные особенности рассмотрения и разрешения дел о взыскании алиментов
3. Економіка підприємства п-п П
4. Радиостанции дальней связи
5. Тематический план лекционного курса по Правоведению на лечебном факультете на 3 семестр.
6. Определение основных критериев правильного выполнения ООХ
7. преподавательского состава и работников высшей школы посвящённой XXII зимним Олимпийским играм в Сочи
8. Школа ниндзяТайны воинов тьмы
9. Гомеопатия
10. cephlo cephli somto som osteo cro cri stetho spondylo crdio crdium rthro stomto glosso glossi rhino
11. где fэ ' фактор эквивалентности магния равный MMg ' молярная масса магния равная 24 г-моль
12. Лабораторная работа- Разработка плана классного руководителя
13. хронический алкоголизм исключен из использования в классификациях вместо него в МКБ10 введен термин синд.
14. РИНХ Факультет коммерции и маркетинга Рассмотрено и
15. Генетическая инженерия
16. Тема- Дослiдження трифазного кола змiнного струму
17. } Лизинг ~ это- {~форма кредитования приобретения основных фондов и материальных запасов дл
18. задание оценивается в 25 балла.1
19. ст. л. майонеза соль по вкусу зеленый лук.html
20. Доклад- Украинский фондовый рынок