ChameL1oN

ОС_Лаба1_Вар7

Sep 13th, 2015
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. //7.
  2. //А) продублировать в списке L вещественных элементов перед каждым элементом
  3. //значение модуля значения этого элемента.
  4. //Б) удалить из полученного списка элемент, имеющий минимальное положительное
  5. //значение
  6.  
  7. #include <iostream>
  8. #include <locale>
  9. #include <malloc.h>
  10.  
  11.  
  12. using namespace std;
  13.  
  14. struct point{
  15. float data;
  16. point* next;
  17. };
  18.  
  19. void print_list(point* beg)
  20. //печать списка
  21. {
  22. point* p = beg;//начало списка
  23. while (p != 0)
  24. {
  25. cout << p->data << "\t";
  26. p = p->next;//переход к следующему элементу
  27. }
  28. cout << endl;
  29. }
  30.  
  31. point* make_list()
  32. {
  33. point*beg;//указатель на первый элемент
  34. point*p, *r;//вспомогательные указатели
  35. beg = (point*)malloc(sizeof point);//выделяем память под первый элемент
  36. int otv;
  37. bool cont = true;
  38.  
  39. cout << "Data : " << endl;
  40. cin >> beg->data;//вводим значение информационного поля
  41. beg->next = 0;//обнуляем адресное поле
  42. //ставим на этот элемент указатель p (последний элемент)
  43. p = beg;
  44. cout << "End? 1-Yes 2-No" << endl;
  45. cin >> otv;
  46. if (otv == 1) cont = false;
  47. while(cont)
  48. {
  49. r = (point*)malloc(sizeof point);//создаем новый элемент
  50. cout << "Data : " << endl;
  51. cin >> r->data;
  52. r->next = 0;
  53. p->next = r;//связываем p и r
  54. //ставим на r указатель p (последний элемент)
  55. p = r;
  56. cout << "End? 1-Yes 2-No" << endl;
  57. cin >> otv;
  58. if (otv == 1) cont = false;
  59. }
  60. return beg;//возвращаем beg как результат функции
  61. }
  62.  
  63. point* change_list(point* beg){
  64. point* n = (point*)malloc(sizeof point); //Выделили память под новый эл-т
  65. n->data = abs(beg->data); //Присвоили значение модуля головы
  66. n->next = beg; //Указатель на голову
  67. beg = n; //Сдвиг головы на новый эл-т
  68. n = n->next; //n - вспомогательный указатель для работы со списком
  69. while (n->next != NULL){
  70. point* p = (point*)malloc(sizeof point); //Выделили память под новый эл-т
  71. p->data = abs(n->next->data); //Присвоили значение модуля головы
  72. p->next = n->next; //Указали на след. эл-т
  73. n->next = p; //Вставили p в список
  74. n = p->next; //Сдвинулись дальше по списку
  75. }
  76. return beg;
  77. }
  78.  
  79. point* del_in_list(point* beg){
  80. point* p; //Вспомогательный
  81. p = beg;
  82. float min = beg->data; //Устанавливаем значение min на первый эл-т
  83. int i = 0; //Счётчик
  84. int imin=0; //Индекс min эл-та, который запоминаем
  85. while (p != NULL){ //Проходим по списку и ищем min не отрицательный эл-т
  86. if (p->data < min && p->data >= 0){
  87. min = p->data;
  88. imin = i;
  89. }
  90. i++;
  91. p = p->next;
  92. }
  93. p = beg; //Возвращаемся в голову и сбрасываем счётчик
  94. i = 0;
  95. if (imin == 0){ //Если минимум оказался в голове
  96. p = beg; //Доп. указатель на голову
  97. beg = beg->next; //Сдвинули голову дальше по списку
  98. free(p); //Освободили память доп. указателя
  99. }
  100. else if (imin != 1){ //Если минимум оказался не в голове и не на втором месте(после головы)
  101. while (i < imin - 1){ //Идём по списку до imin-1 индекса
  102. p = p->next;
  103. i++;
  104. }
  105. point* n; //Новая переменная для удаления эл-та
  106. n = p->next; //Переменной n присвоили значение эл-та с imin индексом(удаляемый)
  107. p->next = n->next; //Сместили указатель imin-1 эл-та на imin+1(или NULL)
  108. free(n); //Удалили из памяти нужный эл-т
  109. }
  110. else{ //Если минимум оказался на втором месте
  111. p = beg->next; //Доп. указатель на удаляемый эл-т
  112. beg->next = beg->next->next; //Сместили указатель головы на 3-ий эл-т
  113. free(p); //Удалили из памяти 2-ой эл-т
  114. }
  115. return beg;
  116. }
  117.  
  118. void clear(point* &beg){ //Фун-ия для удаления всего списка из памяти
  119. point* p;
  120. while (beg != NULL){
  121. p = beg;
  122. beg = beg->next;
  123. free(p);
  124. }
  125. }
  126. void main(){
  127. setlocale(LC_ALL, "rus");
  128. point* beg;
  129. cout << "ФУНКЦИЯ СОЗДАНИЯ СПИСКА" << endl;
  130. beg = make_list();
  131. print_list(beg);
  132. cout << endl;
  133. cout << "ФУНКЦИЯ ДУБЛИРОВАНИЯ ЭЛ-ТОВ СПИСКА" << endl;
  134. beg = change_list(beg);
  135. print_list(beg);
  136. cout << "ФУНКЦИЯ УДАЛЕНИЯ МИНИМАЛЬНОГО ЭЛ-ТА ИЗ СПИСКА" << endl;
  137. beg = del_in_list(beg);
  138. print_list(beg);
  139. clear(beg);
  140. if (beg == NULL) cout << "Список удален из памяти" << endl;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment