Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Якщо елементи списку мають два вказівних поля, але список не лінійних, а розгалужений, то отримується список у вигляді бінарного дерева.Содержание книги
Поиск на нашем сайте
Тема: Лінійні однонапрямлені списки. Такі списки складаються з елементів, які є комбінацією двох полів: інформаційного та вказівного на наступний елемент. Вказівне поле матиме тип вказівника на базовий тип, що є типом всього елемента списку, при цьому допускається рекурсивність оголошення типу списку. TYPE list1=^el_list1; el_list1=record inf:integer; Next:list1 END; В програмі доступ до таких однонапрямлених змінних здійснюється через фіксований вказівник – статичну змінну. Ця змінна не може змінювати свого значення, оскільки може призвести до втрати адреси всього списку. Останній елемент списку вказує в nil. Формування списку здійснюється при допомозі процедур створення динамічних змінних, при цьому кожний новий елемент зв’язується вказівником з попереднім елементом або своїм вказівником із наступним. Формування списку може здійснюватися за двома принципами: Стек. Черга. При формуванні списку за правилом стеку: кожен новий елемент ставиться у список в якості голови. Якщо список формується за правилом черги, то кожен новий елемент добавляється у хвіст списку. Фіксований вказівник вказує на один і той же елемент, при цьому потрібно мати ще один фіксований вказівник на останній елемент списку. Відмінність між списками чергами і стеками лише у порядку заповнення елементами. Всі решта операцій по переміщенню, вставці, видаленню абсолютно однакові. Традиційно, над лінійними списками виконують наступні дії: Формування. Перегляд. Пошук елемента за вказаним інформаційним полем. Вставка нового елемента після деякого елемента із вказаним значенням. Вставка елемента перед деяким елементом. Видалення елемента із вказаним значенням. Формування однонапрямленого списку. Для реалізації операції в програмі достатньо мати 4 статичні змінні. а). Стек. VAR first, last,p,q:list1; o:string; n,i,a,k:integer; BEGIN writeln('введіть кількість елементів у списку'); readln(n); for i:=1 to n do Begin new(p); writeln('введіть елемент списку'); readln(a); p^.inf:=a; p^.next:=first; first:=p end; б). Черга. writeln('введіть кількість елементів у списку'); readln(n); first:=nil; last:=nil; new(p); writeln('введіть елемент списку'); readln(a); p^.inf:=a; last:=p; first:=p; for i:=2 to n do Begin new(p); writeln('введіть наступний елемент списку'); readln(a); p^.inf:=a; last^.next:=p; last:=p end; Оскільки при створення першого елементу передбачаються операції з вказівником first, а створення решти елементів не потребує використання first, то при побудові списку за правилом черги формування першого елементу відрізняється від формування останніх. Перегляд всього списку. Перегляд списку передбачає рух від голови списку до кінця. PROCEDURE RESIV (first,p:list1); BEGIN p:=first; while p<>nil do Begin write(p^.inf,','); p:=p^.next end; Writeln END; Пошук за вказаним інформаційним полем. writeln('введіть шуканий елемент'); readln(a); while (p<>nil) do Begin if p^.inf=a then Begin writeln ('під номером № ‘,k+1); i:=i+1; end; p:=p^.next; k:=k+1 end; if k=0 then writeln ('немає') Else writeln ('кількість ',i) Вставка нового елементу після деякого елементу. p:=first; writeln ('введіть елемент, після якого потрібно вставити новий'); readln(k); while p<>nil do Begin if p^.inf=k then Begin new(q); writeln('введіть елемент, який потрібно вставити'); readln(a); q^.inf:=a; q^.next:=p^.next; p^.next:=q end; p:=p^.next end; Вставка нового елементу перед деяким елементом. Вставка нового елемента перед деяким елементом є складнішим, оскільки список є структурою з послідовним доступом. Вставка перед деяким елементом х – це теж саме, що й вставка після попереднього елемента з значенням п. writeln ('введіть елемент, перед яким потрібно вставити новий'); readln(k); p:=first; if p=nil then writeln ('список пустий') Else if p^.inf=k then {вставка перед першим} Begin new(q); writeln ('введіть елемент, який потрібно вставити'); readln(a); q^.inf:=a; q^.next:=p; first:=q End Else Begin while (p^.next<>nil) and (p^.next^.inf<>k) do p:=p^.next; if p^.next=nil then writeln ('немає такого елементу ') Else Begin new(q); writeln('введіть елемент, який потрібно вставити'); readln(a); q^.inf:=a; q^.next:=p^.next; p^.next:=q End end; Видалення. Для видалення елементу із вказаним інформаційним плем потрібно знову ж як і для вставки перед мати вказівник на попередній елемент, тому операція видалення матиме декілька варіантів: пустий список, видаляється перший елемент, відсутність у списку шуканого елементу, шуканий елемент довільний, крім першого. writeln('введіть елемент, який потрібно вилучити'); readln(a); p:=first; if p=nil then writeln ('список пустий') Else if p^.inf=a then Begin first:=p^.next; Dispose(p) End Else Begin while (p^.next<>nil) and (p^.next^.inf<>a) do p:=p^.next; if p^.next=nil then writeln ('такого елементу немає') Else Begin q:=p^.next; p^.next:=q^.next; Dispose(q) End end; Тема: Двонапрямлені лінійні списки. У двонапрямлених списках і в розглянутих раніше однонапрямлених елементи утворюють лінійну структуру даних з послідовним доступом, але на відміну від них, рух по списку можливий у двох напрямках, тому кожен елемент міститиме, окрім інформаційного поля, два вказівні поля: на наступний і попередній елементи. Список матиме два фіксованих вказівники: на перший – first; на останній – last. Оскільки рух по списку можливий у двох напрямках, то переміщення від first до last здійснюється через вказівник next; від last до first через вказівник prev, тому формування списку за правилом стеку від first до last – це та ж сама черга від last до first і навпаки.Як і в однонапрямлених списках над двонапрямленими виконують ті ж самі операції. Оголошення структури списку може мати вигляд: TYPE list2=^el_list2; el_list2=record inf:integer; Next,prev:list2 END;
writeln('введіть кількість елементів у списку'); readln(n); first:=nil; last:=nil; for i:=1 to n do Begin writeln('введіть елемент'); readln(a); new(p); p^.inf:=a; if last=nil then last:=p; p^.next:=first; first^.prev:=p; first:=p end; Перегляд. Здійснюється аналогічно, тільки може здійснюватися в обоз напрямках.
PROCEDURE RESIV; BEGIN p:=first; while p^.next<>nil do Begin write(p^.inf,' '); p:=p^.next end; writeln(p^.inf,' ') END; Пошук. p:=first; writeln('введіть шуканий елемент'); readln(a); i:=0; while (p<>nil) do Begin inc(k); if p^.inf=a then Begin i:=i+1; Writeln('під № ',k) end; p:=p^.next end; if i=0 then writeln ('немає') Else writeln ('кількість ',i) Вставка перед на відмінну від однонапрямленого списку аналогічна вставці після з точністю переміни вказівників prev і next. write('введіть елемент, після якого потрібно вставити новий'); readln(n); write('введіть новий елемент'); readln(a); p:=first; while p<>nil do Begin if p^.inf=n then Begin new(q); q^.next:=p^.next; p^.next:=q; q^.prev:=p end; q^.inf:=a; p:=p^.next end;
Вилучення. Як і в попередніх випадках видалення елементу не потребує складного пошуку із порівнянням через один елемент, як у однонапрямлених списках. write('введіть елемент, який потрібно вилучити'); readln(a); p:=first; while p<>nil do Begin if p^.inf=a then Begin if p=first then Begin first:=p^.next; p^.prev:=nil End Else Begin if p^.next<>nil then Begin p^.next^.prev:=p^.prev; p^.prev^.next:=p^.next^.next End Else Begin p^.prev^.next:=nil end; end; End Else p^.prev^.next:=p; p:=p^.next end; Тема: Бінарні дерева. Особливим видом розгалужених списків є дерева. Особливістю таких динамічних структур даних є те, що кожен елемент має декілька вказівних полів (бінарні, тернарне, п-арні дерева). На відмінну від двонапрямлених списків, дерева не мають лінійної структури. Підлеглість елементів має розгалужену структуру – це означає, що такі списки мають один верхній елемент – голову. Він має декілька підлеглих елементів, які в свою чергу мають декілька елементів, причому на будь-якому рівні всі вказівники повинні бути зв’язані з іншими елементами, якщо ж ні, то в таких випадках вони вказують в nil. Доступ до елементів дерева здійснюється послідовно з вершини дерева через фіксований вказівник top. Елементи дерева, обидва вказівники яких зв’язані із підлеглими елементами, називають вузловими вершинами або гілками. Елементи дерева, обидва вказівники яких вільні, називаються листками або висячими вершинами. Елементи дерева, один з вказівників яких вільний, називаються напівисячими вершинами. Шириною бінарного дерева називається кількість вузлів від крайнього лівого до крайнього правого елементу. Висотою бінарного дерева називається максимальна кількість рівнів елементів від вершини дерева до найдальшого листка.
|
||||
Последнее изменение этой страницы: 2016-09-19; просмотров: 319; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.12.61 (0.006 с.) |