
- •Затверджено на засіданні
- •Редактор л.М. Тонкошкур
- •1. Введення в теорію алгоритмів.
- •2. Складність алгоритмів.
- •3. Структури даних.
- •3.1 Статичні та динамічні структури даних.
- •3.2. Стеки
- •3.3. Списки.
- •Блок-схема програми
- •3.4. Черги.
- •Блок-схема програми
- •3.5 Графи.
- •3.6. Дерева.
- •4. Методи побудови ефективних алгоритмів
- •4.1 Метод «розподіляй та володій».
- •Способ 1. Алгоритм пошуку мінімального та максимального значень елементів масиву.
- •Функція MinMax
- •Блок-схема
- •4.4. Жадібні алгоритми
- •5. Алгоритми сортування
- •5.1. Задача сортування та класифікація методів сортування.
- •5.2. Складність алгоритмів сортування.
- •5.3. Швидке сортування (OuickSort).
- •5.4. Сортування деревом (HeapSort) Алгоритм.
- •5.5. Cортування Шелла (ShellSort)
- •5.6. Сортування злиттям (MergeSort)
- •Лінійний пошук - це пошук підряд в неупорядкованій послідовності.
- •7. Алгоритми на графах.
- •Список літератури
3.3. Списки.
Список – це лінійна зв'язана структура даних, в якій додавати та видаляти дані можна в будь-якому місці.
Списки можуть бути несортованими і сортованими.
Елемент списку має вид:
struct node
{ float num //ключове поле
//інформаційні поля
node *next; // покажчик на слідуючий елемент
};
Приклад.
Організувати дані в вигляді сортованого списку за возрастанням. Видалити зі списку заданий елемент.
Позначення:
head – покажчик на вершину(голову) списку;
n – кількість елементів списку;
what – значення елементу списку, що вводиться;
toList – функція додавання елементу до сортованого списку;
printList – функція виведення на екран елементів сортованого списку;
fromList - функція видалення елементу з сортованого списку.
Блок-схема програми
Текст програми.
#include <iostream.h>
struct node
{
int num;
node *next;
};
// прототипи функцій
node* toList(node* ,int);
node* fromList(node*, int );
void printList(node*);
void main()
{
int what,i,n;
node *head=0;
cout<<"input n=";
cin>>n;
cout<<endl;
// додавання n елементів до списку
cout<<"input all what"<<endl;
for (i=1;i<=n;i++)
{
cin>>what;
head= toList(head ,what);
}
// виведення на екран елементів списку
printList(head);
// введення значення елементу для видалення зі списку
cout<<"InputWhatFromList:"<<endl;
cin>>what;
head=fromList(head,what);
printList(head);
}
node* toList(node* head ,int num)
{
node* pv=new node;
pv->num=num;
pv->next=0;
if (head)
{
node* cur=0;
if(head->num> pv->num)
{
pv->next=head;
head=pv;
}
else
{
cur=head;
while((cur->next) && (cur->next->num < pv->num))
cur=cur->next;
pv->next=cur->next;
cur->next=pv;
}
}
else
head=pv;
return head;
}
node* fromList(node* head, int num)
{
int prdel;
node* erased=0;
node* cur=0;
node* buf=new node;
buf->num=num;
buf->next=0;
if (( head->num) == (buf->num))
{
erased=head;
head=head->next;
delete erased;
}
else
{
cur=head;
erased=cur->next;
prdel=0;
do
{
if ( buf->num==erased->num)
{
cur->next=erased->next;
delete erased;
prdel=1;
}
else
{
cur=erased;
erased=cur->next;
}
}
while ((prdel==0) ||(erased != 0));
}
return head;
}
void printList(node* pv)
{
if (!pv)
cout<<"List is nil\n";
else
while(pv)
{
cout<<"="<<pv->num<<endl;
pv=pv->next;
}
}
3.4. Черги.
Черга - це лінійно зв'язана структура даних, у якій додавати елементи можна тільки в кінець черги, а видаляти дані можна тільки з початку черги. Інша назва цього способу організації даних:
FIFO- First - In- First Out (першим увійшов - першим вийшов)/
При роботі з чергами можна використовувати один покажчик на початок черги або два покажчики - один на початок , а інший на кінець черги .
Елемент черги має вигляд:
struct node
{ float num //ключове поле
//інформаційні поля
node *next; // покажчик на слідуючий елемент
};
Приклад.
Організувати дані в вигляді черги. Вивести на екран елементи черги з одночасним видаленням із пам’яті.