代码之家  ›  专栏  ›  技术社区  ›  knownasilya

链表分配运算符

  •  0
  • knownasilya  · 技术社区  · 14 年前

    我想知道,对于使用当前节点(没有前节点或后节点)的双重链接列表,赋值操作符后面是否有一般的概念。这是我的伪代码。我需要把这个概念弄清楚。如果有人能帮忙,那就太好了。

    Loop to start
        temp = temp->back
    loop to count
        if 0
            receiver->back = null
            receiver->entry = temp->entry
            receiver->next = temp->next
        if > 0
            receiver->back = temp->back
            receiver->entry = temp->entry
            receiver->next = temp->next
        if == count-1
            receiver->back = temp->back
            receiver->entry = temp->entry
            receiver->next = null
    

    这是我的节点结构:

    struct Node {
        // data members
        Node_entry entry;
        Node<Node_entry> *next;
        Node<Node_entry> *back;
        // constructors
        Node();
        Node(Node_entry, Node<Node_entry> *link_back = nullptr, 
            Node<Node_entry> *link_next = nullptr);
    
    }
    

    我不是在寻找代码答案,而是一个算法(实际上,注释和编写良好的代码就是一个很好的例子)。我只需要了解复印的工作原理。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Roger Pate    14 年前
    struct Node {
      Node *prev, *next;
      int entry;
    
      explicit Node(int entry) : prev (0), next (0), entry (entry) {}
    };
    
    Node* copy_list(Node *node) {
      assert(node);  // require a non-null pointer
    
      // copy "current" node
      Node *new_list = new Node(node->entry);
    
      // copy backward from node to beginning
      Node *dest = new_list;
      for (Node *x = node->prev; x; x = x->prev) {
        dest->prev = new Node(x->entry);
        dest->prev->next = dest;
        dest = dest->prev;
      }
    
      // copy forward from node to end
      dest = new_list;
      for (Node *x = node->next; x; x = x->next) {
        dest->next = new Node(x->entry);
        dest->next->prev = dest;
        dest = dest->next;
      }
    
      return new_list;
    }