c语言一个二维数组删除数组中重复的元素,保留第一个相同的元素,重新 排序,剩下元素用0代替,打印出新的二维数组
时间: 2024-10-28 20:07:46 浏览: 34
二维的qsort,根据其中任何一维进行快速排序
在C语言中,删除二维数组中重复元素、保留第一个相同元素,并对剩余元素用0填充后,再重新排序是一个复杂的任务,因为涉及到原地操作和数据结构管理。下面是一种可能的解决方案,使用了`qsort()`函数进行排序,并采用一个临时数组保存不重复的元素:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int index;
int data[3]; // 假设每个元素有三个元素,例如3x3的子矩阵
} Element;
// 比较函数,用于qsort()
int compare(const void* a, const void* b) {
Element e1 = *((Element*)a), e2 = *((Element*)b);
return memcmp(e1.data, e2.data, sizeof(e1.data));
}
// 删除重复元素,保持第一个,其余用0填充
void eliminate_duplicates(int arr[][3], int rows, int cols, int new_arr[][3]) {
int count = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (!new_arr[count][j]) {
memcpy(new_arr[count], arr[i], sizeof(new_arr[count]));
count++;
break;
}
}
}
// 对新数组进行0填充
memset(new_arr + count, 0, sizeof(Element) * (rows * cols - count));
// 排序
qsort(new_arr, count, sizeof(Element), compare);
// 打印新数组
for (int i = 0; i < count; i++) {
printf("[%d,%d,%d]\n", new_arr[i].data[0], new_arr[i].data[1], new_arr[i].data[2]);
}
}
int main() {
int arr[4][3] = {{1, 2, 3}, {4, 5, 6}, {7, 2, 9}, {2, 3, 4}};
int rows = sizeof(arr) / sizeof(arr[0]);
int new_arr[rows * cols][3];
eliminate_duplicates(arr, rows, 3, new_arr);
return 0;
}
```
请注意,上述代码仅适用于3x3的子矩阵,如果数组大小不同,请相应调整比较函数和内存分配。此外,由于C标准库提供的`qsort()`并不支持复杂的数据类型排序,所以在本例中我们自定义了一个结构体`Element`来存储元素及其索引。
阅读全文