Динамические структуры данных - составные структуры данных, динамически меняющие свой размер во время выполнения программы.
Двусвязный список
Двунаправленный (двусвязный) список – это структура данных, состоящая из последовательности элементов, каждый из которых содержит информационную часть и два указателя на соседние элементы. При этом два соседних элемента должны содержать взаимные ссылки друг на друга.
typedef struct node{
int value; // значение
struct node* prev; // указатель на предыдущий элемент
struct node* next; // указатель на следующий элемент
} node;
type – тип информационного поля элемента списка;
*next, *prev – указатели на следующий и предыдущий элементы этой структуры соответственно.
Для того, чтобы создать список, нужно создать сначала первый элемент списка, а затем при помощи функции добавить к нему остальные элементы. Добавление может выполняться как в начало, так и в конец списка. Реализуем рекурсивную функцию.
Удаление элемента из начала списка c получением его значения(listPop):
int listPop(node** list_ptr)
{
if (*list_ptr != NULL) {
node* next = (*list_ptr)->next;
int value = (*list_ptr)->value;
free(*list_ptr);
if (next != NULL)
next->prev = NULL;
*list_ptr = next;
return value;
}
else
exit(-1);
}
Удаление элемента из конца списка с получением его значения (listPopBack ):
int listPopBack(node** list_ptr)
{
if (*list_ptr != NULL) {
node* last = *list_ptr;
for(; last->next != NULL; last = last->next);
node* prev = last->prev;
int value = last->value;
free(last);
if (prev != NULL)
prev->next = NULL;
else
*list_ptr = NULL;
return value;
}
else
exit(-1);
}
Печать (просмотр) двунаправленного списка
Операция печати списка для двунаправленного списка реализуется абсолютно аналогично соответствующей функции для однонаправленного списка. Просматривать двунаправленный список можно в обоих направлениях.
В динамические структуры легко добавлять элементы, так как для этого достаточно изменить значения адресных полей. Операция вставки реализовывается аналогично функции вставки для однонаправленного списка, только с учетом особенностей двунаправленного списка
//вставка элемента с заданным номером в двунаправленный список
Double_List* Insert_Item_Double_List(Double_List* Head,
int Number, int DataItem){
Number--;
Double_List *NewItem=new(Double_List);
NewItem->Data=DataItem;
NewItem->Prior=NULL;
NewItem->Next = NULL;
if (Head == NULL) {//список пуст
Head = NewItem;
}
else {//список не пуст
Double_List *Current=Head;
for(int i=1; i < Number && Current->Next!=NULL; i++)
Current=Current->Next;
if (Number == 0){
//вставляем новый элемент на первое место
NewItem->Next = Head;
Head->Prior = NewItem;
Head = NewItem;
}
else {//вставляем новый элемент на непервое место
if (Current->Next != NULL) Current->Next->Prior = NewItem;
NewItem->Next = Current->Next;
Current->Next = NewItem;
NewItem->Prior = Current;
Current = NewItem;
}
}
return Head;
}
Многие коды представлены на С++. Меняйте вывод и выделение памяти.