Вывод на экран содержимого списка ShowData - C (СИ)
Формулировка задачи:
Реализовать список и функции работы с ним. С помощью рекурсивных алгоритмов реализовать операции:
• вывод на экран содержимого списка ShowData(),
• поиск элемента с заданным значением в списке. Результат функции GetPos() – указатель на найденный элемент.
• очистка списка Clear()
• удаление элемента с заданным значением из списка Delete().
С помощью итерационных алгоритмов реализовать операции:
• получение значения элемента в заданной позиции списка GetData(),
• получение номера позиции в списке элемента с заданным значением GetPos(),
• очистка списка Clear()
• включение нового элемента в список Insert(),
• удаление элемента с заданным номером позиции из списка Delete().
Односвязный упорядоченный список. Рекурсивные алгоритмы операций
Решение задачи: «Вывод на экран содержимого списка ShowData»
textual
Листинг программы
struct Data
{
int key;
};
struct Node
{
Node* next;
Data* data;
};
void Insert(Node** root,Data* data)
{
if(!*root)
{
*root = new Node;
(*root)->next = NULL;
(*root)->data = data;
}
else
{
Node* i = *root;
while(i->next)
i = i->next;
i->next = new Node;
i = i->next;
i->data = data;
i->next = NULL;
}
}
void ShowData(Node* root)
{
if(root)
{
printf("%d ",root->data->key);
ShowData(root->next);
}
}
Data* GetData(Node* root,int index)
{
if(root)
{
Node* i = root;
int j = 0;
while(i)
{
if(j == index)
return i->data;
j++;
i = i->next;
}
}
return NULL;
}
int GetPos(Node* root, Data* data)
{
//Возвращяет -1 в случае отсутствия элемента или пустого списка
if(root)
{
Node* i = root;
int j = 0;
while(i)
{
if(i->data->key == data->key)
return j;
j++;
i = i->next;
}
}
return -1;
}
void Clear(Node** root)
{
if(*root)
{
while(*root)
{
Node* i = (*root)->next;
delete (*root)->data;
delete *root;
*root = i;
}
}
}
void Delete(Node** root,int index)
{
if(*root)
{
if(!index)
{
Node* i = (*root)->next;
delete (*root)->data;
delete *root;
*root = i;
}
else
{
Node* i = * root;
int j = 0;
while(i)
{
if((j + 1)== index)
{
if(i->next)
{
Node* tmp = i->next;
i->next = i->next->next;
delete tmp->data;
delete tmp;
}
break;
}
i = i->next;
j++;
}
}
}
}
Объяснение кода листинга программы
- Структура данных представлена двумя типами:
DataиNode.Dataсодержит полеkey, аNodeсодержит указатель на следующий элемент списка (next) и указатель на элемент данных (data). - Функция
Insertдобавляет новый элемент списка, используя структуруNode. Если список пуст, то создается новый узел, иначе новый узел добавляется в конец списка. - Функция
ShowDataпроходит по всем элементам списка и выводит значение поляkeyкаждого элемента. - Функция
GetDataвозвращает элемент списка с указанным индексом. Если индекс вне диапазона, то возвращаетсяNULL. - Функция
GetPosвозвращает позицию элемента в списке с указанным значением поляkey. Если элемент не найден, то возвращается -1. - Функция
Clearудаляет все элементы из списка. - Функция
Deleteудаляет элемент списка с указанным индексом. Если индекс равен 0, то удаляется первый элемент списка.