【问题标题】:Odd Linked List Representation奇数链表表示
【发布时间】:2013-11-09 13:00:32
【问题描述】:

我试图找到一种方法来通过链表存储指向内存块的 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 指针的块中都没有写入数据?如果有人能阐明这个实现是如何工作的,那就太好了,它可以用作链表似乎非常深奥。

【问题讨论】:

    标签: c++ c memory linked-list


    【解决方案1】:

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

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

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

    然后它将list 设置为void * 到新的第一个元素,即p。

    现在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
    

    【讨论】:

    • 感谢您的回复。我现在更清楚了。无论 void 指针指向的值如何,这个实现是否都可以工作,或者在将它添加到列表之前需要将值清零,以便它的值可以用作指向下一个块的指针?
    • @jab: add_pointer() 不关心链接中的内容 - 它所做的第一件事是用 list 中的指针覆盖链接“字段”。
    【解决方案2】:

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

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

    不是最灵活的列表设计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2019-01-03
      相关资源
      最近更新 更多