-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.cpp
executable file
·127 lines (99 loc) · 4.4 KB
/
main.cpp
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
// Подключение заголовочных файлов
// из стандартной библиотеки:
#include <iostream> // ввод/вывод.
#include <windows.h> // нужно для функций SetConsoleOutputCP и SetConsoleCP.
// Переход на кириллицу:
void cyrillic() {
// Эти строки нужны для правильного отображения кириллицы:
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
// Также надо изменить шрифт в консоли на Lucida Console.
// Для замены шрифта кликаете правой кнопкой на надписи «Командная строка» окна консоли.
// В открывшемся меню выбираете «Свойства».
// В появившемся окне выбираете вкладку «Шрифт» и там выбираете «Lucida Console».
}
// Использование пространства имён
// стандартной библиотеки:
using namespace std;
// Объявление структуры элемента списка
// и указателей на требуемые элементы:
struct el {
int ELEM;
struct el* posl;
} EL, *pTEK, *pPRED, *temp, *pSTART, *pEND;
// Процедура для вывода на экран списка:
void print() {
cout << "\n--------------------------";
pTEK = pSTART;
cout << "\nАдрес нач. элемента: " << pSTART;
do {
cout << "\nАдрес элемента = " << pTEK << ". Элемент = " << pTEK->ELEM << ". Адрес след. элемента = " << pTEK->posl;
pTEK = pTEK->posl;
} while (pTEK != pSTART);
cout << "\nАдрес конеч. элемента: " << pEND;
}
// Главная функция (точка входа в программу):
int main() {
cyrillic(); // вкл. кириллицу.
int z;
int flag = 0;
// Бесконечный цикл для ввода элементов списка,
// так как количество элементов неизвестно:
for (;;) {
cout << "\nВвести элемент? ";
cin >> z;
if (z < 1) break;
// Выделенная память заносится в указатель на текущий элемент:
pTEK = (struct el*)(malloc(sizeof(EL)));
// При создании первого элемента сохраняются соответствующие адреса:
if (flag == 0) {
pSTART = pTEK;
pPRED = pTEK;
pEND = pTEK;
flag = 1;
}
cout << "\nЭлемент -> ";
// Первоначальное определение полей элемента списка:
cin >> pTEK->ELEM;
pTEK->posl = pSTART;
// Изменение указателей на конец списка и предыдущий элемент:
pPRED->posl = pTEK;
pEND = pPRED = pTEK;
}
// Вывод на экран списка:
print();
cout << "\n\nПоиск искомого числа в списке и добавление после него нового числа:";
int ch;
cout << "\nВведите число для проверки -> ";
cin >> ch;
pTEK = pSTART;
for (;;) {
// В temp хранится адрес последующего элемента списка,
// что требуется для выхода из цикла:
temp = pTEK->posl;
if (pTEK->ELEM != ch) {
if (temp == pSTART) break;
pTEK = pTEK->posl;
continue;
}
// Выделенная память заносится в указатель на следующий элемент:
pTEK->posl = (struct el*)(malloc(sizeof(EL)));
cout << "\nНовый элемент -> ";
// Первоначальное определение полей нового элемента списка:
cin >> pTEK->posl->ELEM;
pTEK->posl->posl = temp;
if (pEND == pTEK) {
pEND = pTEK->posl;
}
pTEK = pTEK->posl;
}
// Вывод на экран списка:
print();
// Пауза перед выходом из программы
// (программа ждёт ввода любого символа):
cin.get();
cin.get();
// Возврат нуля,
// что означает успешное завершение программы:
return 0;
}