#include<stdio.h>
#include<stdlib.h>
void *data; //把数据 类型声明为void*类型在使用时可以通过在堆区分配内存来使用。
struct node *next;
}list_node; //单链表结构。
typedef struct stu{
char name[10];
int num;
}STU; //自己定义的数据类型。
typedef struct bag{
list_node *h;//链表的头指针
int data_size;
list_node *node;//要打印的node指针,在插入时能用到。
fun_type fill_node; //每种类型的数据都 有各自的填充节点方式
fun_type print_node;//每种类型的数据都 有自己的打印方式
}BAG;
void stu_print_node(BAG *bag)
{
STU *stu=(STU *)bag->node->data;
printf("num=%d and name=%s\n",stu->num,stu->name);
}
void stu_fill_node(BAG *bag)
{
int n=1000;
char str[]="abc";
STU *stu=(STU*)bag->node->data;
strcpy(stu->name,str);
stu->num=n;
}
void stu_init_bag(BAG *bag)
{
bag->h=NULL;
bag->data_size=sizeof(STU);
bag->print_node=stu_print_node;
bag->fill_node=stu_fill_node;
}
void make_node(BAG **bag) //是创建新节点的函数,并把节点放在node bag的node
{
(*bag)->node=(list_node*)malloc(sizeof(list_node));
(*bag)->node->data=malloc((*bag)->data_size);
(*bag)->node->next=NULL;
bag->fill_node(bag);//回调函数
}
void insert_node(BAG **bag)
(*bag)->h->next=(*bag)->node;
(*bag)->node=NULL;
}
void create_head(BAG **bag){
make_node(bag);
(*bag)->h=(*bag)->node;
(*bag)->h->next=NULL;
(*bag)->node=NULL;
}
void create_list(BAG *bag)
{
int i=0;
create_head(&bag);
while(1)
{
if(5==i) break;
make_node(&bag);
fill_node(bag);
insert_node(&bag);
i++;
}
}
}
void print_list(BAG *bag)
{
int i=0;
list_node *p=bag->h->next;
while(p)
{
i++;
bag->node=p;
print_node(bag);
p=p->next;
}
}
int main()
{
BAG stu_bag;
stu_init_bag(&stu_bag);
create_list(&stu_bag);
print_list(&stu_bag);
return 0;
}
#include<stdlib.h>
#include<string.h>
typedef int(*fun_type)(); //函数指针声明
void *data; //把数据 类型声明为void*类型在使用时可以通过在堆区分配内存来使用。
struct node *next;
}list_node; //单链表结构。
typedef struct stu{
char name[10];
int num;
}STU; //自己定义的数据类型。
typedef struct bag{
list_node *h;//链表的头指针
int data_size;
list_node *node;//要打印的node指针,在插入时能用到。
fun_type fill_node; //每种类型的数据都 有各自的填充节点方式
fun_type print_node;//每种类型的数据都 有自己的打印方式
}BAG;
void stu_print_node(BAG *bag)
{
STU *stu=(STU *)bag->node->data;
printf("num=%d and name=%s\n",stu->num,stu->name);
}
void stu_fill_node(BAG *bag)
{
int n=1000;
char str[]="abc";
STU *stu=(STU*)bag->node->data;
strcpy(stu->name,str);
stu->num=n;
}
void stu_init_bag(BAG *bag)
{
bag->h=NULL;
bag->data_size=sizeof(STU);
bag->print_node=stu_print_node;
bag->fill_node=stu_fill_node;
}
void make_node(BAG **bag) //是创建新节点的函数,并把节点放在node bag的node
{
(*bag)->node=(list_node*)malloc(sizeof(list_node));
(*bag)->node->data=malloc((*bag)->data_size);
(*bag)->node->next=NULL;
}
void fill_node(BAG *bag)
bag->fill_node(bag);//回调函数
}
void insert_node(BAG **bag)
{
//插入结点时就从把node 中存的变量插入
(*bag)->h->next=(*bag)->node;
(*bag)->node=NULL;
}
void create_head(BAG **bag){
make_node(bag);
(*bag)->h=(*bag)->node;
(*bag)->h->next=NULL;
(*bag)->node=NULL;
}
void create_list(BAG *bag)
{
int i=0;
create_head(&bag);
while(1)
{
if(5==i) break;
make_node(&bag);
fill_node(bag);
insert_node(&bag);
i++;
}
}
void print_node(BAG *bag)
{
bag->print_node(bag);//回调调用各自的打印函数。}
void print_list(BAG *bag)
{
int i=0;
list_node *p=bag->h->next;
while(p)
{
i++;
bag->node=p;
print_node(bag);
p=p->next;
}
}
int main()
{
BAG stu_bag;
stu_init_bag(&stu_bag);
create_list(&stu_bag);
print_list(&stu_bag);
return 0;
}