Некорректная работа алгоритма удаления значений из массива
Прилагаю условие: Из двумерного массива удалить все элементы, большие суммы элементов в той же строке. Строки массива могут отличаться друг от друга по длине.
Основная проблема кода: по какой-то причине удаляется не элемент, который больше суммы остальных элементов строки, а просто последний элемент
При этом обязательно не допускать следующие моменты:
- не перевыделяется память;
- не выделены функции ввода/вывода;
- только зубчатыймассив;
- вывод массивов из тех же функций, что осуществляют преобразования массивов;
- удаление без изменения структуры массива.
Код прилагаю
Main файл:
#include <stdio.h>
#include "array_operations.h"
int main() {
int rows, cols;
printf("Введите количество строк: ");
scanf("%d", &rows);
printf("Введите количество столбцов: ");
scanf("%d", &cols);
int** array = createArray(rows, cols);
fillArray(array, rows, cols);
processArray(array, &rows, &cols);
printArray(array, rows, cols);
freeArray(array, rows);
return 0;
}
файл исходного кода:
#include <stdio.h>
#include <stdlib.h>
#include "array_operations.h"
int** createArray(int rows, int cols) {
int** arr = (int**)malloc(rows * sizeof(int*));
for (int i = 0; i < rows; ++i) {
arr[i] = (int*)malloc(cols * sizeof(int));
}
return arr;
}
void freeArray(int** arr, int rows) {
for (int i = 0; i < rows; ++i) {
free(arr[i]);
}
free(arr);
}
void fillArray(int** arr, int rows, int cols) {
printf("Put number here:\n");
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("Type element [%d][%d]: ", i, j);
scanf("%d", &arr[i][j]);
}
}
}
int rowSum(int* row, int cols) {
int sum = 0;
for (int i = 0; i < cols; ++i) {
sum += row[i];
}
return sum;
}
void processArray(int** arr, int* rows, int* cols) {
for (int i = 0; i < *rows; ++i) {
int sum = rowSum(arr[i], *cols);
int validCount = 0; // Количество элементов, которые остаются в строке
for (int j = 0; j < *cols; ++j) {
if (arr[i][j] <= sum) {
arr[i][validCount] = arr[i][j];
validCount++;
}
}
*cols = validCount; // Обновляем количество столбцов
arr[i] = (int*)realloc(arr[i], (*cols) * sizeof(int));
}
}
void printArray(int** arr, int rows, int cols) {
printf("Результат:\n");
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
И Заголовочный файл:
#ifndef ARRAY_OPERATIONS_H
#define ARRAY_OPERATIONS_H
int** createArray(int rows, int cols);
void freeArray(int** arr, int rows);
void fillArray(int** arr, int rows, int cols);
void processArray(int** arr, int* rows, int* cols);
void printArray(int** arr, int rows, int cols);
#endif