В лекции 11 даны примеры и программные реализации списков, стеков и
очередей. Неудобство включения и исключения элементов при последовательном
распределении происходит из-за того, что порядок следования элементов задается
неявно требованием, чтобы смежные элементы последовательности находились в
смежных ячейках памяти. В результате многие элементы последовательности во
время включения или исключения должны передвигаться. Если это требование опущено, то
можно выполнить
(рис 3.1) Представление последовательности $$s_1,s_2,\ldots,s_n$$ в виде связанного списка. Каждый элемент списка
состоит из поля $$INFO$$ (содержащего элемент
последовательности) и поля $$LINK$$ (содержащего адрес следующего
элемента)]
Здесь каждый
(рис 3.2) Другой, более употребительный, способ представления спискаСвязанное представление последовательностей облегчает

(рис 3.4) Исключение элемента из связанного списка(рис 3.3) Включение элемента в связанный списокИспользование связанного представления предполагает существование некоторого механизма, который по мере надобности поставляет новые ячейки и собирает старые ячейки, когда они освобождаются, но эта проблема выходит за рамки нашего курса.
Будем предполагать, с целью использования в различных алгоритмах,
существование операции порождения ячейки get_cell ;
если эта операция
присутствует в правой части оператора присваивания, то она дает get_cell для того чтобы найти значение $$l_5$$.
Проблему сбора ненужных ячеек памяти будем
полностью игнорировать, предполагая лишь, что их каким-то образом собирают для
последующего использования; такой процесс носит название
Недостаток при связанном распределении - приходится тратить память на
указатели $$P_i^{}$$. В приложениях при выборе
последовательного или связанного представления нужно сначала проанализировать
типы операций, которые будут выполняться над последовательностью.
Если операции производятся преимущественно над случайными элементами, осуществляют
поиск специфических элементов или производят упорядочение элементов, то обычно
лучше применять последовательное распределение.
Тривиальной модификацией связанного списка, изображенного на рис 3.2, будет
следующее несколько более гибкое представление последовательности: если $$P_n$$ указывает на $$s_1$$, как показано на рис.3.5, то мы
имеем так называемый
(рис 3.5) Циклический списокЕще большая гибкость достигается, если использовать
(рис 3.6) Дважды связанный списокВ комбинаторных алгоритмах особую важность представляют две структуры
данных, основанные на динамических последовательностях, т.е.
последовательностях, которые изменяются вследствие включения новых и исключения
имеющихся
элементов. В обоих случаях
Стеки и очереди имеют важное значение. Для выполнения какой-либо определенной задачи может потребоваться выполнение ряда подзадач. Каждая подзадача может также привести к другим требующим выполнения подзадачам. И стеки, и очереди являются механизмом, посредством которого запоминаются подзадачи, подлежащие выполнению, а также порядок, в котором они должны быть выполнены. В некоторых случаях порядок таков: " Первым пришел - последним ушел "; тогда удобно использовать стеки. Если порядок подчиняется правилу " Первым пришел - первым ушел ", то подходящим инструментом являются очереди.
Задача 1. Создать список,
элементами которого являются числа: 1 2 3 4 5 6 7 8 9.
Вывести список на экран терминала. Включить в
Задача 2. Очередью с приоритетом называется линейный список, который оперирует в режиме "первым включается - с высшим приоритетом исключается"; иными словами, каждому элементу очереди сопоставлено некоторое число - приоритет. Включения производятся в конец очереди, а исключения - в любом месте очереди, поскольку исключаемый элемент - это всегда элемент с высшим приоритетом. Нужно описать алгоритм (и его реализацию) включения и исключения для очередей с приоритетом.
Программа 1. Создание списка.
// Алгоритм реализован на языке программирования Turbo-C++.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
struct List{int i;
List*next;
};
List*head=NULL;
void Hed(int i)
{if(head==NULL){head=new List;
head->i=1;
head->next=NULL;
}else
{
struct List*p,*p1;
p=head;
while(p->next!=NULL)
p=p->next;
p1=new List;
p1->i=i;
p1->next=NULL;
p->next=p1;
}
}
int s=0;
void Print(List*p)
{cprintf(" %d",p->i);
if(p->next!=NULL)Print(p->next);
}
void delist()
{List*p;
while(head!=NULL)
{p=head;
head=head->next;
delete(p);
}
}
void Vstavka(int i1,int c)
{List*p=head,*p1;
while(p->i!=i1)
p=p->next;
p1=new List;
p1->i=c;
p1->next=p->next;
p->next=p1;
}
void main()
{
clrscr();
for(int i=1;i<=10;i++)
Hed(i);
textcolor(12);
Print(head);
textcolor(1);
Vstavka(10,11);
printf("\n");
Print(head);
textcolor(11);
Vstavka(3,12);
printf("\n");
Print(head);
textcolor(14);
Vstavka(5,13);
printf("\n");
Print(head);
delist();
getch();
}
Программа 2. Создание стека и работа со стеком.
//Работа со стеком
// Алгоритм реализован на языке программирования Turbo-C++.
#include <stdio.h>
#include <dos.h>
#include <iostream.h>
#include <PROCESS.H>
#include <STDLIB.H>
#include <conio.H>
#define max_size 200
// char s[max_size]; //компоненты стека
int s[max_size];
int next=0; // позиция стека
int Empty()
{
return next==0;
}
int Full()
{
return next==max_size;
}
void Push()
{ if (next==max_size)
{
cout <<"Ошибка: стек полон"<<endl;}
else { next++;cout <<"Добавлен"<<endl;
cout <<"Что поместить в стек?"<<endl;
cin <<s[next-1];
}
}
void OUTst()
{int i=0;
if (next==0)
{
cout <<"Cтек пуст"<<endl;}
else { for(i=0;i <next;i++)
cout <<s[i] <<"" <<endl;
}
}
void Clear()
{
next=0;
}
Poz()
{
return next;
}
void Del()
{
int a;
if (next==0) cout <<"Ошибка: стек пуст" <<endl; else
{next--;cout <<"Удален" <<endl;}
}
void menu(){
cout <<"0: распечатать стек" <<endl;
cout <<"1: добавить в стек" <<endl;
cout <<"2: удалить из стека" <<endl;
cout <<"3: узнать номер позиции в стеке" <<endl;
cout <<"4: узнать, пуст ли стек" <<endl;
cout <<"5: узнать, полон ли стек" <<endl;
cout <<"6: очистить стек" <<endl;
cout <<"7: выход" <<endl;
}
main()
{
char c;
clrscr();
textcolor(11);
do {
menu();
cin"c;
clrscr();
switch (c) {
case "0":OUTst();getch();break;
case "1":Push();break;
case "2":Del();getch();break;
case "3":cout <<"Hомер" <<Poz() <<endl;getch();break;
case "4":if (Empty()==1) cout <<"Пуст" <<endl; else cout <<"Hе
пуст" <<endl;getch();break;
case '5':if (Full()==1)cout <<"Полон" <<endl; else cout <<"Hе
полон" <<endl;getch();break;
case '6':Clear();cout <<"Стек очищен" <<endl;getch();break;
case '7':exit(1);
}
delay(200);
}
while (c!=7);
return 0;
}
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.