Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication1.cpp : main project file.
- #include "stdafx.h"
- #include <iostream>
- using namespace System;
- struct ElMatr // Структура елемента зв’язаного одностороннього списку
- { int i, j; // i, j – поля структури
- float A ; // A – поле структури
- ElMatr *NextA; // Вказiвник на елемент типу: ElMatr (поле структури)
- } ;
- // Функція для пошуку елемента матриці у списку еле-ментів. Функція шукає найближчий елемент списку, у якого індекси є <= заданим параметрам i, j
- ElMatr *SearchElMatr(int i, int j, ElMatr *FirstEl)
- { ElMatr *Aijtek, *AijRob, *MA;
- int ic, jc;
- MA = FirstEl;// Налаштовуємо вказiвник на початок списку
- Aijtek = MA; // Запамятовуємо поточний елемент у полі Aijtek
- while ( MA != NULL )
- { ic = MA->i ;
- while ((MA != NULL) && (MA->i == ic))
- { if (ic == i )
- { while ((MA != NULL) && ( MA->j <= j) && (MA->i == ic))
- { Aijtek = MA;
- MA = MA->NextA;
- if (MA == NULL) break;
- if ((Aijtek->i == i) && (Aijtek->j >= j)) break;
- jc = MA->j;
- }
- }
- else
- { while ((MA != NULL) && (MA->i == ic))
- { Aijtek = MA;
- MA = MA->NextA;
- if (MA == NULL) break;
- jc = MA->j;
- }
- }
- if (MA == NULL) break;
- if ((MA->i > i)) break;
- if ((Aijtek->i == i) && (Aijtek->j >= j)) break;
- AijRob = Aijtek->NextA;
- if ((AijRob->i == i) && (AijRob->j > j)) break;
- if ( AijRob->i > i ) break;
- }
- if (MA == NULL) break;
- if ((Aijtek->i == i) && (Aijtek->j >= j)) break;
- AijRob = Aijtek->NextA;
- if ((AijRob->i == i) && (AijRob->j > j)) break;
- if ( AijRob->i > i ) break;
- }
- return Aijtek;
- }
- // Оголошуємо глобальну змінну типу ElMatr для вказівника на 1-й елемент списку
- // Ця змінна буде доступна у всій програмі
- ElMatr *FirstElmart;
- int main(array<System::String ^> ^args)
- {
- // Описуємо змiннi
- int i, j;
- float AijValue;
- ElMatr *MA, *Aijtek, *AijRob;
- // Організовуємо цикл для введення елементів списку
- i = 0;
- while (i != 999)// Для завершення роботи програми набрати 999 1 1
- { std::cout << "Input elements i j Aij -> ";
- std::cin >>i >> j >> AijValue;// Вводимо iндекси i, j і значення Aij
- std::cout << " \n";
- if (FirstElmart == NULL)// Чи були внесенi у список якiсь елементи матриці?
- {// Ще не було елементiв у матрицi. Створюємо 1 елемент i записуємо його адресу у поле FirstElmart
- MA = new ElMatr;
- FirstElmart = MA;
- MA->A = AijValue;
- MA->i = i; MA->j = j;
- MA->NextA = 0;
- } else
- {
- // Вже є елементи у матрицi. Шукаємо, куди б додати новий.
- // Вiн повинен знаходитись у місці, яке визначають індекси i, j.
- // Це допоможе зменшити час пошуку елемента при вибірці
- Aijtek = SearchElMatr (i, j, FirstElmart);
- // Скористаємось функцію пошуку
- // Вставляємо елемент перед початком списку
- if ((Aijtek->i ==i && Aijtek->j > j) || (Aijtek->i > i ))
- {
- MA=new ElMatr; // Створимо новий елемент списку
- MA->A = AijValue; // Присвоюємо його полям відповідні значення
- MA->i = i; MA->j = j;
- // Пов’яжемо новий елемент із старим елементом, який запам’ятованj у полі AijRob->NextA
- MA->NextA = FirstElmart;
- FirstElmart = MA;
- }
- if (Aijtek->i == i && Aijtek->j == j)
- // У таблиці уже є елемент з індексами i, j. Заміщаємо його значення на нове
- { MA = Aijtek ;
- MA->A = AijValue;
- }
- if ((Aijtek->i == i && Aijtek->j < j) || ( Aijtek->i < i ))
- // Вставляємо новий елемент після елементу Aijtek, знайденого функцією
- { AijRob = new ElMatr;
- AijRob->NextA = Aijtek->NextA;
- // Запам’ятаємо адресу, на яку вказував знайдений елемент
- MA = new ElMatr;// Створимо новий елемент списку
- MA->A = AijValue; // Присвоюємо його полям відповідні значення
- MA->i = i; MA->j = j;
- Aijtek->NextA = MA; // Пов’яжемо новий елемент із попереднім елементом,
- // якого було запамятовано у полі AijRob->NextA
- MA->NextA = AijRob->NextA;
- }
- } }
- // Виведення елементів матриці. Вводимо індекси і, j, а одержуємо значення Aij
- i = 0;
- while (i != 999) // Для завершення введіть i = 999
- { std::cout << "Input elements (i j) of matrix for output? ";
- std::cin >> i >> j; std::cout << "\n";
- MA = FirstElmart;
- if (MA == NULL)
- { std::cout << " Matrix is empty"; return 0;
- }
- Aijtek = SearchElMatr (i, j, FirstElmart);
- // Скористаємось функцією пошуку
- if (Aijtek->i == i && Aijtek->j == j)
- // Елемент знайдено
- { AijValue = Aijtek->A;
- std::cout << " A["<< i <<"]["<< j <<"]= "<< AijValue << " \n ";
- }
- else std::cout << "Element not found!\n"; }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement