当前位置: 首页 > news >正文

回调函数的使用

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


http://www.mrgr.cn/news/7792.html

相关文章:

  • 如何使用ssm实现公司项目管理系统设计与实现
  • (第三期)书生大模型实战营——OpenXLab部署InternLM2实践——上传模型
  • Vue.js实战教程:如何一步步构建HSK在线学习平台
  • API 的多版本管理,如何在 Apifox 中操作?
  • 【日常记录-Linux】dnf工具
  • React 使用ref属性调用子组件方法(也可以适用于父子传参)
  • FastAPI+React18开发通用后台管理系统用户功能实战
  • staticHeader(静态标头)
  • BUG——GT911上电后中断一直触发
  • 数据集笔记: FourSquare - NYC and Tokyo Check-ins
  • bedtools安装与使用(v2.31.1)生物信息学工具29
  • uniapp+vue3的ifdef实现多端配置客服消息
  • 21.2 Netty聊天会话管理
  • SOMEIP_ETS_061: Sending_two_SOMEIP_Messages_in_a_row
  • 启用 UFW 防火墙后如何打开 80 和 443 端口?
  • 【Leetcode 1805 】 字符串中不同整数的数目—— 双指针
  • 基于Springboot/Vue的企业内部培训考试系统
  • ML307R_APP_DEMO_SDK TCP/UDP使用介绍
  • Java 调整字符串,验证码生成
  • Redis持久化