00:00
好,同学们,我们接着前面讲的内容继续来讲解,那现在呢,我们来完成一个功能,就是查找固源,对我们来查找雇员,那么如果说呃,用户输入一个ID,我们就把这个对应的雇员的信息呢,给它显示出来。给它显示出来,那这个时候啊,同学们注意。那这个时候呢,我们可以这样做,就是先来定义一个,这不已经有ID了吗?就提示他,如果用户输入的是find。哎,Case,如果他输入spend,那么我们就提示他请输入要查找的ID号。啊,就请输入ID号。ID号,那么IID号它输入进来过后呢,我们用这个ID来接收一下,对接一下啊,那就是办。Scan。
01:00
看。好,然后呢,把这个ID放进去,对吧,ID放进去scan。SCN啊,然后呢,我们就怎么做呢,我们把这个ID传给哈希table里面的一个方法,这个方法呢,没有写,我们看怎么写它一下啊好这一帮让他写一个就编写一个。一个方法完成查找。完成查找。那么怎么写呢?Function this,走哈。对,然后呢,我们这里面有一个函数叫find by ID。Find by ID,那这个时候呢,让他给我传进来一个ID号就可以了,最后我给他返回一个什么呢?注意咱们返回一个employee的指针就可以了。对,因为整个过程呢,咱们都按照这个引用的方式来进行处理,对这样子就比较好,那这个时候呢,我们呃,要明确的知道他应该到哪一根链表去找,就说因为你的链表很多嘛,对,所以说你先在这地方用个散列函数算出来到底应该到哪一个链表去找,你说。
02:17
这个列表里面找不到,肯能就没有了。咱们这样子呢,就提高查找的效率,所以说还是老规矩,先把这个。是哪一个链表确定下来。对,使用闪电函数确定该固源应该在哪个链表。应该在哪个链表,那如果说这个链表找不到呢,就不用再找了,因为别的列表肯定没有,哎,你看到哈希在这地方,它体现出它的一种优势,好,那么这地方我们把ID传进去。把ID传进去。好ID传进去过后呢,我们现在就调用这个链表的一个半的方法去做这个事情,那我就接收一下了。
03:00
Employee。那么我们这样这样写啊,就是this.link。Link,然后呢,找到这个link o点它的一个方法,他肯定要给我们提供一个方法,Find by ID,说真正真正的来找这个ID的这个人呢,还是。啊,找这个共享的人呢,还是我们这个链表来完成的,所以说把它传进去就可以了,最后我们这直接return。就OK了啊,当然那边呢,要做一个要做一个判断哈,那现在呢,我们链表里边就是employee链表里边是没有这个find by ID的,我们把它写一下。那就找到我们的这个这个位置啊,这个位置大家写一个就是查找根据ID。根据ID查找,查找对应的固源,那如果没有这个固源怎么办呢?如果有没有的话就返回一个列啊,如果没有就返回一个空。
04:05
好,咱们就这样先定下来,那就开始写了,就find,然后呢,我们写上这个this share employ link。然后呢,这边函数叫find by ID啊,这个时候我们接收一个ID号啊,最后我们也返回一个employee的指针。好,这样就可以了。那现在怎么去找呢?同学们,因为你现在已经到达了这个链表了,所以说就用我们的便利方式就可以搞定啊,现在我们怎么来找呢?比较呗。就比较就可以了,所以说我们还是老规矩,做一个辅助指针,这个时候就不需要那个pre了,越找到就找到了,找不到就找不到,所以说这个呢,直接把这个,呃,当前的这个链表的投掷针。投指针点儿。投子证had给他啊,给他过后呢,我们就开始进行一个遍历for。
05:03
For循环,那么我们先来做一个判断啊,如果这个当前呢,它不等于零。啊,它只要不等于零二,我们就继续找啊,不等零二,我们就开始进行一个比较,比较什么呢?那也可以把它写在一起啊,不等于零二,并且满足一个条件。并且满足什么呢?就是当前的这个,呃,这个这个节点吧,它的ID,它就等于你传进的ID,那说明什么呢?就找到了我们假定。ID是唯一的啊,我们假定ID是唯一的,那么在这种条件下呢,我们就认为找到,那找到咱们怎么办呢?就直接把这个返回去就可以了。我们假定只有一个啊,不对,不等于空,并且它是相等的,就找到这个人了,返回。返回,那如果说呃,如果说没有的话,就说这个地方一直没有的话呢,咱们就怎么办呢,就直接继续往下再找currentn.next。
06:10
啊,那什么时候找不到呢?同学们,如果整个for循环结束,都没有一个返回值。那他想肯定就找不到了。就肯定就没找到嘛,因为你如果说你找到了,肯定就进到这个return语句了,那就把它返回去了,那如果说一直没有进来的话呢,就直接一个,我们看这个代码有没有问题啊,我们判断一下,假设它是一个空链表,那这个cur呢,本身就是空指针,所以说它就直接这个。不不等于零二,不等于零二,你向下面走,这个就要出问题,对吧,所以说这个地方有一个有一个地方你为你看啊它它哦,它第一次上来就等于这个空,他占一空,你就让他往下走,这个本身就是错误,因此呢,这地方其实还要有一个逻辑。你这个逻辑要加进去才可以,就说如果他已经。
07:03
就说如果他已经就哦这个条件啊,还不行哈,这么还不行。呃,他不满足这个条件的话,我们来看看还要处理一下啊。就是它不等于零。呃,然后。又等于他就相当于找到了。那么如果等于零呢?等于一个空。啊,等于一个空的话,我们就应该就可以对。不对,这个地方还有逻辑有个问题啊,因为他这儿有一个并且的关系。那什么时候退出来呢?大家可以想一想。就什么时候就认为是一直找不到,从而退出这个for循环呢?Else if可不可以加一个?L或者这样写,就是这边写个else if,如果这个条件啊没有成立,那么假设这个它当前呢,又等于这个逆了,哎,等于这个逆二了,那么我们这个地方呢,也可以进行一个break退出啊,否则其他的在这个条件没有满足啊,没有满足,这个条件又不满足的情况下,我们往下看一步。
08:23
对,这样子应该是可以的,对吧,这样应该是可以的,就看你的逻辑怎么去写了,好这样子呢,我们保证它这个代码是没有这个空指针的一个异常啊,最后我们来看看这代码能不能搞定啊,把它找到了,就找到这个地方,我们把它显示出来就可以了,来走。好,现在呢,我们调用它完了以后啊,这边也返回了,大家看哈希table里面这个find by ID也返回了,好,我们现在接收一下在这。接收这个它返回的一个指针,那么我们就来做一个判断,如果这个它等于零,这就说明什么呢?说明哎,确实没有这个人,那我就说出一句话。
09:09
说出什么话呢?就说没有这个ID,多少多少不存在。啊,就说ID等于这么多的一个用户,它是不存在的啊,ID等于这个的雇员啊,雇员不存在。固原不存在。好,然后换一行,那么等于多少的呢?就是你这输进去的这个ID。啊,那如果说呃,如果说不等于零呢,就说明找到了,我们把信息打出来,但是这个时候啊,同学们看,因为它本身是一个雇员,因此呢,在打的时候干脆我们写一个方法。我们写一个方法就行了,而且还得告诉他你是在哪一个链表里边,因此呢,在输出信息的时候,我们专门写一个方法。我们。啊,我们在什么呢?编写一个方法,编写一个方法。
10:04
编写一个方法,显示显示雇员信息,好,那么我干脆就把这个呢,直接写在哪里呢?写在这一个employee employee这个结构体上给他绑定,那我写一个方法啊,就。Bank,然后呢,This新employee,然后我们这就想叫show me显示自己,那显示自己的时候呢,我们干脆把这个啊,把这个信息给他,给他写一下啊,那我就这样写了。好,那么怎怎么做这个事情呢?好,那就这样输出,谢谢。说表号为链表,先把链表的编号想出来,链表我们看以前是怎么输出的,保证一致吧。链表多少多少,有一个雇员多少。啊,这个。
11:00
啊,发现发现找到啊,找到找到该该雇员,找到该雇员啊ID是多少,把它输出来就可以了。那么它是哪一个链表的呢?它是哪一个链表的呢?就是这个时候呢,咱们就就简单一点啊,直接用他的ID磨一下漆就可以了,如果你要做的稍微复杂一点的话,你还可以去想办法调用到它的这个哈希,因为大家看这里面它不是有个哈希函数吗。他这有个哈希函数,那么如果你这个你这个散列的方法比较复杂,那你还没办法简单去磨,就是你还得想办法去找到这个哈希里面的一个方法,让它返回来,这个也可以啊,那因为我这已经有一个全局变量了,其实也是可以用它的。啊,我们看看这样用行不行啊。因为我在上面用这个,那简简单一点吧,我就直接这样这样做一下就行了啊叫this,点它有一个ID。
12:02
啊,然后呢,我们磨一下漆。这个就是就是他的链表号,然后雇员的ID号呢,就是Z实体ID。好,然后我们换一行。换一行好,这个时候我怎么调他呢?很简单,我回到这边来。我回到这边来,然后我这样做啊。啊,这个地方有问题啊,这方怎么会输出这个东西啊,这这有问题怎么写到这来了。先把ID拿到我们这应该是调查的方法才对,怎么写成这个了啊,Employee。走,然后呢,用哈希table。点刚才的那一个方法叫find。By ID,把这个ID传进去,对,这样就对了,然后呢,显示雇员信息,就employ,点什么呢,Show me。
13:02
好,自己显示自己就可以了,好,我们来玩一下,看看代码有没有问题啊,我们再把逻辑检查一下,输一个ID接收到,然后呢,调用find by ID,让这个has table调用这个find BYD,看它怎么走的find by ID先把这个呃链表是哪一条先计算出来,然后呢调用这条链表的find ID。它的翻y by ID怎么走的呢?往这走的先把头指针给一个current,然后呢,进行一个便利啊,如果它不等于空,并且满足ID相等,那么就说明找到了。那么如果没有找到,就判断当前这个Karen是不是等于near了?啊,如果等于零,说明就到到末尾了,那说明也没有就break break,就跳出一个for循环,跳出for循环就返回了一个near啊呃,如果说呃这两个条件都不满足的话呢,就往下面再探一步知道。要么满足这个条件,要么满足这个条件就退出去。
14:02
好,最后呢,我们拿到这个指针过后,我们调用它的收密方法显示该雇员的信息,我们来玩一下。好,我们来玩一下,看看这个能不能跑起来啊,我先退出。啊,这个退出没有写退出呢,用OS退出这个指令就行了。我这儿引一下包,把OS这个包引进去。好,走一下啊,同学们。好,现在呢,我们来把这个A处理一下啊,应该没有毛病了。我们来跑一下。退出,但现在还是没法退出,这样子。看一下。我们现在先来进行一个find的指令。现在呢,一个都找不到,我随便输什么都找不到,看看就是在链表为空的情况下有没有问题,因为这个呢是最容易报错的,就是它的临界值啊。特别容易报错,我随便输一个输十。
15:02
我们发现呢,他报告ID10的雇员是不存在的,这个应该是正确的,我们往里面添加一个input,好,我输一个雇员进去啊叭如说就输一个十吧,刚才不是找不到吗?我就输一个十,它的名字呢,就叫,比如说叫汤姆。好,这个就进去搜一下。在面表等于三的这个地方有一个固原,它是汤姆,变化为十。我们来找一下半。好,我输入这一个编号,ID等于十。飞车。我们发现他说在链表三找到了这个固原啊,这是正确的啊,说明没有毛病啊,如果说我再来往里面添加一个。好,Input,我输一个编号比较大的。啊,这么大的一个编号,比如说8712,然后呢,我输入他的一个名字叫Scott。好,我受一把。这个8712呢,它落在了第五条链表。
16:03
SC,那么我们来查找它,看看能不能找到,就是数字稍微大一点,看看有没有问题啊,好叫8712回车,我们把现在链表式找到这个雇员,这是正确的啊,正确的好,那么这个find的呢,我就说到这里。那呃,我留了一个作业让大家解决,这个删除。删除的话怎么删,大家要去想一想了,这个呢,做一个家庭作业,大家去先想一想啊,要去先想一想,好这个呢,我们先点评到这里。
我来说两句