回调函数的使用
回调函数的使用
1.下面以万能链表为例子
解释:回调函数主要看参数,这点很重要
例子1:void * 万能指针

例子2:

下面上代码
list.h
#ifndef LIST_H
#define LIST_H
#include<stdbool.h>//定义比较函数指针
typedef int (*Compar)(const void *, const void *) ;//结点
typedef struct Node{
void *ptr;
struct Node *prev;
struct Node *next;
}Node ;//通用链表
typedef struct List
{
Node *head;
size_t size;
}List;//创建
List *create_loist(void);
//添加
void add_list(List *list,void *ptr)
//插入
bool insert_list(List *list,size_t index,void *ptr);
//删除 按位置
bool del_index_list(List *list,size_t index);
//删除 按值
bool del_value_list(List *list,void *ptr,Compar cmp);
//查询
void *query_list(List *list,void *ptr,Compar cmp);
//访问
void *visit_list(List *list,size_t index);
//遍历
void show_list(List *list,void (show)(void*));
//排序
void sort_list(List *list,Compar cmp)
//清空
void clean_list(List* list);
//销毁
void destroy_list(List *list);
#endif //LISTH
*list.c
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
//创建结点
static Node *create_node(void *ptr)
{Node *node=malloc(sizeof(Node));node->prev=node;node->next=node;node->ptr=ptrreturn node;
}
//在两个结点之间插入一个新的结点
static void _add_list(Node *pre,Node *next,void *ptr)
{Node *node=create_node(ptr); prev->next=node;node->next=next;node->prev=prev;next->prev=node;}//根据位置访问结点
static Node* _visit_list(List *list,size_t index)
{if(index>=list->size) return NULL;if(idnex<list->size/2){Node *node =list->head->next;while(index--) node=node->next; //!! 同时进行会到指向当前结点return node; //!! 到inde=0时结束}else{Node *node=list->head->pre;while(++index<list->size) node=node->pre;//!!同时执行到 小于cnt结束}
}//删除当前结点 static void _del_list(Node *node)
{node->next->prev=node->prev;node->prev->next=node->next;free(node->ptr);free(node);}//创建
List *create_list(void)
{List *list=malloc(sizeof(List));List*head=create_node(0);list->size=0;return list;
}
//添加.头添加不需要,因为下面的插入运算可以实现
void add_list(List *list,void *ptr)
{_add_list(list->head->pre,list->head,ptr);list->size++;
}//插入
bool insert_list(List *list,size_t index,void *ptr)
{Node *node=_visit_list(list ,index);if(NULL==node) return false;_add_list(node->pre,node,ptr);list->size++;return true;}
//删除 按位置
bool del_index_list(List *list,size_t index)
{Node *node=_visit_list(list,index);if(NULL==node) return false;_del_list(node);list->size--;return true;
}
//自定义比较函数指针//删除 按值
bool del_value_list(List *list,void *ptr,Compar cmp)
{for(Node *n=head->next;n!=list->head;n=n->next){if(0==cmp(ptr,n->ptr)){ _del_list(n); }return true;}return false;
}
//查询
void *query_list(List *list,void *ptr,Compar cmp)
{for(Node *n=head->next;n!=list->head;n=n->next){if(0==cmp(ptr,n->ptr)){return n->ptr; }}return NULL;}
//访问
void *visit_list(List *list,size_t index)
{Node *node=_visit_list(list,index);if(NULL=node) return NULL;return node->ptr;}
//遍历 //回调函数有调用者提供
void show_list(List *list,void (show)(void*))
{for(Node *n=head->next;n!=list->head;n=n->next){show(n->ptr); //调用函数 show_stu }
}//排序
void sort_list(List *list,Compar cmp)
{for(Node *n=list->head->next;n->next!=list->head;n=n->next){for(Node *m=n->next;m!=list->head;m=m->next){if(1==cmp(n->ptr,m->ptr)){void temp=n->ptr;n->ptr=m->ptr;m->ptr=temp;}}}
}
//清空
void clean_list(List* list)
{Node *node=list->head->next;while(node!=list->head){Node *temp=node;node=node->next;free(temp);}list->head->next=list->head;list->head->prev=list->head;list->size=0;
}
//销毁
void destroy_list(List *list)
{clean_list(list);free(list->head);free(list);
}
main.c
#include <stdio.h>
#include<stdlib.h>
#include"list.h"typedef struct Student
{char name[20];char sex;int id;}Studnet;void show_stu(void *ptr)
{Student *stu =ptr;printf("name:%s sex:%c id:%d\n",stu->name,stu->sex,stu->id);}void stucmp(const void *p1,const void *p2)
{const Student *s1=p1.*s2=p2;if(s1->id>s2->id)return 1; else if(s1->id<s2-id)return -1;else return 0;
}int main(int argc,const char* argv[])
{List *list=create_list();for(int i=0;i<10;i++){Student *stu=mallo(sizeof(Student));sprintf(stu->name,"ke19 %d",i);stu->sex=i%2?'m':'w';stu->id=1000-i;add_list(list,stu); }//del_index_list(list,2);Student s={"xxx",'a',1000};del_value_list(list,&S,stucmp);Student s={"xx",'x',1001};insert_list(list,3,&s);show_list(list,show_stu);sort_list(list,stucmp)show_list(list,show_stu);return 0;
}
2.打开共享库使用回调函数



list.h

