使用void *来存储数据

#include<stdio.h>
#include<stdlib.h>

#include<string.h>

typedef int(*fun_type)();  //函数指针声明


typedef struct node{
    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)->node->next=(*bag)->h->next;
      (*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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值