void removeDiagT (Matrix *a);
Удаляет из квадратной матрицы a главную диагональ, при этом элементы верхнего треугольника смещаются влево.
Код:
#include <stdio.h>
#include <stdlib.h>
void* myrealloc(void *ptr, size_t size);
void* mymalloc(size_t size);
typedef struct Matrix {
int *data;
int m, n;
} Matrix;
Matrix* newMatrix(int m, int n);
Matrix* copyMatrix(const Matrix *matrix);
void destroyMatrix(Matrix *matrix);
void removeDiagT(Matrix *a);
void printMatrix(const Matrix *matrix);
int main() {
printf("Введите размер матрицы:\n");
printf("n = ");
int n;
if (scanf("%d", &n) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
printf("m = ");
int m;
if (scanf("%d", &m) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
printf("Введите элементы матрицы:\n");
Matrix * matrix = newMatrix(n, m);
for (int i = 0; i < (matrix -> m * matrix -> n); i++) {
if (scanf("%d", &matrix -> data[i]) != 1) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
}
printMatrix(matrix);
printf("\n");
removeDiagT(matrix);
printMatrix(matrix);
printf("\n");
destroyMatrix(matrix);
system("pause");
return 0;
}
void removeDiagT(Matrix *a) {
if (a -> m != a -> n) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
Matrix * temp = newMatrix(a -> m, a -> n-1);
int index = 0;
for (int i = 0; i < a -> m; i++) {
for (int j = 0; j < a -> n; j++) {
if (i != j) {
temp -> data[index] = a -> data[i * a -> m + j];
int b = a -> data[i * a -> m + j];
++index;
}
}
}
myrealloc(a -> data, sizeof(int)*a -> m * (a -> n - 1));
a -> n = a -> n - 1;
index = 0;
for (int i = 0; i < a -> n; i++) {
for (int j = 0; j < a -> n; j++) {
a -> data[i * a -> n + j] = temp -> data[index];
int a = temp -> data[index];
++index;
}
}
destroyMatrix(temp);
}
void *mymalloc(size_t size) {
void *result = malloc(size);
if (result == NULL) {
fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return result;
}
void* myrealloc(void *ptr, size_t size) {
void *res = realloc(ptr, size);
if (res == NULL && size != 0) {
fprintf(stderr, "myrealloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return res;
}
Matrix* newMatrix(int m, int n) {
Matrix * new_matrix = (Matrix *)mymalloc(sizeof(Matrix));
new_matrix -> m = m;
new_matrix -> n = n;
new_matrix -> data = (int *)mymalloc(n*m*sizeof(int));
return new_matrix;
}
Matrix* copyMatrix(const Matrix *matrix) {
Matrix* copy = newMatrix(matrix -> m, matrix -> n);
for (int i = 0; i < matrix -> m * matrix -> n; i++) {
copy -> data[i] = matrix -> data[i];
}
return copy;
}
void destroyMatrix(Matrix *matrix) {
free[] matrix -> data;
free matrix;
}
void printMatrix(const Matrix *matrix) {
int m = matrix -> m, n = matrix -> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", matrix -> data[i * n + j]);
}
printf("\n");
}
}
Пример. Исходная матрица:
1 2 3
4 5 6
7 8 9
Вызов:
2 3
4 6
7 8
Не работает. Что не так с free?