Как создать изолированный заголовок связанных списков с неопределенным типом - PullRequest
0 голосов
/ 19 апреля 2019

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

#include "linkedlists.h"
#define NODE_TYPE int

int main() {
    /* code using linked lists of integers */
    return 0;
}

В настоящее время я определяю тип внутри linkedlists.h, а затем включаю его в main.c, но это означает, что мне нужно изменить заголовок связанных списков для каждого проекта. Например, в моем текущем проекте у меня есть что-то вроде этого, внутри linkedlists.h:

struct A {                           
    char * name;                            
    int age;                   
};

struct B {                              
    char * name;                            
    char * description;                     
    char * schedule;                        
};

union node_type {                           
    struct A a;               
    struct B b;
};

typedef struct node {               
    union node_type data;       
    struct node * next;
} node;

/* linked lists function declarations */

Итак, если возможно, как я могу переместить спецификацию типа списка в main.c и сделать linkedlists.h универсальным для списков любого типа?

1 Ответ

2 голосов
/ 19 апреля 2019

Вы должны «абстрагировать» список от его «полезной нагрузки», например:

typedef struct node {               
    void *data;          // the user's data
    struct node *next;
} node;

Ваши функции связанного списка теперь просто помещают туда данные и возвращают их пользователю, не зная, что это за данные.is.

// list.h
struct list;
int addNode(struct list *list, void *data);  // add node with data to abstract list
void *getData(struct list *list);            // return data from abstract list

и:

// list.c
struct node {               
    void *data;          // the user's data
    struct node *next;
};

struct list {
    struct node *head, *current;
};

int addNode(struct list *list, void *data)
{
    struct node *newNode= malloc(sizeof(struct node));
    //...
    // (add node to list)
    newNode->data= data;
    return SUCCESS;
}
...