Вот полный пример с вашей структурой и выделением памяти для данных,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BC_node{
void *data;
struct BC_node *next;
};
struct BC_list{
struct BC_node *head;
struct BC_node *tail;
};
struct BC_node *BC_new_node(void *data,size_t szdata)
{
struct BC_node *ptr=malloc(sizeof(struct BC_node));
if(ptr!=NULL){
ptr->data=malloc(szdata);
ptr->next=NULL;
if(ptr->data!=NULL)
memcpy(ptr->data,data,szdata);
else free(ptr),ptr=NULL;
}
return ptr;
}
int BC_list_push(struct BC_list *list,void *data,size_t szdata)
{
struct BC_node *ptr=BC_new_node(data,szdata);
if(list!=NULL && ptr!=NULL){
if(list->tail==NULL){
list->head=ptr;
list->tail=ptr;
} else {
list->tail->next=ptr;
list->tail=ptr;
}
return 0;
}
return 1;
}
void *BC_new_list(void)
{
struct BC_list *ptr=malloc(sizeof(struct BC_list));
if(ptr!=NULL)
ptr->head=ptr->tail=NULL;
return ptr;
}
void BC_free_list(struct BC_list *list)
{
struct BC_node *ptr;
while(list->head){
ptr=list->head->next;
free(list->head->data);
free(list->head);
list->head=ptr;
}
free(list);
}
void print_test(struct BC_list *list){
struct BC_node *ptr=list->head;
while(ptr){
printf("%s\n",(char*)ptr->data);
ptr=ptr->next;
}
}
int main(void)
{
char tab[3][40]={"hello","world","test"};
struct BC_list *list=BC_new_list();
if(list!=NULL){
BC_list_push(list,tab[0],strlen(tab[0])+1);
BC_list_push(list,tab[1],strlen(tab[1])+1);
BC_list_push(list,tab[2],strlen(tab[2])+1);
print_test(list);
BC_free_list(list);
}
return EXIT_SUCCESS;
}