我有一个uni项目,涉及将非常大的数据集分类到两个不同的列表中,一个列表包含一堆关于城市或国家的数据,另一个具有相同的数据(这次是关于城市的(,但也有一些坐标,如下所示:
//used for cities and countries in the textual mode
typedef struct node{
int year;
int month;
float temp;
char* name;
struct node* next;
struct node* prev;
} node_t;
//used for cities in the graphical mode
typedef struct City{
node_t data;
float latitude;
float longitude;
} City;
这就是我设置它的方式,但它不允许我使用相同的函数,因为我的指针是"节点",而不是"城市"。我可以让它们都像第二个一样,但是在内存中放入五十万个条目,每个条目有两个空浮点数,这将是不必要的和有问题的。
我希望对它们使用相同的功能。这些函数是你通常的链表函数,如排序插入等。我之前尝试使用空指针,根据需要转换它们,但这意味着我的函数必须有两个部分。
我想改变呃...我的结构结构,以便它们允许我简单地使用相同的函数,而无需强制转换,或者至少使用最少的强制转换。
如您所见,它们非常相似,但什么也没有想到。任何想法将不胜感激。干杯!
您可以修改链表实现以使用 void* 作为数据指针。
struct Node
{
void *data;
struct Node *next;
}
插入函数应如下所示:
Node * insert (struct Node *h, void *data, size_t data_size)
{
Node *node = malloc(sizeof(Node));
node->data = malloc(data_size);
memcpy(node->data, data, data_size);
node->next = h;
h = node;
return h;
}
插入"城市"或任何其他类型时:
City* city = malloc(sizeof(City));
insert(head, city, sizeof(City));