C - 我可以对这两个不同的列表使用相同的函数吗?

标签 c pointers struct linked-list

我的一个 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;

这就是我设置它的方式,但它不允许我使用相同的函数,因为我拥有的指针指向“节点”,而不是“城市”。我可以让它们都像第二个一样,但是在内存中放入 50 万个条目,每个条目都有两个空 float 会有点不必要和有问题。

我希望对它们使用相同的功能。这些函数是您常用的链表函数,例如排序插入等。我之前尝试使用 void 指针,根据需要转换它们,但这意味着我的函数必须有两个部分。

我正在寻求改变我的结构的呃...结构,以便它们允许我简单地使用相同的函数,而不需要转换,或者至少使用最少的转换。

如您所见,它们非常相似,但没有想到。任何想法将不胜感激。干杯!

最佳答案

您可以修改链表实现以使用 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));

关于C - 我可以对这两个不同的列表使用相同的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50320546/

相关文章:

c - 为什么在 cygwin 终端中运行时 Cygwin 堆栈转储消息不同

c - if-else vs if-else-if-else

c++ - 指针和解除引用的指针

c - 从不同结构类型中的指针向结构指针赋值

swift - 将我的 Struct 放在哪里以保持类独立?

c - 使用 [] 运算符访问动态数组

c - 我将如何使用 gstreamer 将一组图像拼接在一起以形成视频幻灯片

c - 将 char 数组从指针复制到行文件后的奇怪输出

c - struct {0} 和 memset 0 有什么区别

C 数组与结构