C语言,文件中保存有表示直线和圆弧的结构体,结构体内包含开始点x0,y0和结束点x1,y1,去掉重复保存的直线或圆弧结构体
时间: 2024-02-20 21:00:14 浏览: 55
c语言的结构体
5星 · 资源好评率100%
好的,根据您的需求,我可以提供以下思路和代码示例:
首先,我们需要定义结构体来表示直线和圆弧:
```c
typedef struct line {
int x0, y0; // 直线起点
int x1, y1; // 直线终点
} Line;
typedef struct arc {
int x0, y0; // 圆弧起点
int x1, y1; // 圆弧终点
int r; // 圆弧半径
} Arc;
```
然后,我们可以读取文件中的结构体,并将其保存到一个数组中:
```c
#define MAX_ITEMS 100 // 最多保存100个结构体
void read_structs(const char* filename, void* items, int item_size, int* num_items) {
FILE* fp = fopen(filename, "rb");
if (fp == NULL) {
printf("Error: cannot open file %s\n", filename);
exit(1);
}
*num_items = 0;
while (*num_items < MAX_ITEMS && fread(items + (*num_items) * item_size, item_size, 1, fp) == 1) {
(*num_items)++;
}
fclose(fp);
}
```
接下来,我们需要实现一个函数来判断两个直线或圆弧是否相同。这里我们可以定义相同的条件为起点和终点坐标相同:
```c
int is_same_line(void* item1, void* item2) {
Line* line1 = (Line*)item1;
Line* line2 = (Line*)item2;
return (line1->x0 == line2->x0 && line1->y0 == line2->y0 && line1->x1 == line2->x1 && line1->y1 == line2->y1);
}
int is_same_arc(void* item1, void* item2) {
Arc* arc1 = (Arc*)item1;
Arc* arc2 = (Arc*)item2;
return (arc1->x0 == arc2->x0 && arc1->y0 == arc2->y0 && arc1->x1 == arc2->x1 && arc1->y1 == arc2->y1 && arc1->r == arc2->r);
}
```
最后,我们可以使用一个循环来遍历所有的结构体,如果发现有重复的结构体,则将其删除:
```c
void remove_duplicate_structs(void* items, int item_size, int* num_items, int (*is_same)(void*, void*)) {
int i, j;
for (i = 0; i < *num_items - 1; i++) {
for (j = i + 1; j < *num_items; j++) {
if (is_same(items + i * item_size, items + j * item_size)) {
// 找到了重复的结构体,将j位置的结构体删除
memcpy(items + j * item_size, items + (*num_items - 1) * item_size, item_size);
(*num_items)--;
j--;
}
}
}
}
```
完整代码示例如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct line {
int x0, y0; // 直线起点
int x1, y1; // 直线终点
} Line;
typedef struct arc {
int x0, y0; // 圆弧起点
int x1, y1; // 圆弧终点
int r; // 圆弧半径
} Arc;
#define MAX_ITEMS 100 // 最多保存100个结构体
void read_structs(const char* filename, void* items, int item_size, int* num_items) {
FILE* fp = fopen(filename, "rb");
if (fp == NULL) {
printf("Error: cannot open file %s\n", filename);
exit(1);
}
*num_items = 0;
while (*num_items < MAX_ITEMS && fread(items + (*num_items) * item_size, item_size, 1, fp) == 1) {
(*num_items)++;
}
fclose(fp);
}
int is_same_line(void* item1, void* item2) {
Line* line1 = (Line*)item1;
Line* line2 = (Line*)item2;
return (line1->x0 == line2->x0 && line1->y0 == line2->y0 && line1->x1 == line2->x1 && line1->y1 == line2->y1);
}
int is_same_arc(void* item1, void* item2) {
Arc* arc1 = (Arc*)item1;
Arc* arc2 = (Arc*)item2;
return (arc1->x0 == arc2->x0 && arc1->y0 == arc2->y0 && arc1->x1 == arc2->x1 && arc1->y1 == arc2->y1 && arc1->r == arc2->r);
}
void remove_duplicate_structs(void* items, int item_size, int* num_items, int (*is_same)(void*, void*)) {
int i, j;
for (i = 0; i < *num_items - 1; i++) {
for (j = i + 1; j < *num_items; j++) {
if (is_same(items + i * item_size, items + j * item_size)) {
// 找到了重复的结构体,将j位置的结构体删除
memcpy(items + j * item_size, items + (*num_items - 1) * item_size, item_size);
(*num_items)--;
j--;
}
}
}
}
int main() {
Line lines[MAX_ITEMS];
Arc arcs[MAX_ITEMS];
int num_lines, num_arcs;
// 从文件中读取结构体
read_structs("data.bin", lines, sizeof(Line), &num_lines);
read_structs("data.bin", arcs, sizeof(Arc), &num_arcs);
// 去掉重复的结构体
remove_duplicate_structs(lines, sizeof(Line), &num_lines, is_same_line);
remove_duplicate_structs(arcs, sizeof(Arc), &num_arcs, is_same_arc);
// 输出结果
printf("After removing duplicates:\n");
printf("Lines: %d\n", num_lines);
for (int i = 0; i < num_lines; i++) {
printf("(%d,%d)-(%d,%d)\n", lines[i].x0, lines[i].y0, lines[i].x1, lines[i].y1);
}
printf("Arcs: %d\n", num_arcs);
for (int i = 0; i < num_arcs; i++) {
printf("(%d,%d)-(%d,%d), r=%d\n", arcs[i].x0, arcs[i].y0, arcs[i].x1, arcs[i].y1, arcs[i].r);
}
return 0;
}
```
阅读全文