Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаТ Алгор2012.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
472.06 Кб
Скачать

2.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;

}

}

Варіанти індивідуальних завдань

  1. Підрахувати кількість парних елементів в списку.

  2. Підрахувати кількість непарних елементів в списку.

  3. Підрахувати кількість додатних елементів в списку.

  4. Підрахувати кількість від'ємних елементів в списку.

  5. Додати до всіх позитивних елементів списку 10.

  6. Відняти від всіх елементів списку, більших двадцяти, п'ятнадцять.

  7. Додати до всіх елементів списку, що дорівнюють двом, максимальний елемент.

  8. Поміняти місцями максимальний і мінімальний елементи списку.

  9. Підрахувати кількість елементів в списку менших 5.

  10. Додати до всіх елементів списку мінімальний елемент.

  11. Всі елементи списку поділити на 2.

  12. Визначити кількість елементів списку менших середнього арифметичного елементів списку.

  13. Визначити кількість елементів списку більших середнього арифметичного елементів списку.

  14. Підрахувати суму парних елементів списку.

  15. Знайти кількість максимальних елементів списку дійсних чисел.

  16. Написати функцію, яка за списком L будує два нові списки: L1 – з додатних елементів і L2 – з від'ємних елементів списку L.

  17. Визначити, чи є список упорядкованим по зростанню.

  18. Сформувати список цілих чисел, що вводяться користувачем, у тому порядку, у якому вводяться ці числа, але без повторень елементів.

  19. Визначити кількість різних елементів списку дійсних чисел, якщо відомо, що його елементи утворюють зростаючу послідовність.

  20. Є список цілих чисел. Продублювати в ньому всі парні числа.

  21. Написати функцію, яка, отримавши в якості параметра покажчик q на один з елементів списку й деяке число x, додає новий елемент зі значенням x після елемента, на який указує покажчик q.

  22. Написати функцію, яка, отримавши в якості параметра покажчик q на один з елементів списку й деяке число x, додає новий елемент зі значенням x до елемента, на який указує покажчик q.

  23. Написати функцію, яка, одержавши в якості параметра покажчик q на один з елементів списку, видаляє елемент, розташований після елемента, на який указує покажчик q.

  24. Написати функцію, яка, одержавши в якості параметра покажчик q на один з елементів списку, видаляє цей елемент.

  25. Сформувати список дійсних чисел. Потім змінити його, додавши до додатних чисел максимальний елемент.

  26. Визначити, чи є в списку дійсних чисел елементи, що перевищують кількість всіх елементів списку.

  27. Вилучити зі списку дійсних чисел усі максимальні елементи.

  28. Нехай є два списки, елементи яких упорядковані по зростанню. Сформувати новий список з елементів першого й другого списку, елементи якого будуть упорядковані.

  29. Нехай є текстовий файл. Використовуючи лінійний список, підрахувати число появ кожного слова й створити новий текстовий файл, кожний рядок якого має вигляд «<слово>–<число його появ>».

  30. Циклічний список – це список, останній елемент якого вказує на перший. Такий список дозволяє програмі знову й знову переглядати його по колу доти, поки в цьому є необхідність. Написати функцію додавання елемента в циклічний список і функцію друку всіх елементів списку, починаючи з деякого елемента.