0

我试图找到一种方法来通过链表存储指向内存块的 void 指针,我遇到了这种表示。

//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 指针的块中都没有写入数据?如果有人能阐明这个实现是如何工作的,那就太好了,它可以用作链表似乎非常深奥。

4

2 回答 2

2

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

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

不是最灵活的列表设计。

于 2013-10-30T04:52:52.367 回答
2

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

add_pointer()函数将一个新节点添加到列表的开头。void *p参数指向要添加的新节点。该函数将void *p 转换为 avoid **以便*(void **)p可以保存一个void *指针。该函数将前一个头指针存储在此位置

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

然后它设置listvoid *新的第一个元素,即 p。

现在该remove_pointer()函数从列表中删除一个节点,将void *指向它的 a 作为参数。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
于 2013-10-30T05:21:32.450 回答