回调函数的使用

回调函数的使用
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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值