Прога
#include "stdafx.h"
#include <iostream>
using namespace std;
struct matrix {
matrix *next;
float **a;
int nn, mm;
//constructor
matrix(int n, int m) {
a = new float*[n];
for (int i = 0;i < n;i++) {
a[i] = new float[m];
}
for (int i = 0;i < n;i++) {
for (int j = 0;j < m;j++) {
a[i][j] = 0;
}
}
this->nn = n;
this->mm = m;
}
matrix() {};
//destructor
~matrix() {
for (int i = 0;i < nn;i++) {
//delete a[i];
}
//delete a;
}
float *access(int n, int m) {
return &a[n][m];
};
void m_out() {
for (int i = 0;i < nn;i++) {
for (int j = 0;j < mm;j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
}
};
//"+"
matrix operator+(matrix ma1, matrix ma2) {
int n1 = ma1.nn;
int m1 = ma1.mm;
int n2 = ma2.nn;
int m2 = ma2.mm;
if (n1 == n2 && m1 == m2) {
matrix c(n1,m1);
for (int i = 0;i < n1;i++) {
for (int j = 0;j < m1;j++) {
c.a[i][j] = ma1.a[i][j] + ma2.a[i][j];
}
}
return c;
}
else {
cout << "Size error" << endl;
}
};
//"-"
matrix operator-(matrix ma1, matrix ma2) {
int n1 = ma1.nn;
int m1 = ma1.mm;
int n2 = ma2.nn;
int m2 = ma2.mm;
if (n1 == n2 && m1 == m2) {
matrix c(n1, m1);
for (int i = 0;i < n1;i++) {
for (int j = 0;j < m1;j++) {
c.a[i][j] = ma1.a[i][j] - ma2.a[i][j];
}
}
return c;
}
else {
cout << "Size error" << endl;
}
};
//"*"
matrix operator*(matrix ma1, matrix ma2) {
int n1 = ma1.nn;
int m1 = ma1.mm;
int n2 = ma2.nn;
int m2 = ma2.mm;
if (m1==n2) {
matrix c(n1,m2);
for (int i = 0;i < n1;i++) {
for (int j = 0;j < m2;j++) {
for (int k = 0;k < n1;k++) {
c.a[i][j] += ma1.a[i][k] + ma2.a[k][j];
}
}
}
return c;
}
else {
cout << "Size error" << endl;
}
};
class List {
public:
List();
~List();
void add(matrix data);
int GetSize() { return size; };
void add_index(matrix data, int index);
void del_index(int index);
matrix& operator[](const int index);
private:
class Node {
public:
Node *next;
matrix data;
Node(matrix data = matrix(0,0), Node* pnext = nullptr) {
this->data = data;
this->next = pnext;
}
};
int size;
Node *head;
};
List::List() {
size = 0;
head = nullptr;
};
List::~List() { }
//добавление элемента в список
void List::add(matrix data) {
if (head == nullptr) {
head = new Node(data);
}
else {
Node *current = this->head;
while (current->next != nullptr) {
current = current->next;
}
current->next = new Node(data);
}
size++;
};
//добавить в определенную позицию
void List::add_index(matrix data, int index) {
Node *current = head;
Node *temp;
for (int i = 0;i<index - 1;i++) {
current = current->next;
}
temp = current->next;
current->next = new Node(data);
current = current->next;
current->next = temp;
size++;
}
//удалить из определенной позиции
void List::del_index(int index) {
Node *current = head;
Node *temp;
for (int i = 0;i<index - 1;i++) {
current = current->next;
}
temp = current->next;
current->next = temp->next;
delete temp;
size--;
}
matrix& List::operator[](const int index) {
Node *current = this->head;
int count = 0;
while (current != nullptr) {
if (count == index)
return current->data;
current = current->next;
count++;
}
};
void l_out(List l) {
for (int i = 0;i < l.GetSize();i++) {
l[i].m_out();
cout << endl;
}
}
//транспонированная матрица
void ret_tr(matrix &a) {
matrix c(a.mm, a.nn);
for (int i = 0;i < c.nn;i++) {
for (int j = 0;j < c.mm;j++) {
c.a[j][i] = a.a[i][j];
}
}
for (int i = 0;i < c.nn;i++) {
for (int j = 0;j < c.mm;j++) {
a.a[i][j] = c.a[i][j];
}
}
};
int main()
{
matrix a1(3, 3);
matrix a2(3, 3);
for (int i = 0;i < 2;i++) {
for (int j = 0;j < 2;j++) {
a1.a[i][j] = i+j;
}
}
for (int i = 0;i < 2;i++) {
for (int j = 0;j < 2;j++) {
a2.a[i][j] = i * j;
}
}
List l;
l.add(a1);
l.add(a2);
a1 = a1*a2;
a1.m_out();
cout << endl;
ret_tr(a1);
a1.m_out();
system("pause");
return 0;
}