Скачать презентацию Динамічні структури даних Зв язні списки Проф Куссуль Н Скачать презентацию Динамічні структури даних Зв язні списки Проф Куссуль Н

Lecture8-CPP.ppt

  • Количество слайдов: 15

Динамічні структури даних. Зв`язні списки Проф. Куссуль Н. М. 1 Динамічні структури даних. Зв`язні списки Проф. Куссуль Н. М. 1

Структури в С++ Структури в С + + використовуються для логічного та фізичного об'єднання Структури в С++ Структури в С + + використовуються для логічного та фізичного об'єднання даних довільних типів, так само як масиви служать для групування даних одного типу. struct <ім’я_структури> { елементи структури };

Структури в С++ struct Student { int age; char* name; } Ініціалізація n n Структури в С++ struct Student { int age; char* name; } Ініціалізація n n Student stud 1; stud 1. age = 21; stud 1. name = “Jenny Doe”; Student stud 2 = {22, “John Doe”};

Структури в С++ Вказівники на структури n n Student* stud 3; stud 3 ->age Структури в С++ Вказівники на структури n n Student* stud 3; stud 3 ->age = 25; stud 3 ->name = “Johnny Doe”; Або (*stud 3). age = 25; (*stud 3). name = “Johnny Doe”;

Означення Зв’язний список (linked list) - це структура даних, в якій об`єкти розташовуються в Означення Зв’язний список (linked list) - це структура даних, в якій об`єкти розташовуються в лінійному порядку n n n На відміну від масиву, у якому цей порядок задається індексами, порядок в зв’язному списку задається вказівниками на кожен об’єкт Елементи масиву розташовуються в пам’яті послідовно Елементи списку розташовуються в різних місцях пам’яті Зв’язні списки забезпечують просте та гнучке представлення динамічних множин. 5

Однозв’язний список (singly linked list) n це такий список, у якого кожен елемент зберігає Однозв’язний список (singly linked list) n це такий список, у якого кожен елемент зберігає в собі вказівник на наступний після нього елемент. Зауважимо, що вказівник у останнього елемента списку вказує на порожній елемент, тобто рівний NULL. data next NULL 6

Приклад struct element //оголошення типу { //структури string str; element* next; }; Однозв’язний список Приклад struct element //оголошення типу { //структури string str; element* next; }; Однозв’язний список n n елемент – рядки типу string вказівник на наступний елемент списку 7

Приклад реалізації списку // FILE module. h #include <iostream> #include <string> #include <conio. h> Приклад реалізації списку // FILE module. h #include #include #include using namespace std; struct element{ // оголошення типу елемента списка string str; element* next; }; element* Enter. List(); int Count(element*);

Створення списку та його виведення // FILE project 1. cpp with main() function #include Створення списку та його виведення // FILE project 1. cpp with main() function #include "module. h" int main() { element *current, *top; top = Enter. List(); current = top; while (current!=0) { cout<< current->str << endl; current=current->next; } } cout << endl << "Size of List is " << Count(top) << endl; getch(); return 0;

Cтворення списку // FILE module. cpp with functions while(answer != Cтворення списку // FILE module. cpp with functions while(answer != "n") #include "module. h" { current->next = new element; element* Enter. List() current = current->next; cout << "enter string : "; { cin>>current->str; element *first, *current; cout<< "do you want new string? string answer; (n for exit)"; cin>> answer; cout<< "enter first string : "; } first=current=new element; cin>> current->str; cout<< "do you want new string? (n for exit)"; cin>> answer; current->next = NULL; return first; }

Обчислення кількості елементів списку int Count (element* list) { int result = 0; if Обчислення кількості елементів списку int Count (element* list) { int result = 0; if (list == NULL) { cout << "List is empty"; } while (list!=0) { result++; list=list->next; } return result; }

Однозв’язний список: пошук максимального елементу struct element { //оголошення типу структури int value; element* Однозв’язний список: пошук максимального елементу struct element { //оголошення типу структури int value; element* next; }; int Maximum(element* lst) { int max = lst->value; for(int i=0; lst != NULL; lst = lst->next) { if (lst->value > max) max = lst->value; } return(max); } 12

Функція, яка повертає вказівник на попередній елемент У однозв’язному списку відсутній вказівник на попередній Функція, яка повертає вказівник на попередній елемент У однозв’язному списку відсутній вказівник на попередній елемент. Тому варто зберігати вказівник на початок списку/ list* prev(list* head, list* cur) { //head – вказівник на початок списку //cur – поточний елемент list* lst; lst = new list; lst = head; lst->next = head->next; for(int i=0; lst->next != cur; lst=lst->next) { if (lst->next=NULL) break; } return (lst); } 13

Операції з однозв’язним списком Додавання елементу після поточного list* lst; lst=new list; lst->next=cur->next; cur->next=lst; Операції з однозв’язним списком Додавання елементу після поточного list* lst; lst=new list; lst->next=cur->next; cur->next=lst; Додавання елементу перед поточним list* lst; lst=new list; lst->next=prev(head, cur)->next; prev(head, cur)->next=lst; 14

Однозв’язний список: пошук елемента list* Search(list* head, int a) { /*На вхід подається вказівник Однозв’язний список: пошук елемента list* Search(list* head, int a) { /*На вхід подається вказівник на початок списку, а також значення, яке необхідно знайти. Якщо такий елемент знайдено, то повертається вказівник на знайдений елемент; в протилежному випадку - NULL */ list* lst = new list; lst = head; lst->value = head->value; lst->next = head->next; for(int i = 0; lst != null; lst = lst->next) { if(lst->value == a) return(lst); } return(NULL); } 15