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

Практика 3

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

Практика 3 “Списковые структуры”

Здесь и далее ввод данных производится из stdin, а вывод в stdout,

если не сказано обратное. Использование массивов не допускается.

Односвязные списки

Односвязный список - динамическая структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и ссылку на следующий узел списка. Список задается двумя ссылками на его узлы: начальный и конечный.

Ниже представлена структура, описывающая узел в односвязном списке:

struct node

 

{

 

int value;

// значение, которое хранит

узел

 

struct node *next;

// ссылка на следующий элеме

нт списка

 

};

 

Двусвязные списки

Двусвязный список - динамическая структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и ссылки на следующий и предыдущий узлы списка.

Ниже представлена структура, описывающая узел в двусвязном списке:

struct node

 

{

 

int value;

// значение, которое хранит

узел

 

struct node *next;

// ссылка на следующий элеме

нт списка

 

struct node *prev;

// ссылка на предыдущий элем

ент

 

};

 

Список задается двумя ссылками на его узлы: начальный и конечный.

Ниже представлена структура, описывающая список (list):

struct list

{

struct node *head; // начало списка struct node *tail; // конец списка

};

Задание 1

Необходимо реализовать функции для работы с односвязным списком:

// инициализация пустого списка void init(list* l);

//удалить все элементы из списка void clear(list* l);

// проверка на пустоту списка int isEmpty(list* l)

// поиск элемента по значению. вернуть NULL если элемент н е найден

node* find(list* l, int value);

// вставка значения в конец списка, вернуть 0 если успешно int push_back(list* l, int value);

// вставка значения в начало списка, вернуть 0 если успешн

о

int push_front(list* l, int value);

// вставка значения после указанного узла, вернуть 0 если успешно

int insertAfter(node* n, int value);

// удалить первый элемент из списка с указанным значением,

вернуть 0 если успешно

int remove(list* l, int value);

// вывести все значения из списка в прямом порядке, через пробел, после окончания вывода перейти на новую строку void print(list* l);

Используя реализованные функции реализовать программу которая:

1. считать количество элементов N, 0 < ≤ 2147483647;

2.создать пустой список, считать n элементов ai, |ai| ≤ 2147483647 и занести их в список;

3.вывести содержимое списка используя функцию print;

4.считать k1, k2, k3 |ki| ≤ 2147483647 и вывести ‘1’ если в списке существует элемент с таким значением. ‘0’ если нет.

перейти на новую строку.

5.считать m, |m| ≤ 2147483647 и вставить его в конец списка;

6.вывести содержимое списка используя функцию print;

7.считать t, |t| ≤ 2147483647 и вставить его в начало списка;

8.вывести содержимое списка используя функцию print;

9.считать j, 0 < j ≤ 2147483647 и x, |x| ≤ 2147483647 и вставить значение x после j-ого элемента списка;

10.вывести содержимое списка используя функцию print;

11.считать z, |z| ≤ 2147483647 и удалить первый элемент

хранящий значение z из списка;

12.вывести содержимое списка используя функцию print;

13.очистить список.

пример входных и выходных данных

input

output

 

 

5

1 2 3 2 4

 

 

1 2 3 2 4

101

 

 

2 5 1

1 2 3 2 4 5

 

 

5

7 1 2 3 2 4 5

 

 

7

7 1 2 0 3 2 4 5

 

 

3 0

7 1 0 3 2 4 5

 

 

2

 

 

 

Задание 2

Необходимо реализовать функции для работы с двусвязным списком:

// инициализация пустого списка void init(list* l);

//удалить все элементы из списка void clear(list* l);

// проверка на пустоту списка int isEmpty(list* l)

// поиск элемента по значению. вернуть NULL если элемент н е найден

node* find(list* l, int value);

// вставка значения в конец списка, вернуть 0 если успешно int push_back(list* l, int value);

// вставка значения в начало списка, вернуть 0 если успешн

о

int push_front(list* l, int value);

// вставка значения после указанного узла, вернуть 0 если успешно

int insertAfter(node* n, int value);

// вставка значения перед указанным узлом, вернуть 0 если успешно

int insertBefore(node* n, int value);

// удалить первый элемент из списка с указанным значением,

вернуть 0 если успешно

int removeFirst(list* l, int value);

// удалить последний элемент из списка с указанным значени

ем, вернуть 0 если успешно

int removeLast(list* l, int value);

// вывести все значения из списка в прямом порядке, через пробел, после окончания вывода перейти на новую строку void print(list* l);

// вывести все значения из списка в обратном порядке, чере з пробел, после окончания вывода перейти на новую строку void print_invers(list* l);

Используя реализованные функции реализовать программу которая:

1. считать количество элементов N, 0 < ≤ 2147483647;

2.создать пустой список, считать n элементов ai, |ai| ≤ 2147483647 и занести их в список;

3.вывести содержимое списка используя функцию print;

4.считать k1, k2, k3 |ki| ≤ 2147483647 и вывести ‘1’ если в списке существует элемент с таким значением. ‘0’ если нет.

перейти на новую строку.

5.считать m, |m| ≤ 2147483647 и вставить его в конец списка;

6.вывести содержимое списка используя функцию print_invers;

7.считать t, |t| ≤ 2147483647 и вставить его в начало списка;

8.вывести содержимое списка используя функцию print;

9.считать j, 0 < j ≤ 2147483647 и x, |x| ≤ 2147483647 и вставить значение x после j-ого элемента списка;

10.вывести содержимое списка используя функцию print_invers;

11.считать u, 0 < u ≤ 2147483647 и y, |y| ≤ 2147483647 и

вставить значение y перед u-ым элементом списка;

12.вывести содержимое списка используя функцию print;

13.считать z, |z| ≤ 2147483647 и удалить первый элемент хранящий значение z из списка;

14.вывести содержимое списка используя функцию print_invers;

15.считать r, |r| ≤ 2147483647 и удалить последний элемент хранящий значение r из списка;

16.вывести содержимое списка используя функцию print;

17.очистить список.

пример входных и выходных данных

input

output

 

 

5

1 2 3 2 4

 

 

1 2 3 2 4

101

 

 

2 5 1

1 4 2 3 2 1

 

 

1

7 1 2 3 2 4 1

 

 

7

1 4 2 3 0 2 1 7

 

 

3 0

7 1 2 0 8 3 2 4 1

 

 

5 8

1 4 2 3 8 0 1 7

 

 

2

7 1 0 8 3 2 4

 

 

1