Другие языки программирования и технологии

Дубликаты в СИ

Привет ребята. Я заполняю матрицу а [10][2].
Она у меня выходит типа:
8 7
9 8
7 2
....
и я хочю делать проверку на дубликаты ряда, и если находится дубликат то он удаляется и остальные элементы которые под него переходят на его место.

for (i=0;i<10;i++)
{
scanf("%d",&a[i][0]);
scanf("%d",&a[i][1]);
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define ROWS 15U
#define COLS 2U
void fill(int* row, const unsigned short n) {
size_t i = 0U;
do row[i] = 1 + rand() % n; while (++i < COLS);
}
void out(int* row) {
size_t i = 0U;
do printf("%3i", row[i]); while (++i < COLS);
putchar('\n');
}
_Bool eq(int* a, int* b) {
size_t i = 0U;
do if (a[i] != b[i]) return false; while (++i < COLS);
return true;
}
void swap(int* a, int* b) {
const int tmp = *a;
*a = *b;
*b = tmp;
}

int main(void) {
int matrix[ROWS][COLS];
size_t size = ROWS;
const unsigned short n = 4;
size_t i, j, k, m;
srand((unsigned)time(NULL));
for (i = 0U; i < size; ++i) fill(matrix[i], n);
for (i = 0U; i < size; ++i) out(matrix[i]);
putchar('\n');
for (i = 0U; i < size; ++i) {
for (j = i + 1; j < size; ++j) {
if (eq(matrix[i], matrix[j])) {
for (k = j + 1; k < size; ++k) {
for (m = 0; m < COLS; ++m) {
swap(&matrix[k][m], &matrix[k - 1][m]);
}
}
--j;
--size;
}
}
}
for (i = 0U; i < size; ++i) out(matrix[i]);
getchar();
return 0;
}
Владимир Николаев
Владимир Николаев
74 459
Лучший ответ
Да фигня все. Если матрица пишется в цикле scanf(), то не нужно записывать дубликаты а потом героически их удалять) Сразу ищете дубликат и если он есть, на записываете строку. Вот так.
Azamat Muratov
Azamat Muratov
36 000
Нужен еще один массив куда вы будете записывать уже существующие ряды и каждый ряд массива надо сравнивать с массивом уже существующих рядов. Если такой есть то удалять (пометить на удаление путем заполнения нулями или записать индексы рядов на удаление в новый одномерный массив пот потом удалить со смешением) если нет то записывать в массив существуюших. В общем то что у вас 5% от программы
Ербол Болтаев Можно просто при удалении дубликата перемещать оставшуюся часть этой строки или столбца матрицы к началу, записывая на освободившееся место в конце строки или столбца нуль.
Bikonooooooo Bik
Bikonooooooo Bik
11 084
Владимир Ефимов А можно без функции, size_t и size_of. Заранее спасибо.
Владимир Ефимов Ну а без функции?
при нахождении дубликата запускаешь цикл от i до N перекидываешь элементы, уменьшаешь N на 1 и продолжаешь исследование.
при нахождении дубликата запускаешь цикл от i до N перекидываешь элементы, уменьшаешь N на 1 и продолжаешь исследование.
* Almas *
* Almas *
281