- •СТРУКТУРЫ ДАННЫХ И АЛГОРИТМЫ
- •Глава 1 Линейные списки
- •Понятие структуры данных
- •Тип указатель
- •Линейный список
- •Линейный однонаправленный (односвязный) список
- •Линейный двунаправленный (двусвязный) список
- •Практическое задание «Линейные списки»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 2 Структуры данных стек и очередь
- •Понятие структуры данных стек и очередь
- •Структура данных стек
- •Структура данных очередь
- •Пример решения задачи с использованием стека
- •Практическое задание «Стеки и очереди»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 3 Древовидные структуры данных
- •Понятие структуры данных дерево
- •Представление структуры бинарное дерево в памяти
- •Обход дерева
- •Основные операции над деревом
- •Ввод дерева
- •Практическое задание «Бинарные деревья»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 4 Структура данных таблица
- •Понятие структуры данных таблица
- •Представление таблицы в памяти
- •Организация хеш-таблиц
- •Выбор функции расстановки
- •Разрешение коллизии
- •Операции над таблицами
- •Практическое задание «Управление таблицами»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Глава 5 Алгоритмы упорядочения данных
- •Понятие операции упорядочения
- •Алгоритмы упорядочения
- •Сортировка слиянием
- •Основные алгоритмы сортировки посредством сравнений
- •Улучшенные алгоритмы сортировки сравнением
- •Практическое задание «Алгоритмы сортировки»
- •Задачи для самостоятельной работы
- •Контрольные вопросы
- •Библиографический список
list *find3(list *l, int x)
{
list *p = l->prev;
while (l != p && l->prev != p
&& l->elem != x && p->elem != x)
{
l = l->next; p = p->prev;
}
if (l == p)
return l->x == x ? l : NULL; else
return l->prev == p ? NULL : l;
}
ПРАКТИЧЕСКОЕ ЗАДАНИЕ «ЛИНЕЙНЫЕ СПИСКИ»
Цели
Изучить основные способы организации и обработки структурированных типов данных – однонаправленный и двунаправленный линейный список. Сформировать практические навыки использования однонаправленных и двунаправленных списков при решении задач.
Варианты заданий
Линейные односвязные списки
1Задан текст, состоящий из строк, разделенных пробелом и оканчивающийся точкой. Написать подпрограмму поиска заданного элемента в списке. Используя эту подпрограмму:
а) подсчитать количество вхождений заданного символа в каждую строку текста. Вхождение задавать номером строки и номером позиции в строке;
б) найти все вхождения (см. пункт 1.а) заданного символа в текст;
30
в) найти первое вхождение (см. пункт 1.а) каждой десятичной цифры в текст;
г) найти первое вхождение (см. пункт 1.а) гласных латинских букв в текст;
д) подсчитать количество вхождений четных (нечетных) десятичных цифр в каждую строку текста;
е) заменить заданный символ, если он имеется в тексте, на новое значение (символ), считая, что символ входит в каждую строку не более одного раза;
ж) удалить все вхождения заданного символа из текста;
з) после последнего вхождения каждой гласной латинской буквы в строку текста вставить цифру, изображающую число вхождений этой гласной в данную строку (в строке содержится не более девяти одинаковых гласных);
и) если в строке текста содержится заданный символ, то переместить его на место первого символа в этой строке;
к) если в строке текста содержится заданный символ, то переместить его на место последнего символа в этой строке.
2В текстовом файле дана последовательность чисел. Преобразовать заданную последовательность, используя подпрограмму, которая в однонаправленном списке:
а) оставляет только последние вхождения одинаковых элементов;
б) меняет местами первый и последний элементы;
в) из каждой группы подряд идущих равных элементов оставляет только один.
3Даны действительные числа x1, x2, ... , xn (n 2 и заранее неизвестно). Получить последовательность (x1 – xn), (x2 – xn), ... , (xn - 1 – xn).
4Дана последовательность действительных чисел a1, a2, ... , an (n 2 и заранее неизвестно). Если последовательность упорядочена по не
31
убыванию, то оставить ее без изменения, иначе получить последовательность an , an - 1 , ... , a1.
5Дана последовательность символов s1, s2, ... , sn (n 2 и заранее неизвестно). Получить те символы, принадлежащие последовательности, которые входят в нее по одному разу.
6Для заданных полиномов Pn(x) и Qn(x) найти полином R – сумму полиномов P и Q. Каждый полином представить в виде списка.
P
n |
an |
|
... |
1 |
a1 |
|
|
0 |
a0 |
NULL |
|
|
|
|
|
|
|
|
|
|
При этом в список включать (а) или не включать (б) равные нулю коэффициенты. Считать, что входные данные не содержат равных нулю коэффициентов.
7Дана последовательность символов s1, s2, ... , sn (n 2 и заранее неизвестно). Получить последовательность символов, содержащую только последние вхождения каждого символа в строку с сохранением их исходного взаимного порядка.
8Дана последовательность символов s1, s2, ... . Известно, что s1 отличен от точки и , что среди s2, s3, ... имеется хотя бы одна точка. Пусть s1, s2, ... , sn – символы, предшествующие первой точке. Получить последовательность s1, s3, ... , sn, если n нечетно и последовательность s2, s4, ... , sn, если n четно.
9В текстовом файле даны две последовательности символов, разделенные запятой. Написать подпрограмму, которая:
а) проверяет на равенство два однонаправленных списка. Используя эту подпрограмму, проверить, совпадают ли эти последовательности и если не совпадают, найти первое несовпадение;
б) проверяет, входит ли список L1 в список L2 (оба списка – однонаправленные). Используя эту подпрограмму, проверить, входит ли вторая последовательность в первую;
32
в) для двух однонаправленных циклических списков L1 и L2 проверяет, входит ли L1 в L2.
10 В текстовом файле дана последовательность слов, разделенных пробелом каждое длиною не более 8 символов. Написать подпрограмму, которая:
а) находит в односвязном списке первое слово, начинающееся и оканчивающееся заданным символом. Результат поиска – ссылка на слово. Используя эту подпрограмму, найти все слова, начинающиеся и оканчивающиеся символом 'a';
б) которая в однонаправленном линейном списке (информационное поле элемента списка – последовательность символов) печатает сначала все элементы списка с минимальной длиной, затем все остальные. Используя эту подпрограмму, напечатать заданную последовательность слов.
11В текстовом файле дана последовательность чисел. Написать подпрограмму, которая:
а) находит сумму последнего и предпоследнего элементов однонаправленного списка. Используя эту подпрограмму, вычислить сумму двух последних элементов заданной последовательности;
б) вычисляет сумму k-го и n-го элементов односвязного циклического списка, считая, что k и n – номера элементов, а нумерация начинается с 1 от 1-го элемента списка. Используя эту подпрограмму, вычислить сумму элементов заданной последовательности с заданными номерами x и y;
в) находит предпоследний элемент однонаправленного списка. Используя эту подпрограмму, вычислить сумму двух последних элементов заданной последовательности;
г) вычисляет среднее арифметическое элементов однонаправленного списка. Используя эту подпрограмму, вычислить среднее арифметическое заданной последовательности чисел;
33
д) находит в односвязном циклическом списке минимальный элемент. Используя эту подпрограмму, удалить из заданной последовательности все элементы с минимальным значением;
е) находит в односвязном списке первый отрицательный элемент. Используя эту подпрограмму, удалить из заданной последовательности все отрицательные элементы;
ж) вставляет в конец односвязного списка новый элемент Е. Используя эту подпрограмму, перенести в конец заданной последовательности ее первый элемент.
12 В текстовом файле дана последовательность чисел. Написать рекурсивную подпрограмму, которая
а) находит минимальный элемент непустого однонаправленного ациклического списка. Используя эту подпрограмму, удалить из заданной последовательности все элементы с минимальным значением;
б) находит максимальный элемент непустого однонаправленного списка. Используя эту подпрограмму, удалить из заданной последовательности все элементы с максимальным значением;
в) печатает в обратном порядке элементы непустого однонаправленного списка. Используя эту подпрограмму, напечатать заданную последовательность в обратном порядке.
Линейные двусвязные списки
1 Дана последовательность символов, оканчивающаяся точкой. Написать подпрограмму, которая в двусвязном кольцевом списке с фиктивным звеном:
а) находит всех соседей заданного символа (первый и последний символы считать соседями);
34
б) подсчитывает количество символов, у которых левый сосед больше правого соседа (первый и последний элемент считать соседями);
в) удаляет все символы, у которых равные соседи (первый и последний символы считать соседями);
г) переставляет в обратном порядке все символы между первым и последним вхождениями заданного символа;
д) в конец последовательности добавляет все ее символы, располагая их в обратном порядке (например, из последовательности 1, 2, 3 получить 1, 2, 3, 3, 2, 1);
е) определяет, является ли список пустым, и печатает в обратном порядке его элементы;
ж) подсчитывает количество элементов, у которых равные соседи;
з) определяет, есть ли в списке хотя бы один элемент, который равен следующему за ним по кругу элементу;
и) удаляет из списка первый отрицательный элемент; к) удваивает в списке каждое вхождение элемента Е; л) добавляет в конец списка новый элемент Е.
2Дана последовательность латинских букв, оканчивающаяся точкой. Среди букв есть специальный символ, появление которого означает отмену предыдущей буквы; k знаков подряд отменяют k предыдущих букв, если такие есть. Преобразовать последовательность с учетом вхождения в нее специального символа.
3Дан многочлен P(x) произвольной степени с целыми коэффициентами, причем его одночлены могут быть не упорядочены по степеням x, а одночлены с одинаковой степенью могут повторяться (например, -75x + 8x4 - x2 + 6x4 – 5 - x). Привести подобные члены в этом многочлене и расположить одночлены по убыванию степеней x.
35
