Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 206

.pdf
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
584.29 Кб
Скачать

4.Определены переменные: zvn *fst = NULL, *en, *r. Указатели fst, en – соответственно для адреса первого и последнего элемента списка; r – для значений адресов переменных типа zvn. Сформирован список с элементами типа zvn. Напишите коды перебора элементов списка.

5.Перечислите информацию, которая необходима, для того чтобы удалить из списка со значением равным некоторому числу k.

6.Написать фрагмент программы, который удаляет требуемый элемент из списка.

7.Перечислите информацию, которая необходима, для того чтобы в список добавить элемент со значением равным некоторому числу k.

8.Написать фрагмент программы, который добавляет новый элемент в список. Новый элемент следует за некоторым данным элементом.

9.Определены переменные: zvn *fst = NULL, *en= NULL, *r. Сформирован список. Пусть в указателе en находится адрес последнего элемента списка. Напишите коды присоединения нового элемента типа zvn к списку.

10.В указателе r находится адрес некоторого элемента списка. Напишите код вывода элемента списка, который является пятым относительно данного. Циклы не использовать. Ответ должен состоять из одной директивы.

11.Определены переменные: zvn *fst= NULL, *en, *r. Объясните код r -> nx.

12.Определены переменные: zvn *fst= NULL, *en, *r. Объясните код r -> inf.

13.Определены переменные: zvn *fst = NULL, *en, *r.

Объясните код r = r -> nx.

14.Определены переменные: zvn *fst = NULL, *en, *r.

Объясните код r ->nx->nx->nx-> nx-> inf.

15.Перечислите информацию, которая необходима для того, чтобы удалить из списка головной (первый) элемент списка.

19

16.Перечислите информацию, которая необходима для того, чтобы новый элемент стал головным (первым) элементом списка.

17.Написать фрагмент программы, который новый элемент списка делает головным.

18.Определить стек.

19.Определить очередь.

20.Перечислить операции на стеке.

21.Перечислить операции на очереди

Варианты заданий :

Задание выполнить, применяя списки двух видов: стека

иочереди.

1.Построить линейный список из входной последовательности чисел. Удалить из него все отрицательные числа.

2.Построить линейный список из входной последовательности чисел. Удалить из него все положительные числа.

3.Построить линейный список из входной последовательности чисел. Перестроить его так, чтобы сначала стояли все положительные числа, затем все отрицательные.

4.Построить линейный список из входной последовательности чисел. Перестроить его так, чтобы сначала стояли все отрицательные числа, затем все положительные.

5.Построить линейный список из входной последовательности чисел. Удалить из него все четные числа.

6.Построить линейный список из входной последовательности чисел. Удалить из него все нечетные числа.

7.Построить линейный список из входной последовательности чисел. Перестроить его так, чтобы сначала стояли все четные числа, затем все нечетные.

8.Построить линейный список из входной последовательности чисел. Перестроить его так, чтобы сначала стояли все нечетные числа, затем все четные.

9.Построить линейный список из входной последовательности чисел. Удалить из него все простые числа.

20

10.Построить линейный список из входной последовательности чисел. Удалить из него все числа, кроме простых.

11.Построить линейный список из входной последовательности чисел. Поменять местами первое и последнее число.

12.Построить линейный список из входной последовательности чисел. Поменять местами первое и второе число, третье и четвертое и т. д.

13.Построить линейный список из входной последовательности чисел. Поменять местами первое и максимальное число, последнее и минимальное.

14.Построить линейный список из входной последовательности чисел. Удалить из него все числа, кратные 3.

15.Построить линейный список из входной последовательности чисел. Удалить из него все числа, кратные 5.

Для вариантов 16–21 используется текстовый файл, в котором в столбик записано 10 фамилий в алфавитном порядке.

16.Построить линейный список из фамилий. Оставить в нем только фамилии, начинающиеся на букву «А», остальные удалить.

17.Построить линейный список из фамилий. Удалить из него фамилии, начинающиеся на букву «А».

18.Построить линейный список из фамилий. Удалить из него самую длинную фамилию.

19.Построить линейный список из фамилий. Удалить из него самую короткую фамилию.

20.Построить линейный список из фамилий. Вставить в него введенную фамилию, сохранив алфавитный порядок.

21.Построить линейный список из фамилий. Удалить

из него введенную фамилию.

Для вариантов 22–25 используется текстовый файл, в котором записана строка символов.

22. Построить линейный список из символов. Удалить из него цифры.

21

23.Построить линейный список из символов. Удалить из него запятые.

24.Построить линейный список из символов. Удалить из него повторяющиеся пробелы.

25.Построить линейный список из символов. Поменять местами первый и последний символ.

26.Удалить из списка все одинаковые значения.

27.В списке поменять местами третий отрицательный элемент с минимальным значением. Если в списке несколько минимальных элементов, то удалить все, кроме одного.

28.Если в списке отрицательные элементы идут подряд, удалить все, кроме одного.

29.Не меняя порядок записи чисел в списке выдать элементы списка в порядке возрастания значений.

30.Сдвинуть элементы списка циклически на k пози-

ций.

Ниже дана программа формирования списка и операций над списком. Эта программа является базовой для решения лабораторных работ данного раздела. Подробно данная тема раскрывается в пособии [1].

#include <conio.h> #include <stdio.h> #include <iostream.h>

// Определяется структура. Заказываем необходимый размер

// памяти для записи информации о новом объекте. struct node

{ int inf; // Поле для записи целых чисел.

node *next; // Поле указателя для записи адресов элементов

//типа node.

};

22

void main()

{node *r, *fr = NULL, *er; // fr – указатель на головной

//элемент списка.

//er – указатель на последний элемент списка.

//r – указатель для формирования нового узла списка.

node *rp;

int a, b;

// a – переменная для записи целых чисел.

clrscr(); FILE *f;

f = fopen("t.dat","r");

 

// Начало формирования списка.

do

// Начало цикла ввода чисел из файла.

{ fscanf(f,"%d", &a);

// Ввод числа из файла.

r = new node; // Создаем новый элемент списка.

// Выделяем память для нового элемента. r->inf = a; // Инициализируем поле inf нового элемента

списка.

r->next = NULL; // Инициализируем поле указателя //нового элемента списка

if (fr == NULL) // Проверяем: список существует или нет. //Если fr = NULL, то списка нет.

fr = r; // Поэтому новый элемент объявляем головным.

else // Если список существует, то

er -> next = r; // новый элемент присоединяем к списку. er = r; } // Новый элемент объявляем последним.

while (!feof(f)); // Конец цикла ввода чисел из файла. fclose(f);

//Конец формирования списка.

//Вывод списка на экран.

cout << "\tСформирован список:\n\n"; r = fr;

23

while (r != NULL) // Пока не дошли до последнего

//элемента списка

{cout << r -> inf << " "; // Вывод информации из поля inf

//адрес которого находится в указателе r. r = r -> next; // Переход к следующему элементу списка.

//Для этого из поля next текущего элемента списка

//в указатель r пересылаем адрес на следующий элемент.

}getch();

cout << "\n\nУдалить узел cо значением k= "; cin >> a;

r = fr;

if (r -> inf == a)

{ cout << "\nудаляется головной узел списка\n";

fr = fr -> next; // В указатель на первый элемент пересылаем // адрес второго элемента списка.

delete r;

}

else

{ while ((r -> inf != a) && ( r != NULL)) // Поиск элемента,

{ // который надо удалить.

rp = r; // Запоминаем адрес пройденного элемента. r = r -> next; } // Переходим на новый элемент.

if (r -> inf == a) // Проверяем, найден элемент или нет.

{ cout << " Удаляется узел со значением= " << r -> inf << "\n\n";

rp -> next = r -> next; // Поле указателя удаляемого элемента

//пересылаем в поле указателя элемента, который

//расположен перед удаляемым.

delete r;

cout << "\tСписок после удаления элемента: \n\n"; r = fr;

24

while (r != NULL) // Пока не дошли до последнего элемента

//списка

{cout << r -> inf << " "; // Вывод значения текущего

//элемента списка

r = r -> next; // Переход к следующему элементу списка.

//Для этого из поля next текущего элемента списка

}// в указатель r пересылаем адрес на следующий

//элемент.

}

else

cout << "\n" << "Узел со значением " << a << " не найден "; getch(); }

// Вставка нового элемента в список.

cout << "\n\nВставить в список элемент со значением b= ";

cin >> b;

cout << "\n\nЗа элементом со значением n = "; cin >> a;

r = fr;

while ((r -> inf != a) && (r != NULL)) r = r -> next;

if (r -> inf == a)

{

rp = new node; // Выделяем память под новый элемент. rp -> inf = b; // Заполняем поле inf нового элемента.

rp -> next = r -> next; // К новому элементу присоединяем // правую часть списка.

r -> next = rp; // К левой части списка присоединяем // новый элемент списка.

cout << "Cписок после вставки элемента со значением: " << b << "\n";

r = fr;

25

while (r != NULL)

{

cout << r -> inf << " "; r = r -> next;

}

}

else

cout << "\nЭлемент списка со значением " << a << " не найден ";

// Вставка в список нового головного элемента.

cout << "\n\nВведи значение для нового головного элемента n

= ";

cin >> a;

rp = new node; // Выделяем память под новый элемент. rp -> inf = a; // Заполняем поле inf нового элемента.

rp -> next = fr; // Новый элемент делаем первым. fr = rp; // В указатель на первый элемент списка

// пересылаем адрес нового элемента. cout << "\nСписок с новым головным элементом:\n";

r = fr;

while (r != NULL)

{ cout << r -> inf << " "; r = r -> next; }

getch(); }

26

Лабораторная работа №4 Двусвязные линейные списки

Цель работы – овладеть практическими навыками работы с двусвязными линейными списками. Научиться формировать списки, освоить технику программирования операций над списками.

Задания:

1. Изучить:

а) способы формирования списка; б) операции над списками: удалить элемент из списка,

добавить элемент в список, найти элемент в списке; в) способы вывода списка.

2.Разработать алгоритм решения задачи.

3.Составить программу решения задачи.

4.Отладить программу.

Контрольные вопросы :

Все вопросы в данном пункте рассматриваются для списка, элементами которого являются следующие объекты:

struct zvn { int inf; zvn *lf, *rt;}

1.Как определить объект для списка, элементами которого являются числа.

2.Как определить объект для списка, элементами которого являются слова.

3.Как определить объект для списка, элементами которого являются указатели.

4.Определены переменные: zvn *fst = NULL, *en = NULL, *r. Указатели fst, en, r – соответственно для адреса пер-

27

вого, последнего элемента списка и промежуточных значений адресов переменных типа zvn. Сформирован список, с элементами типа zvn. Напишите коды перебора элементов списка.

5.Перечислите информацию, которая необходима для того, чтобы удалить из списка со значением, равным некоторому числу k.

6.Перечислите информацию, которая необходима для того, чтобы в список добавить элемент со значением равным некоторому числу k.

7.Определены переменные: zvn *fst = NULL, *en=NULL, *r. Сформирован список. Пусть в указателе en находится адрес последнего элемента списка. Напишите коды присоединение нового элемента типа zvn к списку.

8.В указателе r находится адрес некоторого элемента списка. Напишите код вывода элемента списка, который является пятым относительно данного. Циклы не использовать. Ответ должен состоять из одной директивы.

9.В указателе r находится адрес некоторого элемента списка. Напишите код вывода элемента списка, относительно которого данный элемент является пятым. Циклы не использовать. Ответ должен состоять из одной директивы.

10.Определены переменные: zvn *fst = NULL, *en=NULL, *r. Объясните код r -> lf.

11.Определены переменные: zvn *fst = NULL, *en=NULL, *r. Объясните код r -> inf.

12.Определены переменные: zvn *fst = NULL, *en=NULL, *r. Объясните код r = r -> lf.

13.Определены переменные: zvn *fst = NULL, *en=NULL, *r. Объясните код r ->lf->lf->lf-> lf-> inf.

14.Определены переменные: zvn *fst = NULL, *en=NULL, *r. Объясните код r -> rt -> rt -> rt -> rt -> inf.

15.Перечислите информацию, которая необходима для того, чтобы удалить из списка головной (первый) элемент списка.

28