Файл: Практическая работа 2 Динамические структуры данных Списки.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 26.10.2023
Просмотров: 180
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Практическая работа №2 «Динамические структуры данных»
Рис.1 – Стек из трех элементовРис. 2 – Очередь из трех элементовПри этом в программе выражение pbegозначает указатель на первое звено в цепочке; *pbegозначает само первое звено, (*pbeg).info— первый элемент списка. По-другому первыйэлемент обозначается с помощью операции доступа к члену структуры через указатель:pbeg−>info. Выражение pbeg−>next означает указатель на второе звено. Далее,*pbeg−>next — само второе звено,pbeg−>next−>info— второй элемент списка,pbeg−>next−>next — указатель на третье звено,*pbeg–>next−>next — само третье звено,pbeg−>next−>next−>info— третий элемент списка,pbeg−>next−>next−>next — пустой указатель (конец списка).Заметим, что соседние звенья цепочки располагаются в оперативной памяти произвольно относительно друг друга, в отличие от соседних компонент массива, всегда занимающих смежные участки памяти. Такое расположение звеньев облегчает операции вставки и удаления, так как нет необходимости перемещать элементы, как это было бы в случае реализации списков массивами.2.2 Добавление нового элемента в стекОпределена структура, которая будет использоваться в последующих примерах:#define STACK struct ListSTACK{ char info;STACK *next;};Функция добавления элемента в стек:
Пример. Пусть в стек, состоящий из элементов (‘a’,’b’,’c’) (элементы указаны в порядке их добавления в стек), представленный в программе переменной s, необходимо добавить новый элемент ‘d’. Для этого вызывается функция push:push(&s,’d’);На рис. 3 показано происходящее после каждого шага изменения.Рис. 3 – Добавление элемента в стек
2.3 Удаление элемента из стекаФункция удаления элемента из стека:
Пример. Пусть из стека, состоящего из элементов (‘a’,’b’,’c’) (элементы указаны в порядке их добавления в стек), представленного в программе переменной s, необходимо удалить элемент ‘c’. Для этого вызывается функция del:del(&s);На рис. 4 показано происходящее после каждого шага изменения.
-
Списки
-
Односвязные – каждый элемент списка имеет указатель на следующий; -
Двусвязные – каждый элемент списка имеет указатель на следующий и на предыдущий элементы; -
Циклические – первый и последний элементы списка ссылаются друг на друга, и цепочка представляет собой кольцо.
-
Информационное поле, которое в общем случае может содержать произвольное количество полей разных типов. -
Указатель на следующий элемент списка, или пустой указатель, если следующего элемента нет.
-
Односвязный список
Рис.1 – Стек из трех элементовРис. 2 – Очередь из трех элементовПри этом в программе выражение pbegозначает указатель на первое звено в цепочке; *pbegозначает само первое звено, (*pbeg).info— первый элемент списка. По-другому первыйэлемент обозначается с помощью операции доступа к члену структуры через указатель:pbeg−>info. Выражение pbeg−>next означает указатель на второе звено. Далее,*pbeg−>next — само второе звено,pbeg−>next−>info— второй элемент списка,pbeg−>next−>next — указатель на третье звено,*pbeg–>next−>next — само третье звено,pbeg−>next−>next−>info— третий элемент списка,pbeg−>next−>next−>next — пустой указатель (конец списка).Заметим, что соседние звенья цепочки располагаются в оперативной памяти произвольно относительно друг друга, в отличие от соседних компонент массива, всегда занимающих смежные участки памяти. Такое расположение звеньев облегчает операции вставки и удаления, так как нет необходимости перемещать элементы, как это было бы в случае реализации списков массивами.2.2 Добавление нового элемента в стекОпределена структура, которая будет использоваться в последующих примерах:#define STACK struct ListSTACK{ char info;STACK *next;};Функция добавления элемента в стек:
| void push (STACK **top, char item) { STACK *new_item; new_item = new STACK; new_item->info = item; new_item->next = *top; *top = new_item; } | //*top – указатель на вершину стека, //item – символ, который заносится в стек; //указатель на новый элемент стека; //создаем элемент стека; //заполняем поле info; //присоединяем в конец стека новый элемент //вершиной стека становится новый элемент; |
2.3 Удаление элемента из стекаФункция удаления элемента из стека:
| void del (STACK **top) { STACK *old_item = *top; if(*top) { *top =(*top)->next; free(old_item); } } | //*top – указатель на вершину стека //old_item – указатель на удаляемый элемент; //если стек не пуст (*top!=NULL) //переносим указатель *top на следующий элемент стека, вершиной стека становится предыдущий элемент последовательности //уничтожаем элемент old_item |
-
Рис. 4 – Удаление элемента из стека -
2.4 Добавление нового элемента в очередь
-
-
Функция добавления элемента в очередь: -
| void insert(QUEUE **pbeg, char item) { QUEUE *current = *pbeg; QUEUE *previous = 0; QUEUE *new_node; while (current) { previous = current; current = current -> next; } new_node = new QUEUE; new_node->info = item; if (previous) { new_node->next = 0; previous->next = new_node; } else { *pbeg = new_node; (*pbeg)->next = 0; } } | //*pbeg – указатель на первый элемент очереди //current – указатель на текущий элемент очереди; указывает на первый элемент //указатель на предыдущий элемент очереди //указатель на новый элемент очереди //пока текущий элемент не равен NULL //указатель previous указывает на тот же элемент, что и указатель current //перемещение указателя current на следующий по отношению к текущиму элемент //создаем новый элемент очереди //записываем в поле info нового элемента значение переменной item //если очередь не пустая (добавляется элемент в конец очереди) //указатель на следующий элемент после нового равен нулю (т.е. элемент не существует) //следующим по отношению к последнему элементу очереди становится новый элемент //если очередь пустая (добавляется первый элемент очереди) //первым элементом очереди будет новый элемент //указатель на следующий элемент поcле первого элемента равен 0 (т.е. элемент не существует) |
-
Пример 1. Необходимо сформировать очередь, состоящую из трех элементов (‘a’,’b’,’c’), представленную в программе переменной q. Для этого используется функция insert. -
-
QUEUE *q; -
insert(&q,’a’); -
insert(&q,’b’); -
insert(&q,’c’);
-
На рис. 5 показаны изменения, происходящие при добавлении первого элемента очереди, на рис. 6 – при добавлении второго элемента очереди, на рис. 7 – добавление третьего элемента очереди. -
-
Рис. 5 – Добавление первого элемента очереди
-
-
Рис. 7 – Добавление третьего элемента очереди -
-
Пример 2. Пусть в очередь, состоящую из трех элементов (‘a’,’b’,’c’), представленную в программе переменной q, необходимо добавить элемент ‘d’ после элемента ‘b’. В этом случае необходимо добавить элемент в середину очереди. -
-
Функция добавления элемента в середину очереди: -
void insert_mid(QUEUE **pbeg, char item)
{
QUEUE *current;
QUEUE *new_node;
current = *pbeg;
while(current->info!=’b’)
{
current = current->next;
}
new_node = new QUEUE;
new_node->info = item;
new_node->next = current->next;
current->next = new_node;
}
//*pbeg – указатель на первый элемент очереди
//текущий элемент очереди
//новый элемент очереди-
//просмотр очереди начинаем с первого элемента
//пока поле info текущего элемента не содержит символ ‘b’
//указатель current перемещается на следующий элемент очереди
//создаем новый элемент очереди
//в поле info нового элемента заносится значение ‘d’
//следующим элементом по отношению к новому становится следующий по отношению к текущему элемент
//следующим по отношению к текущему элементу становится новый элемент
-
-