C语言链表定义的一些疑惑

刚学完C语言,最近在学数据结构,看的是《算法精解——C语言描述》。关于里面的链表的定义,有不懂的地方,希望有前辈能指点一下小白。

#ifndef LIST_H
#define LIST_H
#include <stdlib.h>
//定义链表结点
typedef struct ListElmt_
{
    void *data;
    struct ListElmt_ *next;
} ListElmt;
//定义链表
typedef struct List_
{
    int size;
    int (*math)(const void *key1, const void *key2);
    void (*destory)(void *data);
    ListElmt *head;
    ListElmt *tail;
} List;

这里面int(*math)(const void *key1,const void *key2);是用来干什么的啊,我有试过去掉也没什么影响啊

阅读 3.2k
3 个回答

定义了一个函数指针math(更合适的名字应该是match吧?),接受两个const void*实参返回int。在原生列表中这么做的目的在于告诉用户应当如何处理match操作,即定义了一个模板。这里的意义在于告诉用户,比较函数不应该试图修改key,所以模板中是const void *。 如果你实现了如下函数:

int isMatch(const void *l1, const void*l2);

那么你可以让match指针指向该函数,并调用->match

int(math)(const void key1,const void *key2);是一个函数指针,就跟库函数qsort一样需要传递一个比较函数指针作为如何排序使用。没有看到这个函数指针的实现,光从这个结构体定义来看根本无法推测。从经验上来说你链表接受的类型是void(任意的),那么该函数指针应该是用于查询链表位置的时候判断是否等于用的,因为不知道类型不能简单的使用==,需要传一个判断等于的函数指针判断是否相等,以上个人观点

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进