回调函数的使用
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=ptr
return 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