1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| #include "stdafx.h"
#include <iostream>
using namespace std;
#include <clocale>
#include <conio.h>
struct spisok //создание
{
int d;
spisok *next;//следующий
spisok *prev;//вернуться
};
spisok *first()//формирование первого элемента
{
spisok *pv=new spisok;//создание переменной pv, присваивание ей все свойства структуры
cout<<endl<<"Введите целое число"<<endl;
cin>>pv->d;
pv->next=0;// присваивает сл элементу 0
return pv;
}
void add (spisok **pend)//добавление элементов
{
spisok *pv=new spisok;
cout<<endl<<"Введите целое число"<<endl;
cin>>pv->d;
pv->next=0;
(*pend)->next=pv;
*pend=pv;
}
void vivod(spisok*pv) // функция вывода списка
{
cout << "Список:" << endl;
while (pv) // пока в списке есть элементы
{
cout << pv ->d << endl; // вывод элементов
pv = pv ->next; // переход к сл элементу
}
}
spisok* search(spisok * const pbeg, int q) // функция поиска
{
spisok*pv=pbeg; // приваивает элементу pv адрес первого элемента
while (pv) // пока в списке есть элементы
{
if(pv->d == q) // условие проверки
{
return pv; // возврат значения найденного элемента
break;
}
else
{
pv=pv->next; // переход к следующему элементу
}
}
}
bool deleting(spisok**pbeg, spisok**pend, int del) // функция удаления
{
if(spisok*pkey= search(*pbeg,del)) // присваивает переменной pkey значение найденного с помощью функции search элемента
{
if(pkey==*pbeg) // если pkey = первому элементу
{
*pbeg = (*pbeg)->next; // первому элементу присваиваем значение следующего
(*pbeg)->prev=0; // и обнуляем предыдущее
}
else if (pkey == *pend) // если pkey = последнему элементу
{
*pend=(*pend)->prev; // последнему элементу присваиваем значение
(*pend)->next=0; // и обнуляем предыдущее его.
}
else
{
(pkey->prev)->next = pkey->next;
(pkey->next)->prev = pkey->prev;
}
delete pkey; // удаляем переменную pkey
return true; // возвращаем значение истина
}
return false; // возвращаем значение ложь, если элемент не найден в списке.
}
void ins (spisok* const pbeg, spisok**pend, int key, int pos)//функция вставки
{
if(spisok *pkey = search(pbeg,pos)) //есть ли в списке введённый элемент, после которого нужно добавить новый элемент
{
spisok*pv=new spisok;
pv->d = key; // создаёт новый элемент
pv->next = pkey->next;
pv->prev = pkey;
pkey->next = pv; // перемещает элементы
if(pkey != *pend) // проверка не является ли введённый элемент, после которого нужно вставить последним.
(pv->next)->prev = pv; // добавляет элемент между ними
else
*pend=pv; // если является, то вставляем на последнее место
}
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Russian");
spisok*pbeg=first(); // добавляем первый элемент
spisok*pend=pbeg; // последнему элементу присваем значение первого
for(int i=0;i<3;i++) // цикл добавления элементов в список
add(&pend); // вызов функции добавления элемента
vivod(pbeg); // вызов функции вывода списка на экран
cout << "Введите элемент для удаления" << endl;
int del;
cin >> del;
if(!deleting(&pbeg,&pend,del)) // условие, проверяющее элемент на наличие в списке, для его удаления из списка.
cout << "Элемент не найден!" << endl;
vivod(pbeg); // вывод списка
cout << "Введите элемент" << endl;
int key;
cin >> key;
cout << "Введите число, после которого необходимо поместить элемент " << key << endl;
int pos;
cin >> pos;
ins(pbeg,&pend,key,pos); // вызов функции вставки
vivod(pbeg);
_getch();
} |