我们可以定义一个通用的结构体来实现通用列表,该结构体包含一个指向void的指针和一个指向下一个节点的指针。这样我们就可以存储任意类型的数据,并可以按照需要访问列表中的元素。
下面是一个使用通用结构体定义通用列表的代码示例:
typedef struct node {
void* data;
struct node* next;
} node;
typedef struct {
node* head;
node* tail;
int size;
} list;
void add(list* lst, void* data) {
node* new_node = malloc(sizeof(node));
new_node->data = data;
new_node->next = NULL;
if (lst->head == NULL) {
lst->head = new_node;
lst->tail = new_node;
} else {
lst->tail->next = new_node;
lst->tail = new_node;
}
lst->size++;
}
void* get(list* lst, int index) {
if (index < 0 || index >= lst->size) {
return NULL;
}
node* curr = lst->head;
for (int i = 0; i < index; i++) {
curr = curr->next;
}
return curr->data;
}
在上面的代码示例中,通用列表定义为结构体“list”,其中包含两个指向节点的指针“head”和“tail”,以及列表大小“size”。节点则是使用结构体“node”表示,包含一个指针“data”,用于存储任意类型的数据,以及指向下一个节点的指针“next”。
通用列表支持两种基本操作:“add”和“get”。函数“add”用于向列表中添加元素,函数“get”用于根据索引获取列表中的元素。
使用此结构,我们可以编写一个通用列表,在不知道具体实现的情况下存储任意类型