- •Теоретическая часть
- •1. Вещественные типы данных
- •2. Сортировка массивов
- •3. Однонаправленные списки
- •Создание однонаправленного списка
- •Печать (просмотр) однонаправленного списка
- •Вставка элемента в однонаправленный список
- •Удаление элемента из однонаправленного списка
- •Поиск элемента в однонаправленном списке
- •Удаление однонаправленного списка
- •Практическая часть Задание 7: написать программу, реализующую двунаправленный список, состоящий из элементов целого типа. Создать следующие функции:
- •Библиографический список
Поиск элемента в однонаправленном списке
Операция поиска элемента в списке заключается в последовательном просмотре всех элементов списка до тех пор, пока текущий элемент не будет содержать заданное значение или пока не будет достигнут конец списка. В последнем случае фиксируется отсутствие искомого элемента в списке (функция принимает значение false ).
//поиск элемента в однонаправленном списке
bool Find_Item_Single_List(Single_List* Head, int DataItem){
Single_List *ptr; //вспомогательным указатель
ptr = Head;
while (ptr != NULL){//пока не конец списка
if (DataItem == ptr->Data) return true;
else ptr = ptr->Next;
}
return false;
}
Удаление однонаправленного списка
Операция удаления списка заключается в освобождении динамической памяти. Для данной операции организуется функция, в которой нужно переставлять указатель на следующий элемент списка до тех пор, пока указатель не станет равен NULL, то есть не будет достигнут конец списка. Реализуем рекурсивную функцию.
/*освобождение памяти, выделенной под однонаправленный список*/
void Delete_Single_List(Single_List* Head){
if (Head != NULL){
Delete_Single_List(Head->Next);
delete Head;
}
}
Таким образом, однонаправленный список имеет только один указатель в каждом элементе. Это позволяет минимизировать расход памяти на организацию такого списка. Одновременно это позволяет осуществлять переходы между элементами только в одном направлении, что зачастую увеличивает время, затрачиваемое на обработку списка. Например, для перехода к предыдущему элементу необходимо осуществить просмотр списка с начала до элемента, указатель которого установлен на текущий элемент.
Практическая часть Задание 7: написать программу, реализующую двунаправленный список, состоящий из элементов целого типа. Создать следующие функции:
1. Создать список.
2. Добавить элемент (добавление в конец списка).
3. Удалить i-тый элемент.
4. Вывести на экран содержимое списка.
Листинг программы:
#include <iostream>
#include <stdlib.h>
#include<conio.h>
using namespace std;
template <class T>
class List
{
public:
List()
{
First = Last = NULL;
count = 1;
}
~List()
{
while (First)
{
Last = First->next;
delete First;
First = Last;
}
}
int count;
void PushBack(T chislo)
{
Node *p = new (Node);
p->next = NULL;
p->data = chislo;
if (First != NULL)
{
p->prev = Last;
Last->next = p;
Last = p;
}
else
{
p->prev = NULL;
First = Last = p;
}
count++;
}
void PushAfter(T chislo, int position)
{
if(position >= count) return;
int current = 1;
Node *p = new (Node);
p->data = chislo;
Node *p1 = First;
while(current < position)
{
p1 = p1->next;
current++;
}
if(p1 == Last)
{
PushBack(chislo);
}
else
{
p->prev = p1;
p->next = p1->next;
(p1->next)->prev = p;
p1->next = p;
}
count++;
}
void Print()
{
Node* p;
p = First;
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void Pop(int position)
{
Node *p;
int current;
if(position >= count) return;
if(count / 2 < position)
{
p = Last;
current = count - 1;
while(current != position)
{
p = p->prev;
current--;
}
}
else
{
p = First;
current = 1;
while(current != position)
{
p = p->next;
current++;
}
}
if(p == Last)
{
if(count > 1)
{
(p->prev)->next = NULL;
p = p->prev;
delete Last;
Last = p;
}
else
{
delete Last;
Last = First = NULL;
}
}
else if(p == First)
{
(p->next)->prev = NULL;
p = p->next;
delete First;
First = p;
}
else
{
(p->prev)->next = p->next;
(p->next)->prev = p->prev;
delete p;
}
count--;
}
private:
struct Node {
T data;
Node *next, *prev;
};
Node* First;
Node* Last;
};
int main()
{
setlocale(0, "");
List<int> list;
int chislo, a,position;
{
while(true)
{
cout<<"///////////////////"<<endl;
cout<< " Введите действие: "<<endl;
cout<<"///////////////////"<<endl;
cout<<" 1. Создать список "<<endl;
cout<<" 2. Добавить элемент в конец списка "<<endl;
cout<<" 3. Удалить i-ый элемент "<<endl;
cout<<" 4. Вывести на экран содержимое списка "<<endl;
cout<<" 5. Выход "<<endl;
cout<<"///////////////////"<<endl;
cout<<endl;
cin>>a;
cout<<endl;
switch (a)
{
case 1:
cout << "Введите число для создания списка: " << endl;
cout<<endl;
cin >> chislo;
cout<<endl;
list.PushBack(chislo);
break;
case 2:
cout << "Введите число для добавления в конец списка" << endl;
cout<<endl;
cin >> chislo;
cout<<endl;
list.PushBack(chislo);
break;
case 3:
if(list.count < 1)
{
cout << "Добавьте хотя бы один элемент в список!" << endl;
cout<<endl;
system("pause");
}
else
{
cout << "Введите позицию удаляемого элемента" << endl;
cout<<endl;
cin >> position;
cout<<endl;
list.Pop(position);
cout<<endl;
}
break;
case 4:
if(list.count == 1)
cout << "Список пуст" << endl;
else
list.Print();
cout<<endl;
system("pause");
break;
case 5:
return 0;
}
}
return 0;
}}
