Некорректная работа алгоритма удаления значений из массива

Прилагаю условие: Из двумерного массива удалить все элементы, большие суммы элементов в той же строке. Строки массива могут отличаться друг от друга по длине.

Основная проблема кода: по какой-то причине удаляется не элемент, который больше суммы остальных элементов строки, а просто последний элемент

При этом обязательно не допускать следующие моменты:

  • не перевыделяется память;
  • не выделены функции ввода/вывода;
  • только зубчатыймассив;
  • вывод массивов из тех же функций, что осуществляют преобразования массивов;
  • удаление без изменения структуры массива.

Код прилагаю

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

Ответы (0 шт):