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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
| #include<iostream.h>
#include<math.h>
#include<locale.h>
#include<windows.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <vcl.h>
struct base_condominium {
//Область данных
int n_room;
int floor;
int area;
char address[40];
//ссылка на следующий элемент
base_condominium *next;
};
typedef base_condominium *p_node;
// создаем новый элемент списка
p_node create_node(){
p_node new_node = (p_node) malloc(sizeof(base_condominium)); //указатель на новый узел
printf("\nAddress: ");
scanf("%s", &new_node->address);
printf("\nArea: ");
scanf("%d", &new_node->area);
printf("\nFloor: ");
scanf("%d", &new_node->floor);
printf("\nRoom: ");
scanf("%d", &new_node->n_room);
new_node->next = NULL; // следующего узла нет
return (new_node);
}
//добавление узла в начало списка
void add_first(p_node &head, p_node new_node){
new_node->next = head;
head = new_node;
}
// Добавление узла после заданного
void add_after (p_node p, p_node new_node){
new_node->next = p->next;
p->next = new_node;
}
//добавление узла в конец списка
void add_last(p_node &head, p_node new_node){
p_node q=head;
if (head == NULL) { //если список пуст
add_first(head, new_node);
return;
}
while (q->next) q=q->next; //ищем последний элемент
add_after(q,new_node);
}
//поиск узла по параметрам
p_node find (p_node head, int ar,int fl,int n){
p_node q = head;
while (q) {
if ((q->floor==fl) && ( q->n_room==n) && (q->area-ar <=10))
return q;
q=q->next;
}
return q;
}
//удаление узла из списка
void delete_node( p_node &head, p_node old_node){
p_node q = head;
//отдельно обрабатываем если это начало списка
if (head == old_node)
head = old_node->next;
else {
while (q && q->next != old_node) //ищем элемент
q = q->next;
q->next = old_node->next; //меняем адреса
}
free(old_node); //освобождаем память
}
//добавление элемента в базу
void add_base(p_node &head){
p_node p = create_node();
add_last(head, p);
}
//просмотр всей базы
void view_node(p_node &head){
p_node p=head;
while (p) {
printf ("\n%s \n Ploshad`: %d\n Etazh: %d\n Kol-vo Komnat: %d\n", p->address, p->area, p->floor, p->n_room);
p=p->next;
}
}
//заявка на поиск
void new_q(p_node &head){
int fl=0, ar=0, n=0;
p_node p;
char a;
printf("\nVVedite zhelaemye plpshad`, etazh i kol-vo komnat iskomoy kvartiry ");
scanf("%d %d %d", &ar, &fl, &n);
p=find(head,ar,fl,n);
if (p) {
printf ("\nDostupnye kvartyry:\n%s \n Ploshad`: %d\n Etazh: %d\n Kol-vo Komnat: %d\n", p->address, p->area, p->floor, p->n_room);
delete_node(head,p);
}
else
{
do
{
printf ("\n Podhodyashey kvartiry ne naydeno. Hotite zanesty v bazu svoyu kvartiru? (Y/N)");
a = getch();
switch (a) {
case 'y':
case 'Y': add_base(head); break;
case 'n':
case 'N': break;
default: printf("\n Neverniy VVod\n");
}
}
while ((a!='n')&&(a!='N')&&(a!='y')&&(a!='Y'));
}
}
/* ОСНОВНАЯ ПРОГРАММА */
int main(){
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
p_node head = NULL; //в head хранится указатель на начало списка.
// пока в списке нет элементов head=NULL;
char c;
do {
setlocale( LC_ALL, "rus" );
printf("\n Vvedite identefikator deystviya\n");
printf(" N (New) - Novaya Zayavka\n V (View) - Prosmotret` Spisok\n A (Add) - Dobavit` Kvartiru\n E (Exit) - Exit\n");
c = getch();
switch (c) {
case 'e':
case 'E': break;
case 'a':
case 'A': add_base(head); break;
case 'v':
case 'V': view_node(head); break;
case 'n':
case 'N': new_q(head); break;
default : printf("Neverniy vvod\n"); break;
}
}
while (( c!='e')&&(c!='E'));
return(0);
} |