Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных и алгоритмы. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]