Val_Kir

2lab_124

Feb 23rd, 2018
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. /*  Напишите функцию упорядочения линейного самоадресуемого списка  с помощью рекурсивного алгоритма слияния.
  2.     В качестве данных в списке используйте случайные числа из интервала от -999 до 999.
  3.     Рекомендуемые значения длины списка n: 10, 100, 1000, 10000, 100000, 1000000.
  4.     Проведите проверку упорядоченности с помощью функции с параметрами.
  5.     Задание 4 является бонусным.
  6. */
  7.  
  8. #include <iostream>
  9. #include <conio.h>
  10. #include <time.h>
  11.  
  12. using namespace std;
  13.  
  14. #define maxn 100
  15.  
  16. int a[maxn];
  17.  
  18. struct Node
  19. {
  20.     int num;
  21.     Node *next;
  22. };
  23.  
  24.  
  25.  
  26. Node *add_to_list(Node *lnode, int num) //добавление в список
  27. {
  28.     Node *newel = new Node, *l = lnode;
  29.    
  30.     newel->num = num;
  31.     newel->next = NULL;
  32.    
  33.     if(!lnode)
  34.         return newel;
  35.    
  36.     while(l->next)
  37.         l = l->next;
  38.    
  39.     l->next = newel;
  40.    
  41.     return lnode;
  42. }
  43.  
  44. void del_list(Node *lnode) //удаление списка
  45. {
  46.     Node *p_s = lnode;
  47.     Node *p_tmp = p_s;
  48.    
  49.     while(p_s)
  50.     {
  51.         p_s = p_s->next;
  52.         delete p_tmp;
  53.         p_tmp = p_s;
  54.     }
  55. }
  56.  
  57. void test(int *a, int n)
  58. {
  59.     for (int i=1; i<n; ++i)
  60.     {
  61.         if (a[i-1]>a[i])
  62.         {
  63.             printf("The list is not sorted. ");
  64.             system("pause");
  65.             exit(0);
  66.         }
  67.     }
  68. }
  69.  
  70. void merge (int l, int r, Node *lnode)
  71. {
  72.     int i=0;
  73.  
  74.     for(; lnode; ++i, lnode = lnode->next)
  75.     {
  76.         a[i]=lnode->num;
  77.     }
  78.  
  79.     if (r == l)
  80.         return;
  81.  
  82.     if (r - l == 1)
  83.     {
  84.         if (a[r] < a[l])
  85.             swap(a[r], a[l]);
  86.         return;
  87.     }
  88.  
  89.     int m = (r + l) / 2;
  90.     merge(l, m, lnode);
  91.     merge(m + 1, r, lnode);
  92.  
  93.     int b[maxn]; //массив для записи минимальных элементов из левой и правой части
  94.     int xl = l; //левая часть
  95.     int xr = m + 1; //правая часть
  96.     int cur = 0;
  97.  
  98.     while (r - l + 1 != cur)
  99.     {
  100.         if (xl > m)
  101.             b[cur++] = a[xr++];
  102.         else if (xr > r)
  103.             b[cur++] = a[xl++];
  104.         else if (a[xl] > a[xr])
  105.             b[cur++] = a[xr++];
  106.         else b[cur++] = a[xl++];
  107.     }
  108.  
  109.     for (int i = 0; i < cur; i++)
  110.         a[i + l] = b[i];
  111. }
  112.  
  113. int main()
  114. {
  115.     Node *lnode = NULL;
  116.     int buff, n;
  117.  
  118.     cout << "Enter the value of n: ";
  119.     cin >> n;
  120.  
  121.     srand(time(0));
  122.     printf("Source list: ");
  123.     for (int i = 0; i < n; i++)
  124.     {
  125.         buff=rand()%100;
  126.         lnode=add_to_list(lnode, buff);
  127.         cout << buff << " ";
  128.     }
  129.     putchar('\n');
  130.  
  131.     merge(0, n - 1, lnode);
  132.  
  133.     test(a,n);
  134.  
  135.     for(int i=0; i<n; ++i, lnode = lnode->next)
  136.     {
  137.         lnode=add_to_list(lnode, a[i]);
  138.     }
  139.  
  140.     printf("Ordered list: ");
  141.     for(; lnode;  lnode = lnode->next)
  142.     {
  143.         printf("%d ",lnode->num);
  144.     }
  145.  
  146.     del_list(lnode);
  147.  
  148.     getch();
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment