最近一直在做malloc project。 前两篇malloc project的简单介绍已经说明完成这个malloc真的要动用很多知识。我和我partner rho 同学第一个任务就是把free memory block的organization变成 doubly linked list。 于是我想在此用一篇文章介绍一下 doubly linked list。
先来看一下我们lab时候给的code。 这个是doubly linked list一个node。 我们可以看到在这个struct里面,有一个指向下一个node的pointer,
struct word_data { const char *word; unsigned int count; struct word_data *next; struct word_data *prev; };
上图就是这个doubly linked list。我们现在的任务是把一个新的node insert到这个list里面。比如说我们想把这个新的node加入到dummy head和它右边的这个node之间。我们先把这个右边node的prev变成这个新的node,然后把这个新的node的next变成右边这个node。这样我们的任务就完成了一半。另一半的任务就是把这个新的node的prev变成dummy head,然后把dummy head的next变成这个node。这样的话我们insert的任务就完成了。
这个empty doubly linked list挺有意思。因为这个dummy header的prev和next都是它自己。如果你想加入第一个node怎么办呢。先把这个dummy head的prev变成这个新的node,然后把这个新的node的next变成dummy head。然后把这个dummy head的next变成这个node,把这个node的prev变成dummy head。其实两个顺序反过来也是可以的。
现在来说说如何从一个doubly linked list里面把一个node删掉。如果我想删掉dummy haed之后的那个node。我先把dummy head的next变成要删的那个node之后的node,然后把要删的node之后的node的prev变成dummy head。
要是想从一个node的doubly linked list里面把那个node删掉也很简单。就是把dummy head的next和prev都point到它自己就好了。
其实就算对doubly linked list小小的介绍吧。在这个malloc中会用到doubly linked list连接free block以加快搜寻fit free block的速度。