Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.14 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. const unsigned int NAME_SIZE = 30;
  8. const unsigned int STREET_SIZE = 40;
  9. const unsigned int CITY_SIZE = 20;
  10. struct Address
  11. {
  12. char name[NAME_SIZE];
  13. char street[STREET_SIZE];
  14. char city[CITY_SIZE];
  15. Address *next;
  16. Address *prev;
  17.  
  18. };
  19. //-----------------------------------------------------------
  20.  
  21. int menu(void)
  22. {
  23. char s[80];
  24. int c;
  25. cout << endl;
  26. cout << "1. Ввод имени" << endl;
  27. cout << "2. Удаление имени" << endl;
  28. cout << "3. Вывод на экран" << endl;
  29. cout << "4. Поиск" << endl;
  30. cout << "5. Сохранить в файл" << endl;
  31. cout << "6. Загрузить из файла" << endl;
  32. cout << "7. Выход" << endl; cout << endl;
  33. cout << "8. Индивидуальное задание" << endl; cout << endl;
  34.  
  35. do
  36. {
  37. cout << "Ваш выбор: ";
  38. cin.sync();
  39. gets_s(s);
  40. cout << endl;
  41. c = atoi(s);
  42. } while (c < 0 || c > 8);
  43. return c;
  44.  
  45. }
  46. //-----------------------------------------------------------
  47. void create(Address *i, Address **phead, Address **plast)
  48. {
  49. Address *old = NULL, *p = *phead;
  50. if (*plast == NULL)
  51. {
  52. i->next = NULL;
  53. i->prev = NULL;
  54. *plast = i;
  55. *phead = i;
  56. return;
  57. }
  58.  
  59. while (p)
  60. {
  61. if (strcmp(p->name, i->name) < 0)
  62. {
  63. old = p;
  64. p = p->next;
  65. }
  66. else
  67. {
  68. if (p->prev)
  69. {
  70. p->prev->next = i; //середина
  71. i->next = p;
  72. i->prev = p->prev;
  73. p->prev = i;
  74. return;
  75. }
  76. i->next = p; //начло
  77. i->prev = NULL;
  78. p->prev = i;
  79. *phead = i;
  80. return;
  81. }
  82. }
  83. old->next = i;
  84. i->next = NULL;
  85. i->prev = old;
  86. *plast = i;
  87. }
  88.  
  89. //-----------------------------------------------------------
  90. Address* setElement() // Ввод структуры
  91. {
  92. Address* temp = new Address();
  93.  
  94. if (!temp)
  95. {
  96. cerr << "Ошибка выделения памяти памяти";
  97. return NULL;
  98. }
  99.  
  100. cout << "Введите имя: ";
  101. cin.getline(temp->name, NAME_SIZE - 1, '\n');
  102. cin.ignore(cin.rdbuf()->in_avail());
  103. cin.clear();
  104. cout << "Введите улицу: ";
  105. cin.getline(temp->street, STREET_SIZE - 1, '\n');
  106. cin.ignore(cin.rdbuf()->in_avail());
  107. cin.clear();
  108. cout << "Введите город: ";
  109. cin.getline(temp->city, CITY_SIZE - 1, '\n');
  110. cin.ignore(cin.rdbuf()->in_avail());
  111. cin.clear();
  112.  
  113. temp->next = NULL;
  114. temp->prev = NULL;
  115.  
  116. return temp;
  117. }
  118. //-----------------------------------------------------------
  119. void outputList(Address **phead, Address **plast) //Вывод списка на экран
  120. {
  121. Address *t = *phead;
  122. while (t)
  123. {
  124. cout << t->name << ' ' << t->street
  125. << ' ' << t->city << endl;
  126. t = t->next;
  127. }
  128. cout << "" << endl;
  129. }
  130. //-----------------------------------------------------------
  131.  
  132. void find(char name[NAME_SIZE], Address **phead) // Поиск имени в списке
  133. {
  134.  
  135. Address *t = *phead;
  136.  
  137. while (t)
  138. {
  139. if (!strcmp(name, t->name))
  140. break;
  141. t = t->next;
  142. }
  143. if (!t)
  144. cerr << "Имя не найдено" << endl;
  145. else
  146. cout << t->name << ' ' << t->street << ' ' << t->city << endl;
  147. }
  148. //-----------------------------------------------------------
  149. void delet(char name[NAME_SIZE], Address **phead, Address **plast) // Удаление имени из списка
  150. {
  151. struct Address *t = *phead;
  152.  
  153. while (t)
  154. {
  155. if (!strcmp(name, t->name))
  156. break;
  157. t = t->next;
  158. }
  159. if (t)
  160. {
  161. if (*phead == t)
  162. {
  163. *phead = t->next;
  164. if (*phead)
  165. (*phead)->prev = NULL;
  166. else
  167. *plast = NULL;
  168. }
  169. else
  170. {
  171. t->prev->next = t->next;
  172. if (t != *plast)
  173. t->next->prev = t->prev;
  174. else
  175. *plast = t->prev;
  176. } delete t;
  177. }
  178. }
  179. //-----------------------------------------------------------
  180. void writeToFile(Address **phead) //Запись в файл
  181. {
  182. struct Address *t = *phead;
  183. FILE *fp;
  184. errno_t err = fopen_s(&fp, "mlist", "wb");
  185. if (err)
  186. {
  187. cerr << "Файл не открывается" << endl;
  188. exit(1);
  189. }
  190. cout << "Сохранение в файл" << endl;
  191.  
  192. while (t)
  193. {
  194. fwrite(t, sizeof(struct Address), 1, fp);
  195. t = t->next;
  196. }
  197. fclose(fp);
  198. }
  199. //-----------------------------------------------------------
  200. void readFromFile(Address **phead, Address **plast) //Считывание из файла
  201. {
  202. struct Address *t;
  203. FILE *fp;
  204. errno_t err = fopen_s(&fp, "mlist", "rb");
  205. if (err)
  206. {
  207. cerr << "Файл не открывается" << endl;
  208. exit(1);
  209. }
  210. while (*phead)
  211. {
  212. *plast = (*phead)->next;
  213. delete *phead;
  214. *phead = *plast;
  215. }
  216. *phead = *plast = NULL;
  217. cout << "Загрузка из файла" << endl;
  218. while (!feof(fp))
  219. {
  220. t = new Address();
  221. if (!t)
  222. {
  223. cerr << "Ошибка выделения памяти памяти" << endl;
  224. return;
  225. }
  226. if (1 != fread(t, sizeof(struct Address), 1, fp))
  227. break;
  228. create(t, phead, plast);
  229. }
  230. fclose(fp);
  231. }
  232. void DeleteKFirst(int k, Address *p) {
  233. Address *f1;
  234. for (int i = 0; i < k; i++) {
  235. f1 = p->next;
  236. delete p;
  237. p = f1;
  238. }
  239.  
  240.  
  241. }
  242. //-----------------------------------------------------------
  243. int main(void)
  244. {
  245.  
  246. Address *head = NULL;
  247. Address *last = NULL;
  248.  
  249. setlocale(LC_CTYPE, "Rus");
  250.  
  251. while (true)
  252. {
  253. switch (menu())
  254. {
  255. case 1:
  256. {
  257. create(setElement(), &head, &last);
  258. }
  259. break;
  260. case 2:
  261. {
  262. char dname[NAME_SIZE];
  263. cout << "Введите имя: ";
  264. cin.getline(dname, NAME_SIZE - 1, '\n');
  265. cin.ignore(cin.rdbuf()->in_avail());
  266. cin.sync();
  267. delet(dname, &head, &last);
  268. }
  269. break;
  270. case 3:
  271. outputList(&head, &last);
  272. break;
  273. case 4:
  274. {
  275. char fname[NAME_SIZE];
  276. cout << "Введите имя: ";
  277. cin.getline(fname, NAME_SIZE - 1, '\n');
  278. cin.ignore(cin.rdbuf()->in_avail());
  279. cin.sync();
  280. find(fname, &head);
  281. }
  282. break;
  283. case 5:
  284. writeToFile(&head);
  285. break;
  286. case 6:
  287. readFromFile(&head, &last);
  288. break;
  289. case 7:
  290. exit(0);
  291. case 8:
  292. { int kolvo;
  293. cout << "Введите количество удаляемых эл." << endl;
  294. cin >> kolvo;
  295. DeleteKFirst(kolvo, last);
  296. } break;
  297.  
  298. }
  299. }
  300. return 0;
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement