Линейные структуры данных

advertisement
Лабораторная работа №1
Тема: Алгоритмы работы со структурами данных.
Содержание работы.
При проектировании алгоритмов и оценке их временной
эффективности существенную роль играют структуры выбранных данных и
операции с ними. Язык программирования, выбранный для реализации
алгоритмов, имеет свои встроенные типы данных. Однако чаще всего,
пользовательские структуры данных не могут быть напрямую реализованы
стандартными типами данных. Поэтому на базе стандартных типов памяти
языка программирования организуются пользовательские структуры данных
и характерные для них операции.
Часто используемыми пользовательскими структурами данных
являются стеки, очереди, связные списки (в дальнейшем - списки).
Стек – список, состоящий из однотипных элементов, имеет
переменную или фиксированную длину, доступ к элементам (добавление и
удаление) возможен только из вершины стека. При обращении к элементам
стека действует принцип LIFO (Last - In - First- Out - "последним пришел первым ушел"). Применяются и другие названия стека - магазин и очередь,
функционирующая по принципу LIFO. Примеры стека: винтовочный
патронный магазин, тупиковый железнодорожный разъезд.
Рисунок 1.1 – Примеры реализации стека
Основные операции над стеком - включение нового элемента
(английское название push - заталкивать) и исключение элемента из стека
(англ. pop - выскакивать).
Очередью FIFO (First - In - First- Out - "первым пришел - первым
ушел") называется такой последовательный список с переменной длиной, в
котором включение элементов выполняется только с одной стороны списка
(эту сторону часто называют концом или хвостом очереди), а исключение - с
другой стороны (называемой началом или головой очереди).
Рисунок 1.2 – Примеры реализации очереди
Основные операции над очередью - те же, что и над стеком –
добавление элемента в очередь – enque, удаление элемента из очереди –
deque.
Списком называется упорядоченное множество, состоящее из
переменного числа элементов, к которым применимы операции включения,
исключения. Длина списка равна числу элементов, содержащихся в списке,
список нулевой длины называется пустым списком. Списки представляют
собой способ организации структуры данных, при которой элементы
некоторого типа образуют цепочку. Для связывания элементов в списке
используют систему указателей. В минимальном случае, любой элемент
линейного списка имеет один указатель, который указывает на следующий
элемент в списке или является пустым указателем, что интерпретируется как
конец списка.
Структура, элементами которой служат записи с одним и тем же
форматом, связанные друг с другом с помощью указателей, хранящихся в
самих элементах, называют связанным списком. В связанном списке
элементы линейно упорядочены, но порядок определяется не номерами, как в
массиве, а указателями, входящими в состав элементов списка. Каждый
список имеет особый элемент, называемый указателем начала списка
(головой списка), который обычно по содержанию отличен от остальных
элементов. В поле указателя последнего элемента списка находится
специальный признак NULL, свидетельствующий о конце списка.
Линейные связные списки являются простейшими динамическими
структурами данных. Из всего многообразия связанных списков можно
выделить следующие основные:



однонаправленные (односвязные) списки;
двунаправленные (двусвязные) списки;
циклические (кольцевые) списки.
В основном они отличаются видом взаимосвязи элементов и/или
допустимыми операциями.
Однонаправленные (односвязные) списки
Наиболее
простой
однонаправленный список,
структурного типа.
динамической
структурой
элементами которого служат
является
объекты
Однонаправленный (односвязный) список – это структура данных,
представляющая собой последовательность элементов, в каждом из которых
хранится значение и указатель на следующий элемент списка. В последнем
элементе указатель на следующий элемент равен NULL.
Рисунок 1.3 – Линейный однонаправленный список
Список – это структура, каждый элемент которой состоит, как
минимум, из двух компонент, одна из которых содержит некоторую
величину, а другая является ссылкой на следующий элемент. Основные
операции: включение элемента в список, удаление элемента из списка, поиск
элемента в списке.
В динамические структуры легко добавлять элементы, так как для
этого достаточно изменить значения адресных полей. Вставка первого и
последующих элементов списка отличаются друг от друга. Поэтому в
функции, реализующей данную операцию, сначала осуществляется проверка,
на какое место вставляется элемент. Далее приведен соответствующий
алгоритм добавления.
Рисунок 1.4 – Вставка элемента в однонаправленный список
Из динамических структур можно удалять элементы, так как для этого
достаточно изменить значения адресных полей. Операция удаления элемента
однонаправленного списка осуществляет удаление элемента, на который
установлен указатель текущего элемента. После удаления указатель текущего
элемента устанавливается на предшествующий элемент списка или на новое
начало списка, если удаляется первый.
Алгоритмы удаления первого и последующих элементов списка
отличаются друг от друга. Поэтому в функции, реализующей данную
операцию, осуществляется проверка, какой элемент удаляется. Далее
приведен соответствующий алгоритм удаления.
Рисунок 1.5 – Удаление элемента из однонаправленного списка
Двунаправленный (двусвязный) список – это структура данных,
состоящая из последовательности элементов, каждый из которых содержит
информационную часть и два указателя на соседние элементы. При этом два
соседних элемента должны содержать взаимные ссылки друг на друга.
В таком списке каждый элемент (кроме первого и последнего) связан с
предыдущим и следующим за ним элементами. Каждый элемент
двунаправленного списка имеет два поля с указателями: одно поле содержит
ссылку на следующий элемент, другое поле – ссылку на предыдущий
элемент и третье поле – информационное. Наличие ссылок на следующее
звено и на предыдущее позволяет двигаться по списку от каждого звена в
любом направлении: от звена к концу списка или от звена к началу списка,
поэтому такой список называют двунаправленным.
Рисунок 1.6 –Двунаправленный список
Задания (на минимальный бал):
1. Реализуйте стек на основе массива и операции POP, PUSH. В цикле
запишите в стек 5 элементов, введенных с клавиатуры. Затем
вытолкните из стека два элемента. Распечатайте остаток стека.
2. Аналогично стеку реализуйте очередь на базе массива.
3. Реализуйте список. Создайте реальный список из пяти элементов и
распечатайте его.
Задания (на оценку «хорошо»):
1. Создать функции для работы с односвязным списком: добавление
элемента после заданного, в начало и в конец, удаление элемента по
значению, поиск элемента по значению, обмен двух элементов списка
местами, распечатка списка. Список представлен в динамической
памяти.
2. Создать функции для работы с двусвязным списком: добавление
элемента после заданного, в начало и в конец, удаление элемента по
значению, поиск элемента по значению, обмен двух элементов списка
местами, распечатка списка. Список представлен в динамической
памяти.
3. Реализуйте циклическую очередь на основе массива.
Дополнительные задания (на «отлично»):
01. Исключить из списка целых чисел все элементы с четными
значениями.
02. Дан одномерный список элементов, заполнить другой список так,
чтобы сначала шли все четные элементы, а затем нечетные.
03. Проверить правильность расстановок скобок в выражении,
использующем скобки вида: “(”, “)”, “{”, “}”, “[”, “]”. Требование
вложенности скобок разного вида не учитывать, Пример
последовательности скобок “({})[]”.
04. Дан одномерный список элементов, выбрать в нем любой элемент
(обозначим его b) и заполнить другой список так, чтобы сначала шли
все элементы меньшие b, затем равные b, затем большие b.
05. Найти максимальный и минимальный элементы списка и поменять их
местами.
06. Вокруг считающего человека стоит N человек, из которых выделен
первый, а остальные занумерованы по часовой стрелке числами от 2
до N. Считающий, начиная с кого-то, ведет счет до M. Человек, на
котором остановился счет, выходит из круга. Счет продолжается со
следующего человека и так до тех пор, пока не останется один
человек. Определить номер оставшегося человека, если известно M и
то, что счет начинался с первого человека.
07. Дан список элементов. Переставить элементы списка в обратном
порядке.
08. Даны два списка элементов, отсортированных по возрастанию.
Подсчитать количество одинаковых элементов в этих списках, то есть
количество t, для которых t = ai = bj, для некоторых i и j.
09. Найти количество различных элементов в списке целых чисел.
Например, в списке 1, 2, 2, 1 всего два различных числа
10. Отсортировать список элементов. Используйте минимальное
количество перестановок и/или проходов по элементам списка.
11. Реализовать стек на список элементов и на основе стека перевести
заданный строкой символов арифметическое выражение (из чисел,
операций +,-,*,/ и скобок) в форму польского инверсного записи и
вычислить его.
Download