Advertisement
daniv1

lin spysok

Dec 19th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. // ConsoleApplication1.cpp : main project file.
  2. #include "stdafx.h"
  3. #include <iostream>
  4. using namespace System;
  5. struct ElMatr   // Структура елемента зв’язаного одностороннього списку
  6.  { int i, j;    // i, j – поля структури
  7.     float A ;   // A  – поле структури
  8.    ElMatr *NextA; // Вказiвник на елемент типу: ElMatr (поле структури)
  9.  } ;
  10. // Функція для пошуку елемента матриці у списку еле-ментів. Функція шукає найближчий елемент списку, у якого індекси є <= заданим параметрам i, j
  11. ElMatr *SearchElMatr(int i, int j, ElMatr *FirstEl)
  12. { ElMatr *Aijtek, *AijRob, *MA;
  13.   int ic, jc;
  14. MA = FirstEl;// Налаштовуємо вказiвник на початок списку
  15.   Aijtek = MA;  // Запамятовуємо поточний елемент у полі Aijtek
  16.  
  17. while ( MA != NULL )
  18.  { ic = MA->i ;
  19.    while ((MA != NULL) && (MA->i == ic))
  20.    { if (ic == i )
  21.      { while ((MA != NULL) && ( MA->j <= j) && (MA->i == ic))
  22.        { Aijtek = MA;
  23.              MA = MA->NextA;
  24.          if (MA == NULL) break;
  25.          if ((Aijtek->i == i) && (Aijtek->j >= j)) break;
  26.           jc = MA->j;
  27.        }
  28.      }
  29.      else
  30.      {   while ((MA != NULL)  && (MA->i == ic))
  31.        { Aijtek = MA;
  32.              MA = MA->NextA;
  33.          if (MA == NULL) break;
  34.          jc = MA->j;
  35.        }
  36.      }
  37.      if (MA == NULL) break;
  38.      if ((MA->i > i)) break;
  39.      if ((Aijtek->i == i) && (Aijtek->j >= j)) break;
  40.       AijRob = Aijtek->NextA;
  41.      if ((AijRob->i == i) && (AijRob->j > j))  break;
  42.      if ( AijRob->i > i )  break;
  43.    }
  44.     if (MA == NULL) break;
  45.     if ((Aijtek->i == i) && (Aijtek->j >= j)) break;
  46.     AijRob = Aijtek->NextA;
  47.     if ((AijRob->i == i) && (AijRob->j > j))  break;
  48.     if ( AijRob->i > i )  break;
  49.  }
  50.  return   Aijtek;
  51. }
  52. // Оголошуємо глобальну змінну типу ElMatr для вказівника на 1-й елемент списку
  53. // Ця змінна буде доступна у всій програмі
  54. ElMatr     *FirstElmart;
  55.  
  56.  
  57. int main(array<System::String ^> ^args)
  58. {
  59. // Описуємо змiннi
  60.  int i, j;  
  61.  float AijValue;
  62.  ElMatr *MA, *Aijtek, *AijRob;
  63. // Організовуємо цикл для введення елементів списку
  64.  i = 0;
  65. while (i != 999)// Для завершення роботи програми набрати 999 1 1
  66.  { std::cout << "Input elements  i j Aij -> ";
  67.    std::cin >>i >> j >> AijValue;// Вводимо iндекси i, j і значення Aij
  68.    std::cout << " \n";
  69. if (FirstElmart == NULL)// Чи були внесенi у список якiсь елементи матриці?
  70. {// Ще не було елементiв у матрицi. Створюємо 1 елемент i записуємо його адресу у поле FirstElmart
  71.    MA = new ElMatr;
  72.   FirstElmart = MA;
  73.         MA->A = AijValue;
  74.         MA->i = i;   MA->j = j;
  75.     MA->NextA = 0;
  76.  } else
  77.  {
  78. // Вже є елементи у матрицi. Шукаємо, куди б додати новий.
  79. // Вiн повинен знаходитись у місці, яке визначають індекси i, j.
  80. // Це допоможе зменшити час пошуку елемента при вибірці
  81.  Aijtek = SearchElMatr (i, j, FirstElmart);
  82. // Скористаємось функцію пошуку
  83. // Вставляємо елемент перед початком списку
  84.  if ((Aijtek->i ==i && Aijtek->j > j) || (Aijtek->i > i ))
  85.   {
  86.    MA=new ElMatr;   // Створимо новий елемент списку
  87.    MA->A = AijValue;    // Присвоюємо його полям відповідні значення
  88.    MA->i = i;     MA->j = j;
  89. // Пов’яжемо новий елемент із старим елементом, який запам’ятованj у полі AijRob->NextA
  90.    MA->NextA = FirstElmart;
  91.    FirstElmart = MA;
  92.   }
  93.  if (Aijtek->i == i && Aijtek->j == j)
  94. // У таблиці уже є елемент з індексами i, j. Заміщаємо його значення на нове
  95.   {  MA = Aijtek ;
  96.       MA->A = AijValue;
  97.   }
  98.  if ((Aijtek->i == i && Aijtek->j < j) || ( Aijtek->i < i ))
  99. // Вставляємо новий елемент після елементу  Aijtek, знайденого функцією
  100.  { AijRob = new ElMatr;
  101.     AijRob->NextA = Aijtek->NextA; 
  102. // Запам’ятаємо адресу, на яку вказував знайдений елемент
  103.  MA = new ElMatr;// Створимо новий елемент списку
  104.  MA->A = AijValue;  // Присвоюємо його полям відповідні значення
  105.     MA->i = i;  MA->j = j;
  106.     Aijtek->NextA = MA; // Пов’яжемо новий елемент із попереднім елементом,
  107. // якого було запамятовано у полі AijRob->NextA
  108.     MA->NextA = AijRob->NextA;
  109.  }
  110. } }
  111. // Виведення елементів матриці. Вводимо індекси і, j, а одержуємо значення Aij
  112. i = 0;
  113. while (i != 999)    // Для завершення введіть i = 999
  114. { std::cout << "Input elements (i j) of matrix for output? ";
  115.   std::cin >> i >> j; std::cout << "\n";
  116.   MA = FirstElmart;
  117.   if (MA == NULL)
  118.   {  std::cout << " Matrix is empty";  return 0;  
  119.   }
  120.   Aijtek = SearchElMatr (i, j, FirstElmart);
  121. // Скористаємось функцією пошуку
  122.   if (Aijtek->i == i  && Aijtek->j == j)    
  123. // Елемент знайдено
  124.   { AijValue = Aijtek->A;
  125.     std::cout << " A["<< i <<"]["<< j <<"]= "<< AijValue << " \n ";
  126.   }
  127.   else   std::cout << "Element not found!\n"; }
  128. return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement