Метод_материалы / Учебники / Программирование_С
.pdfpt_buf = pt_lst; |
// буферный указатель |
while ( ( pt_buf–>next–>data < new_el ) && ( pt_buf–>next != NULL ) ) pt_buf = pt_buf–>next;
//проходим до места вставки, пока новый элемент больше буферного
//и не конец списка
pt_new–>next = pt_buf–>next; |
// перекинем указатели |
pt_buf–>next = pt_new; |
|
}; |
|
return pt_lst; |
|
} |
|
int WriteList( LIST pt_lst ) |
// см. выше (2.2.2) |
{ |
|
while ( pt_lst != NULL ) |
|
{ |
|
printf("%d ",pt_lst–>data ); |
|
pt_lst = pt_lst–>next; |
|
}; |
|
} |
|
2.2.3.1. Задачи на упорядоченный связный список
2.2.3.1.1.Изменение порядка элементов упорядоченного списка (целые числа)
на обратный Реализовать упорядоченный список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов списка на обратный.
2.2.3.1.2.Изменение порядка элементов упорядоченного списка (строки) на
обратный Реализовать упорядоченный список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов списка на обратный.
2.2.3.1.3.Смена местами половин упорядоченного списка (целые числа) Реализовать упорядоченный список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет
местами первую и вторую половины списка.
2.2.3.1.4. Смена местами половин упорядоченного списка (целые числа), Реализовать упорядоченный список, тип данных — строки символов. Прикладная задача:
141
исходный упорядоченный список заполняется из входного потока, затем программа меняет местами первую и вторую половины списка.
2.2.3.1.5.Удаление всех элементов упорядоченного списка (целые числа), больших заданного
Реализовать упорядоченный список, тип данных — целые числа. Прикладная задача:
исходный упорядоченный список заполняется из входного потока, затем программа удаляет все элементы, большие заданного.
2.2.3.1.6.Удаление всех элементов упорядоченного списка (строки), большие по длине заданной
Реализовать упорядоченный список, тип данных — строки. Прикладная задача:
исходный упорядоченный список заполняется из входного потока, затем программа удаляет все элементы, большие по длине заданной.
2.2.4. Стек на основе линейного списка
Можно заметить, что добавление элемента в список слева очень напоминает
142
Рис. 2.8. Стек на основе связного списка (добавление элемента) добавление элемента на вершину стека. Если теперь ввести еще одну функцию — удаление элемента слева, то полученная структура будет работать как стек, но на основе линейного списка.
Основные функции:
•положить элемент слева (сверху),
•взять элемент слева (сверху).
Ввиду того, что реализация стека на основе линейного списка почти не отличается от реализации собственно списка, здесь не приводятся соответствующие программы. Реализация функции удаления элемента из стека предоставляется читателю.
2.2.4.1. Задачи на стек
2.2.4.1.1. Изменение порядка элементов стека (целые числа) на обратный Реализовать стек на основе списка, тип данных — целые числа. Прикладная задача:
исходный стек заполняется из входного потока, затем программа меняет порядок элементов стека на обратный.
2.2.4.1.2. Изменение порядка элементов стека (строки) на обратный Реализовать стек на основе списка, тип данных — строки символов. Прикладная задача:
исходный стек заполняется из входного потока, затем программа меняет порядок элементов стека на обратный.
2.2.4.1.3. Смена местами половин стека (целые числа) Реализовать стек на основе списка, тип данных — целые числа. Прикладная задача:
исходный стек заполняется из входного потока, затем программа меняет местами первую и вторую половины стека.
2.2.4.1.4. Смена местами половин стека (строки)
Реализовать стек на основе списка, тип данных — строки символов. Прикладная задача:
исходный стек заполняется из входного потока, затем программа меняет местами первую и вторую половины стека.
2.2.4.1.5. Удаление элементов стека, больших заданного Реализовать стек на основе списка, тип данных — целые числа. Прикладная задача:
исходный стек заполняется из входного потока, затем программа удаляет все элементы, большие заданного.
2.2.4.1.6. Удаление элементов стека, больших по длине заданной Реализовать стек на основе списка, тип данных — строки символов.
143
Прикладная задача:
исходный стек заполняется из входного потока, затем программа удаляет все элементы, большие по длине заданной.
2.2.5. Очередь на основе линейного списка
Очередь на основе линейного списка поддерживает те же функции, что и очередь на основе массива.
Основные функции:
•добавить элемент в хвост,
•удалить элемент из головы.
Как правило, в списочных структурах манипуляции с элементами проще, чем в массивах, однако в очереди на основе линейного списка возникают проблемы. Классический вариант списка предусматривает наличие только одного указателя на начало списка; однако желательно иметь и указатель на хвост списка, как это было сделано на массиве.
На рис. 2.9 показана структура, реализующая этот принцип. Указатель pt_head указывает не на последний, но на предпоследний элемент очереди, потому что при удалении элемента с головы следует сохранить указатель на элемент, становящийся первым. Доступ к головному элементу осуществляется через операцию pt_head–> next.
Рис. 2.9. Очередь на основе связного списка
2.2.5.1. Задачи на очередь на основе линейного списка
2.2.5.1.1. Изменение порядка элементов очереди (целые числа) на обратный Реализовать очередь на основе списка, тип данных — целые числа. Прикладная задача:
исходная очередь заполняется из входного потока, затем программа меняет порядок элементов стека на обратный.
2.2.5.1.2. Изменение порядка элементов очереди (строки) на обратный Реализовать очередь на основе списка, тип данных — строки символов. Прикладная задача:
144
Исходная очередь заполняется из входного потока, затем программа меняет порядок элементов стека на обратный.
2.2.5.1.3. Смена местами половин очереди (целые числа) Реализовать очередь на основе списка, тип данных — целые числа. Прикладная задача:
исходная очередь заполняется из входного потока, затем программа меняет местами первую и вторую половины стека.
2.2.5.1.4. Смена местами половин очереди (строки)
Реализовать очередь на основе списка, тип данных — строки символов. Прикладная задача:
исходная очередь заполняется из входного потока, затем программа меняет местами первую и вторую половины стека.
2.2.5.1.5. Удаление элементов очереди, больших заданного Реализовать очередь на основе списка, тип данных — целые числа. Прикладная задача:
Исходная очередь заполняется из входного потока, затем программа удаляет все элементы, большие заданного.
2.2.5.1.6. Удаление элементов очереди, больших по длине заданной Реализовать очередь на основе списка, тип данных — строки символов. Прикладная задача:
исходная очередь заполняется из входного потока, затем программа удаляет все элементы, большие по длине заданной.
2.2.6. Циклический список
Циклический список отличается от обычного списка тем, что поле указателя последнего элемента указывает не на NULL, но на первый элемент списка. Таким образом, понятие первого элемента списка теряет свою роль — коль скоро можно пройти весь список, начиная с любого элемента.
Основные функции:
•добавить элемент перед текущим,
•просмотреть список.
На рис. 2.10 изображен циклический список с элементами типа int.
145
Рис. 2.10. Циклический список
При перемещении по циклическому списку нет необходимости в буферном указателе; операция перемещения на следующий элемент списка pt_list = pt_list–> next не приводит к потере элемента, как это было бы для обычного списка, так как всегда можно вернуться к любому элементу, пройдя весь список. Однако следует заметить, что пограничные ситуации будут реализовываться несколько иначе. Для пустого списка указатель pt_list–> next равен NULL; при добавлении одного элемента pt_list–> next указывает на себя (рис.2.11, б); добавление второго и последующих элементов производится по обычной для списка схеме (рис.2.11, а). Изъятие последнего элемента из списка должно завершаться присваиванием pt_list = NULL.
146
Рис. 2.11. Инициация циклического списка и добавление элемента
2.2.6.1. Задачи на циклический список
2.2.6.1.1.Изменение порядка элементов циклического списка (целые числа) на
обратный Реализовать список, тип данных —целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов стека на обратный.
2.2.6.1.2.Изменение порядка элементов циклического списка (строки) на
обратный Реализовать список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов стека на обратный.
2.2.6.1.3.Смена местами половин циклического списка (целые числа) Реализовать список, тип данных — целые числа.
Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет
местами первую и вторую половины стека.
147
2.2.6.1.4. Смена местами половин циклического списка (строки) Реализовать список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет местами первую и вторую половины стека.
2.2.6.1.5. Удаление элементов циклического списка, больших заданного Реализовать список, тип данных — целые числа.
Прикладная задача:
исходный список заполняется из входного потока, затем программа удаляет все элементы, большие заданного.
2.2.6.1.6. Удаление элементов циклического списка, больших по длине заданной
Реализовать список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа удаляет все элементы, большие по длине заданной.
2.2.7. Упорядоченный циклический список
Упорядоченный циклический список отличается от просто циклического списка тем, что элементы его упорядочены по какому-либо критерию. Поэтому функция вставки элемента заменит здесь функцию добавления элемента; однако процедура поиска места для вставки будет иметь особенности ввиду того, что указатель на начало списка может быть расположен в любом месте.
Реализация функций этой структуры предоставляется читателю. Ниже приводится стандартный набор задач.
2.2.7.1. Задачи на упорядоченный циклический список
2.2.7.1.1. Изменение порядка элементов списка (целые числа) на обратный Реализовать упорядоченный циклический список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов списка на обратный.
2.2.7.1.2. Изменение порядка элементов списка (строки) на обратный Реализовать упорядоченный циклический список, тип данных — строки
символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов списка на обратный.
2.2.7.1.3. Смена местами половин списка (целые числа)
Реализовать упорядоченный циклический список, тип данных — целые числа. Прикладная задача:
148
исходный список заполняется из входного потока, затем программа меняет местами первую и вторую половины списка.
2.2.7.1.4. Смена местами половин списка (строки)
Реализовать упорядоченный циклический список, тип данных — строки символов.
Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет местами первую и вторую половины списка.
2.2.7.1.5. Удаление элементов списка, больших заданного Реализовать упорядоченный циклический список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа удаляет все элементы, большие заданного.
2.2.7.1.6. Удаление элементов списка, больших по длине заданной Реализовать упорядоченный циклический список, тип данных — строки
символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа удаляет все элементы, большие по длине заданной.
2.2.8. Двусвязный (двунаправленный) список
Двусвязный (или двунаправленный) список — это усовершенствованный линейный список, каждый элемент которого содержит указатель не только на последующий, но и на предыдущий элемент.
Основные функции:
•добавить элемент слева,
•добавить элемент справа,
•просмотреть список слева,
•просмотреть список справа.
Двусвязный список удобнее обычного тем, что есть возможность перейти от текущего элемента списка в обе стороны (а чтобы перейти к предыдущему элементу в обычном линейном списке потребуется как минимум один буферный указатель плюс почти полный проход списка).
Возможно, конечно, создать и циклический двунаправленный список с независимым положением двух указателей списка; рекомендуем читателю написать соответствующие тексты.
На рис. 2.12 показана структура двусвязного списка с элементами типа int. Как видно, можно пройти по списку справа налево или слева направо, а также перейти от любого элемента к левому или правому соседу.
149
2.2.8.1. Задачи на двусвязный список
2.2.8.1.1. Изменение порядка элементов списка (целые числа) на обратный Реализовать двусвязный список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов списка на обратный.
Рис. 2.12. Двусвязный список
2.2.8.1.2. Изменение порядка элементов списка (строки) на обратный Реализовать двусвязный список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет порядок элементов списка на обратный.
2.2.8.1.3. Смена местами половин списка (целые числа) Реализовать двусвязный список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет местами первую и вторую половины списка.
2.2.8.1.4. Смена местами половин списка (строки)
Реализовать двусвязный список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа меняет местами первую и вторую половины списка.
2.2.8.1.5. Удаление элементов списка, больших заданного Реализовать двусвязный список, тип данных — целые числа. Прикладная задача:
исходный список заполняется из входного потока, затем программа удаляет все элементы, большие заданного.
2.2.8.1.6. Удаление элементов списка, больших по длине заданной Реализовать двусвязный список, тип данных — строки символов. Прикладная задача:
исходный список заполняется из входного потока, затем программа удаляет все элементы, большие по длине заданной.
150
