
- •1.Фундаментальные типы данных. Структуры
- •Демонстрационный пример
- •1.2. Задачи для самостоятельного решения
- •Фундаментальные типы данных. Объединения
- •2.1. Демонстрационный пример
- •А.Пуанкаре Приведем пример использования объединения: составить программу, выполняющую требуемые операции для заданной фигуры.
- •2.2. Задачи для самостоятельного решения
- •3.Ссылочные типы
- •3.1. Указатели и адреса
- •3.2. Адресная арифметика
- •3.3. Операции new и delete
- •3.4. Демонстрационные примеры Чтение и переработка являются ключевыми в программировании. Б.Керниган, ф.Плоджер
- •3.5. Задачи для самостоятельного решения
- •3.4. Дано описание переменных: int *p,*q; char *r;. Какие из следующих операторов неправильны и почему?
- •4. Линейные однонаправленные списки
- •4.1. Задачи для самостоятельного решения
- •Г.Остер. Задачник
- •Построение
- •Модификация
- •Предикаты
- •Подсчет
- •5. Ортогональные списочные структуры ("гирлянды" и "висюльки")
- •5.1. Фрагмент теории
- •5.2. Задачи для самостоятельного решения
- •6. Кольцевые списки на базе однонаправленных списков
- •6.1. Фрагмент теории
- •6.2.Задачи для самостоятельного решения
4. Линейные однонаправленные списки
Первые примеры, иллюстрирующие каждую новую идею, должны быть просты настолько, чтобы сложность и необычность самого примера не могли затемнить идею.
Ч.Хоар
Для выполнения задач этого раздела нужно повторить следующий теоретический материал:
информационная модель списка, представленная с помощью структур языка C++;
построение списка с заглавным звеном;
включение звена:
алгоритм включения звена в список после звена, на которое указывает заданная ссылка;
алгоритм включения в однонаправленный список звена с заданным информационным полем перед звеном, на которое указывает заданная ссылка Res;
удаление звена:
алгоритм удаления звена, расположенного после звена, на которое указывает ссылка Res;
алгоритм удаления звена, на которое указывает ссылка Res.
4.1. Задачи для самостоятельного решения
Если Слюника раздразнить, он начинает лягаться и не успокоится, пока не лягнет дразнившего каждой ногой по 3 раза. Однажды Мряка обозвала Слюника хрямзиком и он лягнул ее 27 раз. Сколько ног у Слюника?
Г.Остер. Задачник
При работе с линейными списками требуется, как правило, выполнять следующие операции (по Д.Кнуту):
определить число узлов в списке;
найти в списке узел с заданным значением некоторого информационного поля;
получить доступ к k-му узлу списка, чтобы проанализировать и(или) изменить содержимое его полей;
включить новый узел непосредственно перед(за) k-м узлом;
исключить k-й узел;
объединить два (или более) списка в один список;
разбить список на два (или более) списка;
сделать копию списка;
выполнить сортировку узлов списка по значениям некоторых информационных полей.
Необходимо уметь составлять функции, реализующие перечисленные выше операции для работы с однонаправленными списками и иллюстрировать их с помощью схем "до и после".
Во всех приведенных ниже задачах используйте списки с заглавным звеном.
Построение
4.1. Пусть задан файл f, элементами которого являются целые числа. Написать программу построения из элементов файла f однонаправленного списка.
4.2. Пусть задан файл, элементами которого являются символы. Написать программу построения из элементов файла f однонаправленного списка.
4.3. Пусть задан массив, элементами которого являются целые числа. Написать программу построения из элементов массива X однонаправленного списка.
4.4. Пусть задан массив символов. Написать программу построения из элементов массива X однонаправленного списка.
4.5. Предположим, что уже построен и задан указателем P однонаправленный список, элементами которого являются вещественные числа. Написать программу, которая по списку P строит два новых списка: L1 - из положительных элементов списка P, L2 - из остальных элементов списка P.
4.6. Предположим, что уже построен и задан указателем P однонаправленный список, элементами которого являются вещественные числа. Написать программу, которая по списку P строит два новых списка: L1 - из положительных элементов списка P, L2 - из отрицательных элементов списка P.
4.7*. Написать программу, которая объединяет два упорядоченных по неубыванию списка L1 и L2 в один упорядоченный по неубыванию список путем построения нового списка.
4.8. Многочлен P(x) = an*xn + an-1*xn-1+...+ ao с целыми коэффициентами представьте в виде списка, причем, если ai=0, то соответствующее звено в список не включается.
4.9. Многочлен P(x) = an*xn + an-1*xn-1+...+ ao с целыми коэффициентами представьте в виде списка, причем, если ai=0, то соответствующее звено в список не включается. Описать функцию Dif(p,q), которая строит многочлен p - производную многочлена q.
4.10. Многочлен P(x) = an*xn + an-1*xn-1+...+ ao с целыми коэффициентами представьте в виде списка, причем, если ai=0, то соответствующее звено в список не включается. Описать функцию Add(p,q,r), которая строит многочлен p - сумму многочленов q и r.
4.11*. Задача состоит в чтении некоторого текста, выборе из него слов и подсчете частоты их появления, то есть в составлении частотного словаря. Очевидно, что для этого нужно составить список слов, найденных в тексте. Каждое очередное слово, прочитанное в тексте, ищется в списке. Если слово найдено, счетчик его частоты увеличивается, в противном случае слово добавляется к списку. Чтобы сосредоточить внимание на основной задаче обработки списка, мы предположим, что слова уже выделены из исследуемого текста, закодированы целыми числами и находятся во входном файле.