Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по АиСД.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
85.63 Кб
Скачать

Поиск элемента в однонаправленном списке

Операция поиска элемента в списке заключается в последовательном просмотре всех элементов списка до тех пор, пока текущий элемент не будет содержать заданное значение или пока не будет достигнут конец списка. В последнем случае фиксируется отсутствие искомого элемента в списке (функция принимает значение 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;

}}