2013-10-30 44 views
0

我试图找到一种方法来存储通过链接列表的内存块的空指针,我碰到这种表示。奇数链接列表表示

//Initalization 

void * list; 

//Add void pointer 

void add_pointer(void * p) { 
    *(void **)p = list; 
    list = p; 
} 

//Remove pointer with address 

void remove_pointer(void * p) { 
    void ** iter; 
    iter = &list; 

    while ((*iter != NULL) && (*iter != p)) { 
    iter = (void **)*iter; 
    } 

    if (*iter == p) { 
    *iter = *(void **)p; 
    } 
} 

这甚至是如何工作的?下一个块的地址是否存储在void指针指向的前一个块的数据中?假定列表初始化为NULL。

另外,这是否假设每个void指针的块都没有写入数据?如果有人能够阐明这种实现的工作原理,那很好,但它可以作为一个链表来使用。

回答

2

它假定节点中的第一个字段是链接指针的槽,它是一个void *list是一个void *它总是指向链表的头部。

add_pointer()函数将新节点添加到列表的开头。参数void *p指向要添加的新节点。该函数将void * p转换为void **,以便*(void **)p可以容纳void *指针。功能存储在该位置的先前头指针作为

*(void **)p = list; // list is a void * to the first element 

然后,它设置listvoid *到新的第一元件,即,第

现在,remove_pointer()函数从列表中删除一个节点,并将其作为参数void *指向它。 iter用于迭代列表。它最初分配的地址为list,因此*iter将给出链接指针,该链接指针始终假定为该节点中的第一个字段。 while循环将iter更新为列表中的下一个节点,直到找到当前节点的链接指针字段中的p(这是要删除的节点)。在这一点上,它更新提出的当前节点的指向由p指向该节点的链接指针字段值,这是由语句来完成的链接指针

*iter = *(void **)p; // *iter gives the link pointer filed of the current node 
        // p, is the node to be removed, *(void **)p gives the value in 
        // the link pointer filed of p 
+0

感谢您的答复。现在我更清楚了。无论void指针指向哪个值,该实现是否工作?或者在将值添加到列表之前将值清零,以便其值可用于指向下一个块的指针? – jab

+1

@jab:'add_pointer()'不关心链接中的内容 - 它所做的第一件事是用'list'中的指针覆盖链接'字段'。 –

+0

@MichaelBurr听起来不错,谢谢你的快速反应。 – jab

2

它只是假设节点的第一个字段是链接指针的槽。它将节点指针转换为(void**),以便它可以在该地址存储void*

而且,当然,list是指向链表上第一个节点的指针的硬编码位置。

不是最灵活的列表设计。