函数指针与链表结合举例


struct   student{int   age ,float  score ,char  sex}


//为结构体赋值

struct     student    stu={20  ,98.9 ,'  w'}

看了上面就容易理解下面的语句:

typedef   int  (*over_time_func)();//函数指针

struct timer_func
{
over_time_func  func;
};

struct timer_func   tf ={func};

//

 struct list
{
NodePtr node;//头指针,指向头结点
    ushort datasize;//链表对应的数据单元所占内存的大小
    ushort length;//链表list的长度
byte otype;//数据类型
};

typedef struct list List;

typedef  List  OverDayFuncList;

OverDayFuncList    DAY_FUNC_LIST ={0};

struct timer_func
{
over_time_func  func;
};


//时间过正时函数指针,正分、整时,整日,整月

typedef   int  (*over_time_func)();//函数指针

add_OverDayFunc(do_day_action);

void add_OverDayFunc(over_time_func func)
{
add_overfunc(TI_DAY,func);
}

void add_overfunc(enum TI_UNIT  tu,over_time_func func)
{
struct timer_func   tf ={func};
switch(tu)
{
case TI_SECOND:
SetNodeDataSize(&SECOND_FUNC_LIST,0,sizeof(struct timer_func));
Add2ArrayList(&SECOND_FUNC_LIST,&tf,NULL);
break;
case TI_MINUTE:
SetNodeDataSize(&MINUTE_FUNC_LIST,0,sizeof(struct timer_func));
Add2ArrayList(&MINUTE_FUNC_LIST,&tf,NULL);
break;
case TI_HOUR:
SetNodeDataSize(&HOUR_FUNC_LIST,0,sizeof(struct timer_func));
Add2ArrayList(&HOUR_FUNC_LIST,&tf,NULL);
break;
case TI_DAY:
SetNodeDataSize(&DAY_FUNC_LIST,0,sizeof(struct timer_func));
Add2ArrayList(&DAY_FUNC_LIST,&tf,NULL);
break;
case TI_MONTH:
SetNodeDataSize(&MONTH_FUNC_LIST,0,sizeof(struct timer_func));
Add2ArrayList(&MONTH_FUNC_LIST,&tf,NULL);
break;
default:break;
}
}

int do_day_action(void*  args)
{
       log_print(INFO,"do_day_action:delete 62 days ago(day freeze,month freeze,curve freeze) data! \n");
//é?3yêy?Y
//删除数据
delete_obsolete_data(0x50040200);
delete_obsolete_data(0x50060200);
delete_obsolete_data(0x50020200);

return 1;
}




static ListPtr  get_func_list(enum TI_UNIT  tu)

{
switch(tu)
{
case TI_SECOND:
return &SECOND_FUNC_LIST;
case TI_MINUTE:
return &MINUTE_FUNC_LIST;
case TI_HOUR:
return &HOUR_FUNC_LIST;
case TI_DAY:
return &DAY_FUNC_LIST;
case TI_MONTH:
return &MONTH_FUNC_LIST;
default:break;
}


return NULL;
}

void exec_over_timer_func(enum TI_UNIT  tu)
{
ListPtr plist =get_func_list(tu);
if(plist ==NULL) return ;
NodePtr node =plist->node;
while(node !=NULL)
{
if(node->data !=NULL)
{
struct timer_func*  ptf =(struct timer_func*)node->data;
ptf->func();
}


node = node->next;
}
}

exec_over_timer_func(TI_DAY);

//assign指定数据data间的赋值方法
 NodePtr Add2ArrayList(ListPtr list, void *data, void (*assign)(void* dest, const void* src))
 {
if(list==NULL) return NULL;
NodePtr  node = (NodePtr)malloc(sizeof(struct node));
if(node ==NULL) return NULL;
node->data =malloc(list->datasize);
if(node->data ==NULL) return NULL;
node->next =NULL;
//设置结点的值
if(assign == NULL)//使用默认的逐位复制方式,即浅复制
memcpy(node->data,data,list->datasize);
else    //使用用户定义的复制方式来复制数据
assign(node->data, data);
if(list->node ==NULL)
list->node =node;
else
{
NodePtr temp =list->node;
while(temp->next !=NULL)temp=temp->next;
temp ->next=node;
}
//把node的值连入list后,list的长度加1
++list->length;
return node;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值