CS107学习笔记之bsearch函数另类用法

        CS107的assignment2中,我们被要求写两个函数:

        这两个函数的作用是,建立演员-影片的pair以及影片-演员的pair,然而二者是一对多的关系,即一位演员可在多部电影中出演,而一部电影里面会出现多位演员。其中我只举第一个函数的代码作为例子来分析标题中的bsearch函数到底是怎么用的。

CS107学习笔记之bsearch函数另类用法_第1张图片
CS107学习笔记之bsearch函数另类用法_第2张图片

        在这段代码里出现了我所说的亮点:

        乍一看有点懵逼,仔细看更加懵逼,先来看看bsearch的reference:

CS107学习笔记之bsearch函数另类用法_第3张图片

        按照图中的分析,那么key是currPair,类型为ActorSearchPair,其为一个结构体,结构体中包含

CS107学习笔记之bsearch函数另类用法_第4张图片

        其中actorFilePtr指向material里所给的actorfile文件,playerName指向演员名。base是actorsBase,按照程序以及actorfile的架构分析,我们可以知道actorsBase指向一个int型的数,numActors为演员数,利用numActors × sizeof(int)和actorsBase确定了bsearch的搜索空间,所以sizeof(int)也就不难理解了。

CS107学习笔记之bsearch函数另类用法_第5张图片
actorfile的结构图1


CS107学习笔记之bsearch函数另类用法_第6张图片
actorfile的结构图2


CS107学习笔记之bsearch函数另类用法_第7张图片
info的结构图以及说明

        最迷的地方来了,我们来看看他的compar是怎么写的:

CS107学习笔记之bsearch函数另类用法_第8张图片

        乍看上去简单粗暴,但仔细一看,哎,不对呀,我比较的两个东西的实际数据类型怎么都不一样?是的,这里正是玄机所在。


nameCmp中的vp1对应着图中的currPair,vp2对应着图中的actorsBase,一个是结构体,一个是int型指针,这到底在干嘛?
        一般来说,凡人写compar函数都写成这样:

CS107学习笔记之bsearch函数另类用法_第9张图片

你会发现a,b重定义type的时候会保持一致,但我们这里使用时并没有保持一致,那到底是为什么呢?仔细观察函数,我们发现

这句话的目的实际上是通过binary search在actorfile中找到当前传入的player的名字,并返回其在actorfile中的offset量,这样一来我们就清楚是怎么回事了,这里写的nameCmp的目的是比较currPair.PlayerNamePtr指向的player_name与actorfile中的actorBase+i(0



CS107学习笔记之bsearch函数另类用法_第10张图片
关于actorfile和moviefile的结构图

你可能感兴趣的:(CS107学习笔记之bsearch函数另类用法)