Из-за проблемы, связанной с отсутствием {}, ваша программа не работает, потому что вы рассматриваете только ячейки, имеющие значение 0 или нет, независимо от других ячеек в том же столбце.
Вам необходимо знать, содержит ли все столбец только 0 или нет, прежде чем принять решение о его перемещении или нет
Для этого:
int onlyZero(int (*arr), int col, int rows, int cols)
{
const int sup = cols*rows;
for (int i = 0; i != sup; i += cols) {
if (arr[i + col] != 0)
return 0;
}
return 1;
}
возвращает 1, если столбец col содержит только 0, иначе 0
Чтобы скопировать столбец в другой:
void copyColumn(int (*arr), int fromCol, int toCol, int rows, int cols)
{
int sup = cols*rows;
for (int i = 0; i != sup; i += cols)
arr[i + toCol] = arr[i + fromCol];
}
и для сброса столбца:
void resetColumn(int (*arr), int col, int rows, int cols)
{
int sup = cols*rows;
for (int i = 0; i != sup; i += cols)
arr[i + col] = 0;
}
Используя эти функции, даже это не самый быстрый способ:
void PushL(int (*arr), int rows, int cols)
{
int receiver = 0;
for (int col = 0; col != cols; ++col) {
if (!onlyZero(arr, col, rows, cols)) {
if (receiver != col)
copyColumn(arr, col, receiver, rows, cols);
receiver += 1;
}
}
while (receiver != cols)
resetColumn(arr, receiver++, rows, cols);
}
Добавление
void pr(int (*arr), int rows, int cols)
{
for (int row = 0; row != rows; ++row) {
for (int col = 0; col != cols; ++col) {
printf("%d ", arr[row*cols + col]);
}
putchar('\n');
}
putchar('\n');
}
int main()
{
int a[] = {
1, 6, 0, 0, 0, 1, 0, 8,
1, 3, 0, 3, 0, 1, 0, 0,
3, 0, 0, 0, 0, 8, 0, 0,
0, 0, 0, 2, 6, 0, 0, 4
};
pr(a, 4, 8);
PushL(a, 4, 8);
pr(a, 4, 8);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall m.c
pi@raspberrypi:/tmp $ ./a.out
1 6 0 0 0 1 0 8
1 3 0 3 0 1 0 0
3 0 0 0 0 8 0 0
0 0 0 2 6 0 0 4
1 6 0 0 1 8 0 0
1 3 3 0 1 0 0 0
3 0 0 0 8 0 0 0
0 0 2 6 0 4 0 0
Я разрешаю вам делать PushR, который очень закрыт для PushL
PushR является симметричным PushL :
void PushR(int (*arr), int rows, int cols)
{
int receiver = cols - 1;
for (int col = cols-1; col != -1; --col) {
if (!onlyZero(arr, col, rows, cols)) {
if (receiver != col)
copyColumn(arr, col, receiver, rows, cols);
receiver -= 1;
}
}
while (receiver != -1)
resetColumn(arr, receiver--, rows, cols);
}