C - Могу ли я использовать одни и те же функции для этих двух разных списков? - PullRequest
0 голосов
/ 13 мая 2018

Унифицированный проект, который у меня есть, включает в себя сортировку очень большого набора данных в два разных списка, один из которых содержит набор данных о городе или стране, а другой - те же данные (о городе, на этот раз), но также с некоторыми координатами, например:

//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;

Так я это настраиваю, но это не позволяет мне использовать те же функции, потому что у меня есть указатели на «узел», а не «город». Я мог бы сделать их обоих похожими на второй, но поместить в память полмиллиона записей, каждая с двумя пустыми числами с плавающей запятой, было бы отчасти ненужно и проблематично.

Я хочу использовать одни и те же функции для них обоих. Функции - это ваши обычные связанные списки, такие как сортированная вставка и тому подобное. Я пытался использовать пустые указатели раньше, приводя их по мере необходимости, но это означает, что мои функции должны состоять из двух частей.

Я хочу изменить структуру своих структур, чтобы они позволяли мне использовать одни и те же функции просто, без необходимости приведения или, по крайней мере, с минимальными.

Они очень похожи, как вы можете видеть, но ничего не приходит на ум. Любые идеи очень приветствуются. Ура!

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете изменить реализацию связанного списка, чтобы использовать 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* city = malloc(sizeof(City));
insert(head, city, sizeof(City));
...