C语言链表定义的一些疑惑_其他语言_编程问答 问题: 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);是用来干什么的啊,我有试过去掉也没什么影响啊


解决方案1:

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

解决方案2:

推荐一个教程系列,不妨看完再结合书本,理解起来容易很多。
http://study.163.com/course/c...

解决方案3:

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

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

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

上一篇(python)cmd和自带的idle运行正常,PyCharm和anaconda怎么运行都报错?
下一篇(golang)用了反射的代码真的会变慢吗?变慢的原因是什么呢?
明星图片
相关文章
《 C语言链表定义的一些疑惑》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)