ChameL1oN

Jel

Mar 19th, 2016
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.76 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <locale>
  5.  
  6.  
  7. using namespace std;
  8.  
  9.  
  10.  
  11. struct point{
  12. int data;
  13. point* next;
  14. };
  15.  
  16. struct pointd{
  17. char* key;
  18. pointd* next;
  19. pointd* pred;//указатель на предыдущий элемент
  20. };
  21.  
  22. void print_list(point* beg)
  23. //печать списка
  24. {
  25. point* p = beg;//начало списка
  26. while (p != 0)
  27. {
  28. cout << p->data << "\t";
  29. p = p->next;//переход к следующему элементу
  30. }
  31. }
  32.  
  33. point* make_list(int n)
  34. {
  35. point*beg;//указатель на первый элемент
  36. point*p, *r;//вспомогательные указатели
  37. beg = new(point);//выделяем память под первый элемент
  38. cout << "Введите значение 1 эл-та :" << endl;
  39. cin >> beg->data;//вводим значение информационного поля
  40. beg->next = 0;//обнуляем адресное поле
  41. //ставим на этот элемент указатель p (последний элемент)
  42. p = beg;
  43. for (int i = 0; i<n - 1; i++)
  44. {
  45. r = new(point);//создаем новый элемент
  46. cout << "Введите значение " << i + 2 << " эл-та :" << endl;
  47. cin >> r->data;
  48. r->next = 0;
  49. p->next = r;//связываем p и r
  50. //ставим на r указатель p (последний элемент)
  51. p = r;
  52. }
  53. return beg;//возвращаем beg как результат функции
  54. }
  55.  
  56. point* del_point(point*beg)
  57. //удаление первого эл-та с чётным значением, 0 не считается чётным
  58. {
  59. point*p = beg;
  60. bool flag = true;
  61. while (p != NULL && flag){ //Проверяем, есть ли необходимый эл-т
  62. if (p->data % 2 == 0 && p->data != 0){
  63. flag = false; //Если эл-т существует останавливем цикл
  64. }
  65. p = p->next;
  66. }
  67. p = beg;
  68. if (flag == true) cout << "НЕТ ЭЛ-ТА С ЧЁТНЫМ ЗНАЧЕНИЕМ" << endl << endl;
  69. else{
  70. if (p->data % 2 == 0 && p->data != 0){ //Проверяем голову на чётность
  71. beg = p->next;
  72. delete p;
  73. }
  74. else{ // Если голова нечётная, продолжаем поиск в списке
  75. while (p->next->data % 2 != 0 && p->next != NULL || p->next->data == 0){ //Идём по списку до первого чётного или конца, пропуская 0
  76. p = p->next;
  77. }
  78. if (p->next != NULL && p->next->next != NULL){ //Если находим эл-т в середине списка
  79. point* r = p->next; //Запоминаем нужный эл-т
  80. p->next = r->next; //Изменяем указатель через эл-т
  81. delete r; //Удаляем необходимый эл-т
  82. }
  83. else{ //Если найденый эл-т последний
  84. point* r = p->next;
  85. p->next = NULL;
  86. delete r;
  87. }
  88. }
  89. }
  90. return beg;
  91. }
  92.  
  93. point* del(point*beg)
  94. //удаление списка из памяти
  95. {
  96. point*p = beg;
  97. while (p != NULL){
  98. point* r = p;
  99. p = p->next;
  100. delete r;
  101. }
  102. return beg;
  103. }
  104.  
  105. void main1(){
  106. setlocale(LC_ALL, "rus");
  107. int n;
  108. cout << "РАБОТА С ОДНОСВЯЗНЫМ СПИСКОМ:" << endl << endl;
  109. cout << "Введите кол-во элементов" << endl;
  110. cin >> n;
  111. point* beg = make_list(n);
  112. cout << "Исходный список : " << endl;
  113. print_list(beg);
  114. cout << endl;
  115. cout << "Список после обработки : " << endl << endl;
  116. beg = del_point(beg);
  117. print_list(beg);
  118. cout << endl;
  119. beg = del(beg);
  120. cout << "Список удалён из памяти" << endl;
  121. }
  122.  
  123.  
  124.  
  125. void print_list_point2(pointd* beg)
  126. //печать списка
  127. {
  128. pointd* p = beg;//начало списка
  129. while (p != 0)
  130. {
  131. cout << p->key << "\t";
  132. p = p->next;//переход к следующему элементу
  133. }
  134. }
  135. void print_list2_point2(pointd* beg)
  136. //печать списка
  137. {
  138. pointd* p = beg;//начало списка
  139. while (p != 0)
  140. {
  141. cout << p->key << "\t";
  142. p = p->pred;//переход к следующему элементу
  143. }
  144. }
  145.  
  146. pointd* make_point2()
  147. //создание одного элемента
  148. {
  149. pointd*p = new(pointd);
  150. p->next = 0; p->pred = 0;//обнуляем указатели
  151. char s[50];
  152. cout << "\nEnter string:";
  153. cin >> s;
  154. p->key = new char[strlen(s) + 1];//выделение памяти под строку
  155. strcpy(p->key, s);
  156. return p;
  157. }
  158. pointd*make_list_point2(int n)
  159. //создание списка
  160. {
  161. pointd *p;
  162. pointd *beg;
  163. beg = make_point2();//создаем первый элемент
  164. for (int i = 1; i<n; i++)
  165. {
  166. p = make_point2();//создаем один элемент
  167. //добавление элемента в начало списка
  168. p->next = beg;//связываем р с первым элементом
  169. beg->pred = p;//связываем первый элемент с p
  170. beg = p;// p становится первым элементом списка
  171. }
  172. return beg;
  173. }
  174.  
  175. pointd* add_point2(pointd* beg, int k){
  176. pointd* p = beg;
  177. pointd* r = new pointd();
  178. int i = 1;
  179. if (k != 1){ //Когда указываем номер > 1
  180. while (p->next != NULL){ //Проходим до конца списка + ищем и запоминаем необходимый эл-т
  181. p = p->next;
  182. i++;
  183. if (i == k) r = p;
  184. }
  185. }
  186. else{ //Если указан номер 1
  187. r = beg;
  188. while (p->next != NULL) p = p->next;
  189. }
  190. pointd* nwp = new pointd(); //Создаём новый эл-т и копируем его значения из сохранённого эл-та
  191. nwp->key = r->key;
  192. nwp->next = NULL;
  193. nwp->pred = p; //Вставляем в конец
  194. p->next = nwp;
  195. return beg;
  196. }
  197.  
  198. void main2(){
  199. setlocale(LC_ALL, "rus");
  200. int n, k;
  201. bool flag = true;
  202. cout << "РАБОТА С ДВУСВЯЗНЫМ СПИСКОМ:" << endl << endl;
  203. cout << "Введите кол-во элементов" << endl;
  204. cin >> n;
  205. pointd* beg = make_list_point2(n);
  206. cout << "Исходный список : " << endl;
  207. print_list_point2(beg);
  208. cout << endl;
  209. while (flag){
  210. cout << "Эл-т под каким номером добавляем? ";
  211. cin >> k;
  212. if (k > n || k < 1)cout << "Неверно указан номер" << endl;
  213. else flag = false;
  214. cout << endl;
  215. }
  216. cout << "Список после добавление элемента" << endl;
  217. cout << endl;
  218. beg = add_point2(beg, k);
  219. print_list_point2(beg);
  220. cout << endl;
  221. while (beg->next != 0){ beg = beg->next; }
  222. print_list2_point2(beg);
  223. cout << endl;
  224. for (int i = 0; beg->next != 0; i++){
  225. beg = beg->next;
  226. delete beg->pred;
  227. }
  228. delete beg;
  229. }
  230.  
  231. point* make_list3(int n)
  232. {
  233. point*beg;//указатель на первый элемент
  234. point*p, *r, *d;//вспомогательные указатели
  235. beg = new(point);//выделяем память под первый элемент
  236. cout << "Значение первого эл-та ?" << endl;
  237. cin >> beg->data;//вводим значение информационного поля
  238. beg->next = 0;//обнуляем адресное поле
  239. for (int i = 0; i < n - 1; i++){
  240. p = beg;
  241. r = new(point);
  242. cout << "Введите значение " << i + 2 << " эл-та" << endl;
  243. cin >> r->data;
  244. r->next = NULL;
  245. if (r->data < beg->data){
  246. while (p->next != NULL && r->data < p->next->data){
  247. p = p->next;
  248. }
  249. r->next = p->next;
  250. p->next = r;
  251. }
  252. else{
  253. r->next = beg;
  254. beg = r;
  255. }
  256. }
  257. return beg;
  258. }
  259.  
  260. point* add_in_list3(point* beg, int n){
  261. point* r = new(point);
  262. r->data = n;
  263. r->next = NULL;
  264. point* p;
  265. p = beg;
  266. if (n > beg->data){ //Проверяем с головой
  267. r->next = beg;
  268. beg = r;
  269. }
  270. else{
  271. while (p->next != NULL && n < p->next->data){ //Идём по списку пока значение нового эл-та не станет меньше или до конца
  272. p = p->next;
  273. }
  274. r->next = p->next;
  275. p->next = r;
  276. }
  277. return beg;
  278. }
  279.  
  280.  
  281.  
  282. void main3(){
  283. setlocale(LC_ALL, "rus");
  284. int n, K, a;
  285. char* N;
  286. cout << "РАБОТА С ОДНОСВЯЗНЫМ УПОРЯДОЧЕННЫМ СПИСКОМ:" << endl << endl;
  287. cout << "Введите кол-во элементов" << endl;
  288. cin >> n;
  289. point* beg = make_list3(n);
  290. cout << "Исходный список : " << endl;
  291. print_list(beg);
  292. cout << endl;
  293. cout << "Кол-во вставляемых эл-тов ?" << endl;
  294. cin >> K;
  295. for (int i = 0; i < K; i++){
  296. cout << "Введите значение "<< i+1 << " нового эл-та:" << endl;
  297. cin >> a;
  298. beg = add_in_list3(beg, a);
  299. }
  300. cout << endl;
  301. cout << "Список после обработки : " << endl;
  302. print_list(beg);
  303. cout << endl;
  304. }
  305.  
  306. void main(){
  307. setlocale(LC_ALL, "rus");
  308. cout << "Работа со списками." << endl;
  309. int choice;
  310.  
  311. do
  312. {
  313. cout << endl << "Выберите действие:" << endl
  314. << "1. Создать односвязный список (список создастся по типу очередь)" << endl
  315. << "2. Создать двусвязный список (список создастся по типу стек)" << endl
  316. << "3. Создать упорядоченный список (создастся односвязный список)" << endl
  317. << "4. Выйти из программы\n";
  318. cin >> choice;
  319. switch (choice)
  320. {
  321. case 1:main1(); break; //создание односвязного списка
  322. case 2: main2(); break; //создание двусвязного списка
  323. case 3: main3(); break; //создание упорядоченного списка
  324. }
  325. } while (choice != 4);
  326.  
  327. }
Advertisement
Add Comment
Please, Sign In to add comment